[개발지식] GET vs POST

박예슬·2022년 6월 20일
0

GET이나 POST는 HTTP 메소드 중 제일 많이 쓰는 메소드들이다.
정확히 두 개가 어떻게 다른지, 어떤 특징을 가지고 있는지 정리해보려고 한다.

GET

GET 메소드는 지정된 리소스에서 데이터를 요청하는 메소드로, 주로 데이터를 읽거나(Read) 검색(Retrieve)할 때에 사용된다. 서버에 전달하고 싶은 데이터는 query를 통해서 전달한다. 메시지 바디를 사용해서 데이터를 전달할 수는 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.

// 쿼리 문자열(이름/값 쌍)은 GET 요청의 URL로 전송
/test/demo_form.php?name1=value1&name2=value2

# HTTP 메소드의 속성

HTTP 메소드의 속성에는 안전(Safe Methods), 멱등(Idempotent Methods), 캐시가능(Cacheable Methods)가 있다.
1. 안전(Safe Methods)
계속해서 메소드를 호출해도 리소스를 변경하지 않는다는 뜻으로, 주요 메소드중에는 GET 메소드가 안전하다고 볼 수 있다.
2. 멱등(Idempotent Methods)
메소드를 계속 호출해도 결과가 똑같다는 뜻으로, Get, PUT, DELETE는 멱등하다고 볼 수 있지만 POST나 PATCH는 멱등하다고 볼 수 없다.
3. 캐시가능(Cacheable Methods)
캐싱을 해서 데이터를 효율적으로 가져올 수 있다는 뜻

HTTP 명세에 의하면 GET 요청은 오로지 데이터를 읽을 때만 사용되고 수정할 때는 사용하지 않는다. 따라서 이런 이유로 사용하면 안전하다고 간주된다. 즉, 데이터의 변형의 위험없이 사용할 수 있다는 뜻이다. 게다가 GET 요청은 idempotent하다. 즉, 같은 요청을 여러 번 하더라도 변함없이 항상 같은 응답을 받을 수 있다. 그러므로 GET을 데이터를 변경하는 등의 안전하지 않은 연산에 사용하면 안된다.

POST

POST 메소드는 주로 새로운 리소스를 생성(create)할 때 사용되며, 메시지 바디를 통해 서버로 데이터를 전달한다.
POST 요청은 안전하지도 않고 idempotent하지도 않다. 다시 말해서 같은 POST 요청을 반복해서 했을 때 항상 같은 결과물이 나오는 것을 보장하지 않는다는 것이다. 그러므로 두 개의 같은 POST 요청을 보내면 같은 정보를 담은 두 개의 다른 resource를 반환할 가능성이 높다.

GET vs POST

GET 과 POST 요청의 차이는 data 전달 방식의 차이로부터 나타난다.
HTTP POST 요청은 클라이언트에서 서버로 전송할 때 추가적인 데이터를 body에 포함할 수 있다. 반면에 GET 요청은 모든 필요한 데이터를 URL에 포함하여 요청한다.
자세히 설명하면, GET 메소드를 사용하면 모든 form data는 URL로 인코딩되어 action URL에 query string parameters로 전달된다. POST 메소드를 사용하면 form data는 HTTP request의 message body에 나타날 것이다.

GETPOST
BACK button/Reload다시 실행되지만 HTML이 브라우저 캐시에 저장된 경우, 서버에 다시 제출되지 않을 수 있다데이터가 다시 제출된다(브라우저가 사용자에게 데이터가 다시 제출되려고 함을 경고해야 함)
Bookmarked요청 파라미터들이 URL로 인코딩되므로 즐겨찾기가 가능하다요청 파라미터들이 request body에 포함되고 request URL에 나타나지 않으므로 즐겨찾기가 불가능
CachedCan be cachedNot cached
Encoding typeapplication/x-www-form-urlencodedapplication/x-www-form-urlencoded or multipart/form-data. Use multipart encoding for binary data
History파라미터들은 URL의 일부분이기 때문에 브라우저 히스토리에 남는다파라미터들이 브라우저 히스토리에 저장되지 않는다
Restrictions on data lengthdata가 URL에 포함되고 URL 길이가 제한되기 때문에 data의 길이도 제한된다. 안전한 URL 길이는 최대 2048 characters이나 브라우저나 웹 서버에 따라 달라진다제한이 없다
Restrictions on data type오직 ASCII characters만 허용된다제한이 없다. binary data도 허용
SecurityGET은 POST에 비해 보안에 약하다. (데이터가 URL의 일부로 전송되고 그 때문에 브라우저 히스토리에 저장되며 서버가 플레인 텍스트로 로그를 남기기 때문)POST는 GET에 비해 보안에 조금 더 안전하다. (파라미터들이 브라우저 히스토리나 서버 로그에 저장되지 않기 때문)
VisibilityGET 메소드는 브라우저의 주소창에 그대로 보여지기 때문에, 모든 사용자가 데이터를 볼 수 있다POST 메소드는 URL에 보여지지 않는다

참고
https://www.w3schools.com/tags/ref_httpmethods.asp

profile
공부중인 개발자

0개의 댓글