관리 메뉴

거니의 velog

(13) 웹 브라우저에서 서블릿으로 데이터 전송하기 본문

Java_Servlet

(13) 웹 브라우저에서 서블릿으로 데이터 전송하기

Unlimited00 2023. 8. 24. 19:46

1. GET/POST 전송 방식

* 웹 브라우저에서 서블릿으로 전송하는 방법은 크게 GET 방식과 POST 방식이 있다. 이전에 작성한 환율 계산기 결과 화면을 다시 보면?

* 주소창을 자세히 보면 물음표(?) 뒤에 입력된 값,  외화 종류 그리고 요청을 나타내는 문자열이 서블릿 매핑 이름 뒤에 붙어서 전송된다. 이렇게 URL 주소에 데이터를 붙여서 전송하는 방식을 GET 방식이라고 한다. 그런데 로그인 창에서 입력한 ID와 비밀번호를 이런 식으로 보이게 전송하면 개인 정보가 유출될 가능성이 높다. 이처럼 GET 방식으로 데이터를 전송할 경우에는 전송하는 데이터가 노출되므로 보안에 취약하다.
반면에 POST 방식은 전송하는 데이터를 숨겨서 전송하므로 보안성이 좋다.

* 즉, GET 방식은 보안과 관련 없는 간단한 데이터를 쉽게 전송할 수 있는 반면, POST 방식은 보안과 관련된 데이터를 전송하는 데 많이 사용된다고 기억해 두면 된다.

GET 방식 POST 방식
- 서블릿에 데이터를 전송할 때는 데이터가 URL 뒤에 name=value 형태로 전송된다.
- 여러 개의 데이터를 전송할 때는 '&'로 구분해서 전송된다.
- 보안이 취약하다.
- 전송할 수 있는 데이터는 최대 255자이다.
- 기본 전송 방식이고 사용이 쉽다.
- 웹 브라우저에서 직접 입력해서 전송할 수도 있다.
- 서블릿에서는 doGet()을 이용해 데이터를 처리한다.
- 서블릿에 데이터를 전송할 때는 TCP/IP 프로토콜 데이터의 HEAD 영역에 숨겨진 채 전송된다.
- 보안에 유리하다.
- 전송 데이터 용량이 무제한이다.
- 전송 시 서블릿에서는 또다시 가져오는 작업을 해야 하므로 처리 속도가 GET 방식보다 느리다.
- 서블릿에서는 doPost()를 이용해 데이터를 처리한다.

2. GET 방식으로 서블릿에 요청

* 로그인창 입력 예제를 보면 <form> 태그의 method 속성이 get으로 설정되어 있다. 이는 '서블릿에 GET 방식으로 데이터를 전송하겠다'는 의미이다.

마찬가지로 서블릿도 GET 방식으로 전송된 데이터를 doGet() 메서드를 이용해서 처리한다.

그리고 웹 브라우저의 주소 창을 보면 http://localhost:8090/pro06/login2?user_id=123123&user_pw=123123 처럼 URL 뒤에 'name=value' 쌍으로 붙어서 전송된다. 이처럼 GET 방식으로 전송하면 간편하다는 장점은 있으나 어떤 데이터를 전송하는지 다 노출되므로 보안상으로 좋지 않다.


3. POST 방식으로 서블릿에 요청

1. sec03.ex01 패키지를 만들고 LoginServlet3 클래스를 생성한다.

2. login.html은 앞에서 생성한 파일을 편집해서, <form> 태그의 속성 method를 post로, action을 login3으로 수정한다.

3. 다음과 같이 LoginServlet3 클래스를 작성한다. 서블릿에서는 반드시 doPost() 메서드를 이용해서 처리해야 한다.

package sec03.ex01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/login3")
public class LoginServlet3 extends HttpServlet {
	public void init() throws ServletException {
		System.out.println("init 메서드 호출");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디:" + user_id);
		System.out.println("비밀번호:" + user_pw);
	} // POST 방식으로 전송된 데이터를 처리하기 위해 doPost()를 이용한다.

	public void destroy() {
		System.out.println("destroy 메서드 호출");
	}
}

4. 웹 브라우저에서 로그인창을 요청한 후 ID와 비밀번호를 입력하고 로그인을 클릭한다.

- http://localhost:8090/pro06/login.html

5. 웹 브라우저에서 전송되는 데이터는 TCP/IP의 헤더에 숨겨진 채 전송되므로 브라우저의 주소창을 보면 URL 뒤에는 아무것도 표시되지 않는다.

* 이처럼 서블릿에서는 웹 브라우저에서 전송되는 방식에 따라 doGet()이나 doPost() 로 대응해서 처리해야 한다. 만약 전송 방식과 다른 메서드를 사용하면 브라우저에서 오류가 발생한다. 예를 들어 웹 브라우저에서는 GET 방식으로 전송하는데 서블릿에서는 doPost() 메서드로 처리하면 GET 방식으로 처리하는 메서드가 없으므로 오류가 발생한다.