상세 컨텐츠

본문 제목

[JSP] Get, Post 요청 방식에 이해

JAVA/JSP 프로그래밍

by 미로910 2024. 7. 2. 16:35

본문

사전 기반 지식

1. HTTP 메세지

클라이언트에서 요청을 하면 HTTP 메세지가 만들어 진다.

2. URI 와 URL

URI와 URL은 주소 방식은 인터넷 세상에서 리소스를 식별하고 접근하기 위한 개념이다.

 

URI (Uniform Resource Identifier)

URI는 인터넷에서 리소스를 식별하기 위한 문자열이다.

URI는 특정 리소스를 고유하게 식별하며, 리소스의 위치와 상관없이 해당 리소스를 지칭할 수 있다.

// 리소스의 이름만 나타냄
domainname.com/my-info
urn:isbn:0451450523 // URN 예제
http://www.domainname.com/my-info // URL 예제 (URL은 URI의 한 형태)

 

URL (Uniform Resource Locator)

URL은 리소스의 위치를 나타내는 URI의 한 형태이다.(URL은 일종의 URI이다.).

URL은 리소스가 어디에 있는지를 나타내며, 그 리소스에 접근하기 위한 방법(프로토콜)을 포함한다.

http://www.domainname.com/folder-name/index.html  //특정 파일을 가리키는 URL

URL(Uniform Resource Locator)이라는 용어는 리소스의 위치를 식별하는 데 사용되지만, 반드시 파일 확장자나 특정 리소스를 가리키는 것만을 의미하지는 않는다. URL은 웹 상의 모든 리소스를 식별하는 데 사용될 수 있으며, 이는 특정 파일일 수도 있고, 데이터베이스 쿼리의 결과일 수도 있다.

http://www.domainname.com/my-info  //특정 파일이 아닐 수도 있음

 ▶ 즉, 위 주소의 형태는URL입니다. 이름과 더불어, 어떻게 도달할 수 있는지 위치까지 함께 나타내기 때문입니다. 즉, 프로토콜 http: … , https:… 등을 포함 하고 있다.

즉, URI가 더 포괄적인 개념이며 URL은 이 안에 포함된다.

 

URI= 식별자, URL=식별자+위치

모든 URL은 URI이지만, 모든 URI가 URL은 아니다.
URL은 리소스의 위치와 접근 방법을 포함하여 리소스를 식별하는 URI의 한 형태이다.

프로토콜(protocol)이란, 리소스에 접근하는 방법을 지정하는 방식이다. 일반적으로 https, http, ftp 또는 file 등이 여기에 해당할 수 있다.

 

Query String 이란?

쿼리 스트링은 URL의 일부로, URL에서 리소스 경로 뒤에 추가로 전달되는 매개변수들을 나타낸다.

쿼리 스트링은 '?' 문자 뒤에 위치하며, 여러 개의 매개변수는 '&' 문자로 구분된다.

http://www.example.com/search?query=java&sort=asc&page=2

기본 URL - http://www.example.com/search

쿼리 스트링: ?query=java&sort=asc&page=2

  • query=java : 검색어 매개변수
  • sort=asc : 정렬 순서 매개변수
  • page=2 : 페이지 번호 매개변수

 

Path Variable 이란?

Path Variable은 URL 경로의 일부로 포함된 매개변수이다.

리소스의 특정 식별자나 속성을 URL 경로에 직접 포함시켜 RESTful API에서 자주 사용된다.

http://www.example.com/users/123/orders/456

쿼리 스트링 방식과 Path Variable 비교

  • 쿼리 스트링:
    • 매개변수는 '?' 뒤에 '&'로 구분된다.
    • 일반적으로 필터링, 검색, 페이징 등에 사용된다.
    • 예: http://www.example.com/search?query=java&sort=asc
  • Path Variable:
    • 매개변수는 URL 경로의 일부로 포함된다.
    • 리소스의 식별자나 속성을 명확히 나타낸다.
    • RESTful API 설계에서 자주 사용된다.
    • 예: http://www.example.com/users/123/orders/456

 

1. Get 요청 방식에 이해

  • GET 요청은 클라이언트가 서버로부터 특정 자원을 요청할 때 사용하는 HTTP 메서드이다. 주로 웹 페이지나 데이터 등을 가져올 때 사용된다.
  • Get 방식은 HTTP 요청 메세지 구성에 바디가 존재 하지 않는다.

GET 방식의 특징

  • 요청 데이터가 URL에 포함됨: GET 요청의 파라미터는 URL의 쿼리 스트링에 포함된다.

