Skip to main content

2021년 9월

2021-09-28#

GET과 POST#


HTTP#

HTTP는 웹상에서 클라이언트와 서버 간에 요청/응답으로 데이터를 주고받을 수 있는 프로토콜입니다. 클라이언트가 HTTP 프로토콜을 통해 서버에게 요청을 보내면 서버는 요청에 맞는 응답을 클라이언트에게 전송합니다. 이때 서버에게 요청을 하는 방식은 GET과 POST가 있습니다. 두 방식의 차이점을 알아보겠습니다.

GET#

GET은 서버로부터 정보를 조회하기 위해 설계된 메소드 입니다. GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리 스트링을 통해 전송합니다. URL의 끝에 ?와 함께 이름과 값을 쌍을 이루는 요청 파라미터를 쿼리 스트링이라고 부릅니다. 만약, 요청 파라미터가 여러 개이면 &로 연결합니다.

  • ex) www.example-url.com/resources?name1=value1&name2=value2 여기서 요청 파라미터 명은 name1, name2이고, 각각의 파라미터는 value1, value2라는 값으로 서버에 요청을 보내게 됩니다.

GET은 불필요한 요청을 제한하기 위해 요청이 캐시 될 수 있습니다. 동일한 요청이 발생할 때 서버로 요청을 보내지 않고 캐시 된 데이터를 사용합니다.

GET의 특징 정리#

  • GET은 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있습니다.
  • 파라미터에 내용이 노출되기 때문에 민감한 데이터를 다룰 때 GET 요청을 사용해서는 안 됩니다.
  • GET 요청은 브라우저 기록에 남습니다.
  • GET 요청을 북마크에 추가할 수 있습니다.
  • GET 요청에는 데이터 길이에 대한 제한이 있습니다.
  • Get 요청은 성공시, 200(Ok) HTTP 응답 코드를 XML, JSON뿐만 아니라 여러 데이터(html, txt등..), 여러 형식의 데이터와 함께 반환합니다.
  • GET 요청은 idempotent합니다.

POST#

POST는 리소스를 생성/변경하기 위해 설계되었기 때문에 GET과 달리 전송해야 될 데이터를 HTTP 메시지의 Body에 담아서 전송합니다. HTTP의 메시지의 Body는 길이의 제한 없이 데이터를 전송할 수 있습니다. 그래서 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있습니다. 이처럼 POST는 데이터가 Body로 전송되고 내용이 눈에 보이지 않아 GET보다 보안적인 면에서 안전하다고 생각할 수 있지만, POST 요청도 크롬 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인할 수 있기 때문에 민감한 데이터의 경우에는 반드시 암호화해 전송해야 합니다. 그리고 POST로 요청을 보낼 때는 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시해야 합니다. 데이터 타입을 표시하지 않으면 서버는 내용이나 URL에 포함된 리소스의 확장명 등으로 데이터 타입을 유추합니다.

POST의 특징 정리#

  • POST 요청은 캐시되지 않습니다.
  • POST 요청은 브라우저 기록에 남아 있지 않습니다.
  • POST 요청을 북마크에 추가할 수 없습니다.
  • POST 요청에는 데이터 길이에 대한 제한이 없습니다.
  • Post 요청 중 자원 생성은 201(Created) HTTP 응답 코드를 반환합니다.
  • Post 요청은 idempotent하지 않습니다.

GET과 POST의 차이#

GET은 Idempotent, POST는 Non-idempotent 하게 설계되었습니다. Idempotent는 동일한 연산을 여러 번 수행하더라도 동일한 결과가 나타나야 합니다. 때문에 GET으로 서버에게 동일한 요청을 여러 번 전송하더라도 동일한 응답이 돌아와야 한다는 것을 의미합니다. 이에 따라 GET은 설계 원칙에 따라 서버의 데이터나 상태를 변경시키지 않아야 Idempotent 하기 때문에 주로 조회를 할 때에 사용해야 합니다. 반대로 POST는 Non-idempotent 하기 때문에 서버에게 동일한 요청을 여러 번 전송해도 응답은 항상 다를 수 있습니다. 이에 따라 POST는 서버의 상태나 데이터를 변경시킬 때 사용됩니다.