본문 바로가기
Programming/Web

[WEB] HTTP Method GET / POST의 차이

by prinha 2020. 7. 23.
반응형

 

"GET은 가져오는 것이고 POST는 수행하는 것이다."

사용자가 어떠한 홈페이지로 이동하기 위해 URL을 브라우저 주소창에 작성하고 엔터를 누르면 원하는 페이지로 이동

-> 사용자는 단순이 URL을 입력했을 뿐이지만 서버 내부에서는 클라이언트의 요청에 응답하기 위해 여러가지 처리를 해줘야함

-> HTTP프로토콜을 이용해서 클라이언트가 서버로 요청을 보내는 방법이 GET방식과 POST방식이다.

 


 

1.  GET 방식  - 어떠한 정보를 가져와 조회하기 위해서 사용하는 방식

 - URL에 변수(데이터)를 포함시켜 요청한다.

 - 데이터를 Header(헤더)에 포함하여 전송한다.

 - URL에 데이터가 노출되어 보안에 취약하다.

 - 전송하는 길이에 제한이 있다.

 - 캐싱(Caching, 한번 접근 후 또 요청할 시에 빠르게 접근하기위해 레지스터에 데이터를 저장시켜 놓는 것)할 수 있다.

 

 

GET방식은 간단한 데이터를 URL에 넣도록 설계된 방식으로 데이터를 보내는 양에 한계가 있다.

URL의 길이가 정해져있기 때문에, 많은 양의 정보를 전달할 수 없으며,

URL형식에 맞지않는 파라미터 이름이나 값은 인코딩되어 전달해야한다. 만약 전송 길이가 너무 긴 경우, 초과데이터는 절단된다.

 

특별히 전송하는 데이터가 없으므로 GET방식에서 보통 바디는 빈 상태로 전송이 되며,

헤더의 내용 중 Body의 데이터를 설명하는 Content-type 헤더필드도 들어가지 않는다.

 

예를 들어 어떤 페이지에 로그인을 하기 위해 id와 pw를 입력하고 엔터를 눌렀다.

요청을 GET방식으로 전송하는 경우에 www.prinha.com/login?id=hi&pw=hello  와 같은 페이지가 있다고 가정한다.

GET방식은 ?마크를 통해 URL의 끝을 알리고, id와 pw라는 key에 대해서 각각의 값(value)을 전송한다.

여러개의 key와 value를 보내는 경우에 &을 사용하여 이어주는 GET방식은 최소한의 보안유지도 하지않기때문에

실제 웹사이트에 ID와 PW같은 중요한 정보를 GET방식으로 전송하면 개인정보가 노출되는 문제가 발생한다.

GET방식을 사용하여 데이터를 노출시키는 경우는 개인정보가 포함되지않는 상황에서

캐싱을 하여 속도를 높이거나 즐겨찾기를 편리하기위해 사용되는 경우가 많다.

 

 

GET방식 예제)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>parameter01.jsp 파리미터값 입력 페이지</title>
</head>
<body>
    <!-- get 방식을 사용해서 데이터 전송 (method="get") -->
    <form action="parameter02.jsp" method="get">
        이름 : <input type="text" name="name" size="10"><br>
        주소 : <input type="text" name="address" size="30"><br>
        취미 :
            <input type="checkbox" name="hobby" value="game">게임
            <input type="checkbox" name="hobby" value="travel">여행
            <input type="checkbox" name="hobby" value="reading">독서
            <br>
        <input type="submit" value="전송">
    </form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    // 인코딩
    request.setCharacterEncoding("UTF-8");
%>
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>parameter02.jsp 파리미터값 출력 페이지</title>
</head>
<body>
    이름 : <%= request.getParameter("name") %><br>
    주소 : <%= request.getParameter("address") %><br>
    취미 : 
    <%
        // 체크박스는 배열로 처리해야 한다.
        String[] values = request.getParameterValues("hobby");
        if(values != null){
            for(int i=0; i<values.length; i++){        
    %>
        <%=values[i] %>
    <%                        
            }
        }
    %>
</body>
</html>

 

출처:https://all-record.tistory.com/100

 

  


2.  POST 방식  - 데이터를 서버로 제출하여 추가 or 수정하기 위해 사용하는 방식

 - URL에 변수(데이터)를 노출하지않고 요청한다.

 - 데이터를 Body에 포함시킨다.

 - URL에 데이터가 노출되지않아서 기본 보안이 되어있다.

 - 전송하는 길이에 제한이 없다.

 - 캐싱할 수 없다.

 

 

GET방식은 URL에 데이터를 붙여서 전송하는 반면 POST방식은 BODY에 데이터를 넣어서 전송한다.

따라서 헤더필드 중 Body의 데이터를 설명하는 Content-Type이라는 헤더필드가 들어가고 어떠한 타입인지 명시해줘야한다.

 

데이터를 Body에 포함시키는 이점때문에 메세지 길이의 제한은 없지만 최대 요청을 받는 시간인 Time Out이 존재하므로

클라이언트 페이지를 요청하고 기다리는 시간이 존재한다.

 

실제 POST방식은 URL에 데이터가 노출되지않으므로 즐겨찾기나 캐싱이 불가능하지만

쿼리스트링(문자열)데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스와 같은 객체들의 값도 전송이 가능하다.

 

 

