🔴 HTTP Method
HTTP 메서드란 클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식을 뜻합니다. 쉽게 말해 서버가 수행해야할 동작을 지정하는 요청을 보내는 방법입니다.
GET
- 지정된 리소스의 정보를 요청합니다. 서버는 해당 리소스의 데이터를 응답으로 전송합니다.
- 전송 형태 : GET [request-uri]?query_string
HEAD
- GET 메소드와 유사하지만, 실제 데이터를 요청하지 않고 헤더 정보만을 받아옵니다. 주로 리소스가 존재하는지 확인하는 용도로 사용됩니다.(웹서버 정보확인, 헬스체크, 버젼확인, 최종 수정일자 확인등의 용도로 사용된다.)
- 전송 형태 : HEAD [request-uri]
POST
- 서버에 새로운 데이터를 제출하거나 리소스를 생성(CREATE)하기 위해 사용됩니다.
- 새로 작성된 리소스인 경우 HTTP헤더 항목 Location : URI주소를 포함하여 응답합니다.
- 전송 형태 : POST [request-uri] Content-Type:[Content Type][데이터]
PUT
- 지정된 리소스의 데이터를 수정(UPDATE)하거나 새 리소스를 생성합니다.
- 내용 갱신을 위주로 Location : URI를 보내지 않아도 됩니다.
- 클라이언트측은 요청된 URI를 그대로 사용하는 것으로 간주합니다.
- 전송 형태 : PUT [request-uri] Content-Type:[Content Type][데이터]
PATCH
- PUT과 유사하게 요청된 자원을 수정(UPDATE)할 때 사용합니다.
- PUT의 경우 자원 전체를 갱신하는 의미지만, PATCH는 해당 자원의 일부를 교체하는 의미로 사용합니다.
- 전송 형태 : PATCH [request-uri] Content-Type:[Content Type][데이터]
DELETE
- 지정된 리소스를 삭제할 것을 요청합니다.
- 안전성 문제로 대부분의 서버에서 비활성화합니다.
- 전송 형태 : DELETE [request-uri]
OPTIONS
CONNECT
TRACE
- 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행합니다.
HTTP Method의 멱등성(Idempotence)
HTTP 메소드의 멱등성(Idempotence)
은 동일한 요청을 여러 번 보내더라도 한 번의 요청과 동일한 결과가 나오는 성질을 의미합니다. 즉, 멱등한 메소드는 같은 요청을 여러 번 실행하더라도 서버의 상태가 변하지 않거나 동일한 상태로 유지됩니다.
GET vs POST
- 목적
- GET은 주로 서버의 리소스를 조회 요청하는데 사용하는 메서드이며, POST는 클라이언트의 데이터를 서버측에서 처리 요청하는데 사용하는 메서드라는 점에서 차이가 있습니다.
- 데이터 전달 방식
- 또한 GET을 활용해서 특정 리소스를 조회하고자 할 때 필요한 파라미터를 주로 쿼리스트링을 통해 전달하지만, POST로 데이터를 전달할 때는 body에 담아서 전달하는 차이가 있습니다.
- 캐싱
- 단순한 조회를 하기에는 GET이 캐싱 기능도 제공해주어서 GET을 쓰는게 유리합니다.
- 사용 예시
- GET: 웹 페이지 조회, 검색, 정보 확인 등
- POST: 로그인, 데이터 생성, 폼 제출 등
POST vs PATCH vs PUT
PUT /members/1
{
name : "hoon",
age : 28,
}
PATCH /members/1
{
name : "jihoon"
}
3가지 메소드는 모두 메시지의 Body에 데이터를 담아서 데이터를 쓰거나 생성한다는 공통점이 있지만 POST
는 새로운 데이터를 생성할 때 PUT
은 기존의 데이터를 전부 수정할 때, PATCH
는 기존의 데이터의 일부를 수정할 때 사용하는 방법으로 차이가 있습니다.
GET 메서드 Body에 데이터를 담지 않는 이유
HTTP 1.1 이후로 GET을 활용할 때도 Body에 데이터를 실을 수 있게 되었습니다. 그럼에도 GET의 캐싱 방식, 브라우저 호환성, 서버 및 프록시 제약, HTTP 설계 원칙측면에서 문제가 발생할 수 있습니다.
-
캐싱 및 브라우저 호환성
- GET요청은 캐싱이 잘 이루어지기 때문에, 반복된 요청에는 캐싱을 사용해서 응답할 수 있습니다. 하지만 body에 데이터를 담아 보내면 캐싱이 어려워지는 문제가 있을 수 있습니다.
- 캐싱이나 프록시 설계 일부는 GET의 body값을 참조하지 않는 경우가 있기 때문입니다.
- 중간에 캐시 프록시 서버가 있는 경우, 쿼리 파라미터를 활용한 GET 요청 시 프록시 서버가 중간에 캐싱하여 다수의 클라이언트에 동일한 데이터를 제공할 수 있지만, 데이터를 body에 담아 보내는 경우 이러한 캐싱이 어려워질 수 있습니다.
-
어떤 메소드를 사용해야 할지 명확한 분리
- HTTP의 설계 원칙에 따르면 GET은 정보를 요청하고 POST는 데이터를 제출하는 역할로 분리되어야 합니다. 본문을 포함한 GET 요청은 이러한 역할 분리를 어렵게 만들 수 있습니다.
-
서버 및 프록시 제약
- 일부 서버 및 프록시 서버는 GET 요청에서 본문을 지원하지 않거나 처리하지 않을 수 있습니다.
🙏 본 개념의 정리에 대한 피드백과 질문은 환영입니다!
✏️ Tech Interview Study
본 개념의 다른 정리 및 피드백, 인터뷰 주제의 순서는 테크 인터뷰 스터디 Repository에서 확인 가능합니다.
📚 Reference
[HTTP] HTTP 메소드의 멱등성(Idempotence)과 Delete 메소드가 멱등한 이유
벨로그 - HTTP Method란? (GET,POST,PUT,DELETE)
블로그 - HTTP 메소드의 멱등성, 그리고 안전한 메서드
인프런 - 멱등이 잘 이해가 가지 않습니다
벨로그 - [HTTP] GET, POST, PUT, PATCH 차이
깃북 - HTTP METHOD
우피 - 3. HTTP 기본
[HTTP] GET vs POST, GET은 body 값을 가지면 안 될까?
티스토리 - HTTP 메서드 종류 & 요청 흐름 총 정리
brunchstory - HTTP GET 메소드와 body