본문 바로가기

네트워크

GET, POST 차이

차이점

결론부터 말하면, GET은 주로 리소스를 조회할때 사용하며 전송할 데이터를 쿼리스트링을 통해 전송하고 멱등이다.

POST는 주로 리소스를 생성할 때 사용하며 전송할 데이터를 HTTP 메시지의 Body에 담아 전송하고 멱등이 아니다.

 

 

GET, POST란?

HTTP Method 종류는 총 9가지이며 이 중에서 GET, POST는 자주 사용되는 메소드이다.

 

HTTP Method가 무엇인지 알려면 먼저 REST API에 대해서 알아야 한다.

간단하게 REST API는 HTTP URI로 리소스를 명시하고 HTTP Method를 이용해서 해당 리소스에 대한 CRUD Operation을 적용해서 클라이언트와 서버 사이의 요청과 응답을 처리하는 방식이다.

 

HTTP API와 REST API는 거의 유사한 의미로 사용되지만, HTTP는 넓은 의미로 사용되고 REST는 HTTP(웹)의 장점을 최대한 활용할 수 있는 아키텍처로 HTTP API에 제약조건이 추가되었다고 보면된다.

 

대표적인 메소드는 GET, POST, PUT, PATCH, DELETE가 있고 나머지는 HEAD, CONNECT, OPTIONS, TRACE가 있다.

 

GET은 클라이언트가 서버에 리소스를 요청하는 메소드이며 주로 조회할 때 사용한다.

POST는 요청한 리소스를 생성하기 위해 사용하는 메소드이여 주로 등록할 때 사용한다.

 

 

쿼리스트링(QueryString)이란?

URL 뒤에 전달하는 파라미터를 의미한다.

 

아래 예시와 같이 데이터가 노출되고 보안에 취약하기 때문에 중요한 정보를 사용할 때는 GET을 사용하면 안된다.

 

URL 길이가 제한되기 때문에 데이터 길이 제한이 있다.

또한 쿼리스트링에서 '/', '&', '=' 등의 문자를 값으로 사용할 때는 인코딩을 해서 요청해야 한다.

 

www.test.com/items?id=1&name=체리

 

 

HTTP Request Message Body

HTTP Request Message 구조는 Start Line, Headers, Body로 구성된다.

이 중에서 Body는 전송하는 리소스를 담고있는 부분을 말한다.

 

Get일 경우 Body가 없고, POST일 경우 Body가 존재한다. (Get의 경우 Body를 지원하는 브라우저도 있지만, 쿼리스트링을 사용하는 것이 좋을 것 같다.)

 

쿼리스트링보다 Body로 전송하는 것이 안전하다고 생각할 수 있지만 개발자 도구를 통해 확인할 수 있기 때문에 중요한 정보는 반드시 암호화하여 전송해야 한다.

 

POST는 요청 Header의 Content-Type에 요청 데이터의 타입을 표시해야 한다.

(application/x-www-form-urlencoded, multipart/form-data, application/json 등)

 

또한 Body는 길이 제한없이 데이터를 전송할 수 있다.

 

 

 

멱등(Idempotence)이란?

연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미한다.

HTTP에서는 여러 번 요청했을 때 항상 응답이 같은 것을 의미한다.

 

GET은 같은 요청을 여러 번 했을 때 항상 동일한 응답을 하기 때문에 멱등하고, POST는 같은 요청을 여러 번 했을 때 항상 응답이 다를 수 있기 때문에 멱등하지 않다.

 

 

이외에 차이점

- GET은 캐시 O, POST는 캐시 X (가능하지만 구현이 어렵다.)

(데이터 양이 크고 변경될 일이 적은 정적 데이터에 대한 요청은 캐시해두고 동일한 요청이 발생하면 캐시된 데이터를 재사용한다.)

 

- GET은 브라우저 히스토리에 남고 POST는 브라우저 히스토리에 남지 않음

 

- HTTP 응답 코드는 GET은 200(ok), POST는 201(created)

 

 

 

references

https://www.inflearn.com/questions/126743/http-api-vs-rest-api

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

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

https://developer.mozilla.org/ko/docs/Web/HTTP/Caching