예를 들어, http://example.com/page?name=John&age=30에서 name=Johnage=30이 쿼리 스트링이다.

  • 데이터의 크기 제한: URL에 포함되는 데이터의 크기에는 제한이 있다(일반적으로 약 2048자).
  • 캐싱 가능: GET 요청은 브라우저 캐싱이 가능하여, 동일한 요청에 대해 서버에 재요청하지 않고 캐시된 데이터를 사용할 수 있다.
  • 보안에 취약: URL에 데이터가 노출되기 때문에 민감한 정보 전달에는 부적합하다.

2. Post 요청 방식에 이해

POST 방식은 주로 데이터를 서버에 전송하거나 서버에서 데이터 처리를 요청할 때 사용된다. 즉, POST 요청은 클라이언트가 서버로 데이터를 전송할 때 사용하는 HTTP 메서드이다. 주로 폼 데이터를 서버로 제출하거나 파일 업로드와 같은 작업에 사용된다

POST 방식의 특징

  • 요청 데이터가 본문에 포함됨: GET 요청과 달리, POST 요청의 데이터는 HTTP 메시지의 본문(Body)에 포함되어 전송된다.
  • 데이터 크기 제한 없음: 본문에 포함된 데이터는 크기에 제한이 거의 없기 때문에 대용량 데이터를 전송할 수 있다.
  • 캐싱 불가: POST 요청은 일반적으로 캐싱되지 않습니다. 즉, 매번 서버에 요청이 전송된다.
  • 보안에 유리: 데이터가 URL에 노출되지 않기 때문에 GET 요청보다 상대적으로 안전하지만, HTTPS를 사용하지 않는 한 절대적인 보안을 보장하지는 않는다.

 

시나리오 코드 1

주소창에 구글웹스토어 검색 (이동) → talend api 검색 - 설치

package com.tenco.controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

// http://localhost:8080/req-test
@WebServlet("/req-test")
public class RequestTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public RequestTest() {
        super();
    }

    // http://localhost:8080/req-test?name="홍길동"
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// METHOD <--- GET 방식일 때 
		// 요청을 받고 응답시에 MIME TYPE -> text/html 
		response.setContentType("text/html; charset=UTF-8");
		
		String name = request.getParameter("name");
		String greeting = "Hello," + (name != null ? name : "바보"  ) + " !! ";	
		
		
		response.getWriter().print("<html><body> <h2> "+ greeting +" </h2> </body></html>");
		
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	}

}

💡 컨텍스트 루트(Context Root)란?

웹 애플리케이션이 URL을 통해 접근될 때 사용되는 기본 경로이다. 웹 애플리케이션이 웹 서버나 애플리케이션 서버에 배포될 때, 서버는 각 애플리케이션에 대해 고유한 컨텍스트 루트를 할당한다. 이를 통해 여러 애플리케이션이 동일한 서버에서 여러 애플리케이션을 동시에 실행시킬 수 도 있다.

URL의 구성

http://<서버 주소>:<포트>/<컨텍스트 루트>/<서블릿 경로>

 

컨텍스트 루트(Context Root)는 server.xml 파일에서 설정할 수 있다.

server.xml 파일은 Apache Tomcat의 주요 설정 파일로, 서버의 구성 요소와 동작 방식을 정의한다.

이 파일을 통해 Tomcat 서버의 다양한 설정을 구성할 수 있다.

// 주소창에서 한글이 있는 URL 복사하면 why? 
http://localhost:8080/myapp/req-test?name=%ED%99%8D%EA%B8%B8%EB%8F%99&email=a@naver.com
// 복사후 URL 인코딩 처리 된다.

URL 인코딩이란

  • URL은 ASCII 문자만을 안전하게 포함할 수 있다. ASCII 코드로 표현되지 않는 문자(예: 한글), 공백, 특수 문자 등은 URL에서 문제를 일으킬 수 있다.
  • 따라서 비 ASCII 즉, 문자나 특수 문자는 URL 인코딩(퍼센트 인코딩)되어야 한다.
  • URL 인코딩은 해당 문자를 % 기호와 두 자리 16진수로 변환한다. 예를 들어, 한글 '홍길동'은 UTF-8 바이트 시퀀스로 변환된 후 각 바이트가 퍼센트 인코딩된다:
    • 홍길동의 UTF-8 인코딩: ED 99 8D EA B8 B8 EB 8F 99
    • URL 인코딩: %ED%99%8D%EA%B8%B8%EB%8F%99

관련글 더보기