본문 바로가기
Java

Get, Post 요청 방식 이해하기

by 개발자공부 2024. 7. 1.

GET 요청 방식 이해하기

GET 요청은 클라이언트가 서버로부터 특정 자원을 요청할 때 사용하는 HTTP메서드이다. 주로 웹 페이지나 데이터 등을 가져올 때 사용된다.

GET 방식은 HTTP 요청 메세지 구성에 바디가 존재하지 않는다.

 

GET 방식 특징

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

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

● 데이터 크기 제한 : URL에 포함되는 데이터의 크기에는 제한이 있다. (일반적으로 약 2048자)

● 캐싱 가능 : GET 요청은 브라우저 캐싱이 가능하여, 동일한 요청에 대해 서버에 재요청하지 않고 캐시된 데이터를 사용할 수 있다.

● 보안에 취약 : URL에 데이터가 노출되기 때문에 민감한 정보 전달에는 부적합하다.


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/gp/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");

		// HTTP 요청 메세지에 시작줄에 /req-test?name="홍길동" <-- 이렇게 보낼 것이라 예상중
		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 {
		response.setContentType("text/html");

		// 만약 데이터베이스 연동까지 한다면
		// 요청을 받아서 (인증검사, 요청값 유효성 검사)를 먼저 실시해야 한다.

		// HTTP 요청 바디에서 데이터를 추출
		String name = request.getParameter("name");
		String email = request.getParameter("email");

		// 보통 DB에 접근해서 CRUD 작업
		response.getWriter().write("<html>");
		response.getWriter().write("<head>");
		response.getWriter().write("</head>");
		response.getWriter().write("<body>");
		response.getWriter().write("<h1>");
		response.getWriter().write("<p>");
		response.getWriter().write("name : " + name);
		response.getWriter().write("</br>");
		response.getWriter().write("email : " + email);
		response.getWriter().write("</p>");
		response.getWriter().write("</h1>");
		response.getWriter().write("</body>");
		response.getWriter().write("</html>");
		
		// URL 인코딩 처리
		// http://localhost:8080/gp/req-test?name=%22%ED%99%8D%EA%B8%B8%EB%8F%99%22
	}

}

 

출력결과

+) GET 방식은 URL의 쿼리 문자열로 전송되기 때문에 폼을 사용하지 않아도 파라미터를 전송할 수 있다. 


컨텍스트 루트(Context Root)

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

 server.xml 파일에서 설정할 수 있다. server.xml 파일은 Apache Tomcat의 주요 설정 파일로 서버의 구성 요소와 동작 방식을 정의한다. 이 파일을 통해 Tomcat 서버의 다양한 설정을 구성할 수 있다.

 

URL 구성

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

 

 

URL 인코딩

URL은 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
크롬 웹 브라우저
인코딩
홍길동 -> %22%ED%99%8D%EA%B8%B8%EB%8F%99%22

웹 서버(WAS)
디코딩
%22%ED%99%8D%EA%B8%B8%EB%8F%99%22 -> 홍길동