POST방식 예제)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>parameter01.jsp 파리미터값 입력 페이지</title>
</head>
<body>
    <!-- post 방식을 사용해서 데이터 전송 (method="post") -->
    <form action="parameter02.jsp" method="post">
        이름 : <input type="text" name="name" size="10"><br>
        주소 : <input type="text" name="address" size="30"><br>
        취미 :
            <input type="checkbox" name="hobby" value="game">게임
            <input type="checkbox" name="hobby" value="travel">여행
            <input type="checkbox" name="hobby" value="reading">독서
            <br>
        <input type="submit" value="전송">
    </form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
    // 인코딩
    request.setCharacterEncoding("UTF-8");
%>
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>parameter02.jsp 파리미터값 출력 페이지</title>
</head>
<body>
 
    이름 : <%= request.getParameter("name") %><br>
    주소 : <%= request.getParameter("address") %><br>
    취미 : 
    <%
        // 체크박스는 배열로 처리해야 한다.
        String[] values = request.getParameterValues("hobby");
        if(values != null){
            for(int i=0; i<values.length; i++){        
    %>
        <%=values[i] %>
    <%                        
            }
        }
    %>
</body>
</html>

 

출처:https://all-record.tistory.com/100


 

GET은 어떤 값이나 내용, 상태 등을 바꾸지않는 경우에 서버에서 데이터를 가져와서 보여줄때 사용한다.

-> 글 목록 조회, 각각의 글조회

 

POST는 서버상의 데이터 값이나 상태를 바꾸기 위해 사용한다.

-> 글쓰기, 글수정

 

GET

POST

History

Parameters remain in browser history because they are part of the URL.

파라미터들은 URL의 일부분이기 때문에 브라우저 히스토리에 남는다.

 

Parameters are not saved in browser history.

파라미터들이 브라우저 히스토리에 저장되지 않는다.

Bookmarked

Can be bookmarked.

요청 파라미터들이 URL로 인코딩되므로 즐겨찾기가 가능하다.

Can not be bookmarked.

요청 파라미터들이 request body에 포함되고 request URL에 나타나지 않으므로 즐겨찾기가 불가능하다.

button/re-submit behaviour

GET requests are re-executed but may not be re-submitted to server if the HTML is stored in the browser cache.

GET 요청이 다시 실행되더라도 브라우저 캐시에 HTML이 저장되어있다면 서버에 다시 submit되지 않는다.

 

The browser usually alerts the user that data will need to be re-submitted.

브라우저가 보통 사용자에게 데이터가 다시 submit되어야 한다고 alert을 준다.

Encoding type(enctype attribute) application/x-www-form-urlencoded multipart/form-data or application/x-www-form-urlencoded Use multipart encoding for binary data.
Parameters

can send but the parameter data is limited to what we can stuff into the request line (URL). Safest to use less than 2K of parameters, some servers handle up to 64K

전송 가능하지만 URL에 넣을 수 있는 파라미터 데이터가 제한된다. 2K이하로 사용하는 것이 안전하며 몇몇 서버들은 64K까지 다룬다.

 

Can send parameters, including uploading files, to the server.

서버에 파일 업로드하는 것을 포함하여 파라미터를 전송할 수 있다.

Hacked

Easier to hack for script kiddies

script kiddies에 의해 해킹되기 쉽다.

 

More difficult to hack

GET에 비해 좀 더 해킹하기 어렵다.

Restrictions on form data type

Yes, only ASCII characters allowed.

오직 ASCII characters만 허용된다.

 

No restrictions. Binary data is also allowed.

제한이 없다. binary data도 허용된다.

Security

GET is less secure compared to POST because data sent is part of the URL. So it's saved in browser history and server logs in plaintext.

GET은 POST에 비해 보안에 약하다. 그 이유는 데이터가 URL의 일부로 전송되고 그 때문에 브라우저 히스토리에 저장되며 서버가 플레인 텍스트로 로그를 남기기 때문이다.

 

POST is a little safer than GET because the parameters are not stored in browser history or in web server logs.

POST는 GET에 비해 보안에 조금 더 안전하다. 그 이유는 파라미터들이 브라우저 히스토리나 서버 로그에 저장되지 않기 때문이다.

Restrictions on form data length

Yes, since form data is in the URL and URL length is restricted. A safe URL length limit is often 2048 characters but varies by browser and web server.

form data가 URL에 포함되고 URL 길이가 제한되기 때문에 form data의 길이도 제한된다. 안전한 URL 길이는 2048 characters이나 브라우저나 웹 서버에 따라 달라진다.

No restrictions

제한이 없다.

Usability

GET method should not be used when sending passwords or other sensitive information.

GET 메소드는 비밀번호와 같은 민감한 정보들을 전송하는데 사용해선 안된다.

 

POST method used when sending passwords or other sensitive information.

POST 메소드는 비밀번호와 같은 민감한 정보를 전송하는데 사용된다.

Visibility

GET method is visible to everyone (it will be displayed in the browser's address bar) and has limits on the amount of information to send.

GET 메소드는 모두에게 보여진다. (브라우저의 주소창에 그대로 보여지고 그에 따라 전송가능한 정보의 양도 제한된다.)

 

POST method variables are not displayed in the URL.

POST 메소드는 URL에 보여지지 않는다.

Cached

Can be cached

GET은 idempotent하기 때문에 캐시가 된다.

(같은 요청을 여러 번 보내도 항상 같은 응답이 온다.)

Not cached

POST는 idempotent하지 않기 때문에 캐시가 되지 않는다.

(같은 요청을 여러 번 보내도 다른 응답이 올 수 있다.)


출처: https://im-developer.tistory.com/166 [Code Playground]

출처:https://mangkyu.tistory.com/17

 

 

 

 

 

반응형