Get과 Post는 HTTP요청 메서드 중 가장 많이 사용되는 두가지로 각각의 목적과 동작 방식이 다릅니다.
이에 대한 구체적인 내용들에 대해서 설명 하도록 하겠습니다.
요청의 목적
Get
- 데이터를 조회할 때 사용됩니다.
- 서버에 요청을 보내 특정 리소스나 데이터를 가져오는 데 목적이 있습니다.
- 예를 들어 블로그 글읽기나 검색 결과를 가져오는 것이 이에 해당됩니다.
POST
- 데이터를 생성하거나 전송할 때 사용됩니다.
- 서버에 데이터를 보내 새로운 리소스를 생성하거나 데이터를 처리하도록 요청합니다.
- 예를 들어 회원가입, 로그인, 게시글 작성 등이 있습니다.
데이터 전달방식
Get
- 데이터가 URL의 쿼리 스트링으로 전달됩니다.
형식http://example.com?key1=value1&key2=value2
- 전달 가능한 데이터 크기가 제한적입니다.
- URL에 데이터가 노출되므로 보안에 취약합니다.
POST
- 데이터가 HTTP요청의 Body에 담겨 전달됩니다.
- URL에 데이터가 표시되지 않으므로 GET보다 비교적 보안성이 높습니다.
- 전송 가능한 데이터 크기에 제한이 거의 없으며, 파일 업로드 같은 대용량 데이터 전송도 가능합니다.
캐싱
GET
- 브라우저와 서버는 GET요청에 대해 캐싱을 지원합니다.
- 동일한 요청이 반복될 경우 서버가 아닌 브라우저나 프록시에서 캐시된 데이터를 반환할 수 있습니다.
- 정적 리소스인 이미지나 CSS파일 등을 가져오는 데에 적합합니다.
POST
- 기본적으로 캐싱되지 않습니다.
- 요청마다 서버에서 처리되며 같은 데이터를 여러번 전송하더라도 항상 새로운 요청으로 간주됩니다.
멱등성(Idempotency)
멱등성이란 처음 수행한 뒤 여러 차례 적용해도 결과를 변경시키지 않는 작업또는 기능의 속성을 뜻합니다. 즉 멱등한 작업의 결과는 한번 수행하든 여러 번 수행하든 같아야 합니다.
https://namu.wiki/w/%EB%A9%B1%EB%93%B1%EC%84%B1
GET
- 멱등성을 가집니다.
- 동일한 GET 요청을 여러 번 보내도 서버의 상태는 변하지 않습니다.
- 예) GET /products 요청을 10번 보내도 상품 목록은 그대로입니다.
POST
- 멱등성이 없습니다.
- 동일한 POST 요청을 여러 번 보내면 서버의 상태가 바뀔 수 있습니다.
- 예) POST /create-order 요청을 3번 보내면 주문이 3번 생성될 수 있습니다.
사용 사례
GET
- URL에 전달할 데이터가 간단하고 민감하지 않을 때 사용합니다.
- 서버에 데이터를 요청해 정보를 조회할 때 사용합니다.
- 예:
검색어 전송: http://example.com/search?query=apple
블로그 게시물 조회: http://example.com/posts/123
POST
- 민감하거나 대용량의 데이터를 서버에 전송할 때 사용합니다.
- 서버에 리소스를 생성하거나 데이터를 처리할 때 사용합니다.
- 예: 로그인 요청, 파일 업로드, 게시물 작성
HTTP 요청의 예시
GET 요청
GET /search?query=apple HTTP/1.1
Host: example.com
- URL에 데이터를 포함합니다.
- 서버는 query 값을 받아 데이터를 반환합니다.
POST 요청
POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
username=user&password=1234
- 데이터는 요청 본문(Body)에 포함됩니다.
- 서버는 Body의 데이터를 받아 처리합니다.
GET과 POST의 장단점
장점 | - 간단하고 빠르며 캐싱 가능 | - URL에 데이터 노출이 없어 보안성이 높음 |
단점 | - 데이터 길이 제한, 보안 취약 | - 캐싱 불가능, 상대적으로 느림 |
실무에서의 선택 기준
GET을 사용하는 경우
- 데이터를 조회하거나 검색 조건을 전달할 때
- URL 공유가 필요할 때 (예: 검색 결과를 북마크하거나 공유)
POST를 사용하는 경우
- 민감한 정보를 전송할 때 (로그인, 회원가입 등)
- 파일 업로드처럼 대용량 데이터를 처리할 때
- 서버에 상태 변화를 유발하는 요청을 보낼 때