GET 요청 방식에 대해서는 지난 글에서 다뤘습니다.
참고해주세요.
2020/07/07 - [웹 개발] - [servlet] GET 요청 처리하기
POST 요청을 왜 사용하는가?
오늘은 POST 방식에 대해서 알아보려고 합니다.
GET 방식에서는 우리가 요청 내용을 URL에 담아서 전송했습니다.
만약에 ID와 비밀번호를 해당 방식으로 보낸다면 어떤 위험이 존재할까요?
당신은 학교 공용 컴퓨터에서 Gmail을 확인할 일이 생겼습니다. 급하게 사용하고 로그아웃을 하며 안전하다고 생각합니다. 그러나 방문 기록에 URL이 다 남아버렸네요. URL에는 우리의 ID와 비밀번호가 다 담겨있었습니다. 해당 사실을 아는 사람이 구글 플레이스토어에서 당신 구글 계정에 등록이 된 카드로 과금을 해버린다면...!!
위는 상상의 시나리오이기에 실제랑은 많이 다를겁니다.
어쩌면...?? 가능할지도 모른다는 얘기이지요.
또한 URL이 그렇게 긴 내용을 담지 못해요.
긴 글, 사진, 동영상 등은 POST 요청 방식을 이용해야합니다.
POST 요청 활용 방법
HTML 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<form action="notice" method="post">
<div>
<label>제목:</label><input name="title" type="text">
</div>
<div>
<label>내용:</label>
<textarea name="content"></textarea>
</div>
<div>
<input type="submit" value= "등록"/>
</div>
</div>
</body>
</html>
|
cs |
이번에는 내용을 받기 위해서 textarea를 사용했습니다.
그 외에 달라진 점은 form method="post" 부분이 있겠네요.
notice로 post 요청을 하고 있으니 notice를 구현해볼까요?
Servlet 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
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("/notice")
public class Notice extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = request.getParameter("title");
String content = request.getParameter("content");
out.println(title);
out.println(content);
}
}
|
cs |
title과 content의 내용을 바로 출력하도록 작성했습니다.
실행 결과
HTML form에 따라 text를 입력할 수 있게 되었네요.
내용을 입력하고 등록 버튼을 눌러줍시다.
그러면 이렇게 내용들이 출력이 되고 URL에는 쿼리 스트링이 붙지 않았습니다.
그렇다면 어떻게 전달이 될까?
GET은 URL에 담아서 전송한다..
그러면 POST는 대체 어떤 방식으로 전달하는 걸까?
의문이 들지 않으시나요?
POST를 이해하기 위해서는 HTTP 프로토콜의 이해가 필요합니다.
자세한 내용은 아래 링크를 걸어두겠습니다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Messages
HTTP는 헤더와 바디로 구성되어있다는 점이 중요합니다.
개발자 도구로 확인해보자
F12 를 눌러서 개발자 도구를 켜줍시다.
NetWork 탭에 진입하고 등록 버튼을 누르면 이와 같이 네트워크 요청 응답 내역을 볼 수 있어요.
문서 - Headers에 보면 맨 밑에 저희가 원하는 값이 나옵니다.
이걸 보고 오해하시면 안되는데 바디에 들어가는 겁니다.
결론은 HTTP 요청 덩어리에 함께 포함된다고 보시면 됩니다.
추가
제가 GET 요청을 언급하며 URL에 바로 보이니까 보안에는 좋지 않다고 했습니다.
그렇다면 모든 데이터를 POST 방식으로만 바꾸면 보안성이 높아질까요???
그렇지 않습니다.
방금도 개발자 도구로 간단하게 우리가 어떤 데이터를 보냈는지 바로 확인 가능했습니다.
실질적인 방안은 따로 암호화를 하는 방식이 가장 적절합니다.
'web' 카테고리의 다른 글
동기(Synchronous) vs 비동기(Asynchronous) (0) | 2021.03.03 |
---|---|
Cookie & Session (0) | 2020.07.29 |
[Web] POST 요청 시 한글 깨짐 현상 (0) | 2020.07.19 |
Web(웹)이란? (0) | 2020.06.04 |
웹 백엔드(Backend)란? (0) | 2020.05.30 |