[WEB] HTTP 요청 메서드 비교 정리
클라이언트와 서버는 서로 요청과 응답을 주고 받습니다.
이 때 클라이언트는 요청 메서드, request method를 통해 요청의 목적이나 종류를 알리게 됩니다.
이번 포스팅에서는 각각의 HTTP 요청 메서드들을 비교하고 정리해보도록 하겠습니다.
HTTP 요청 메서드
각 HTTP 요청 메서드와 특징들을 표로 정리하였습니다.
detail | request body | successful response body | safe | idempotent | cachable | allow in HTML forms | |
---|---|---|---|---|---|---|---|
GET | 리소스 요청 | NO | YES | YES | YES | YES | YES |
HEAD | GET 메서드의 요청과 동일한 응답을 요구하지만, 응답 본문을 포함 X | NO | NO | YES | YES | YES | NO |
POST | 내용 전송 | YES | YES | NO | NO | NO | YES |
PUT | 내용 갱신 | YES | YES | NO | YES | NO | NO |
DELETE | 리소스를 삭제 | 권장하지 않으나 가능 | 권장하지 않으나 가능 | NO | YES | NO | NO |
CONNECT | 목적 리소스로 식별되는 서버로의 터널을 맺음 | NO | YES | NO | NO | NO | NO |
OPTIONS | 웹 서버측 제공 메소드에 대한 질의 | NO | YES | YES | YES | NO | NO |
TRACE | 목적 리소스의 경로를 따라 메시지 loop-back 테스트 | NO | YES | NO | YES | NO | NO |
PATCH | 내용 부분 갱신 | YES | YES | NO | NO | NO | NO |
Detail
각 HTTP 요청 메서드에 대한 설명입니다.
비교적 낯선 메서드에 대해서 좀 더 자세히 봅시다.
-
CONNECT
클라이언트는 원하는 목적지와의 TCP 연결을 HTTP 프록시 서버에 요청합니다. 그러면 서버는 클라이언트를 대신하여 연결의 생성을 진행합니다. 한번 서버에 의해 연결이 수립되면, 프록시 서버는 클라이언트에 오고가는 TCP 스트림을 계속해서 프록시합니다.
-
OPTIONS
서버에서 지원하는 메서드에 대해서 확인할 수 있습니다.
curl -X OPTIONS http://example.org -i
응답에서 Allow 헤더에 지원되는 메서드들을 확인할 수 있습니다.
HTTP/1.1 200 OK Allow: OPTIONS, GET, HEAD, POST Cache-Control: max-age=604800 Date: Thu, 13 Oct 2016 11:45:00 GMT Expires: Thu, 20 Oct 2016 11:45:00 GMT Server: EOS (lax004/2813) x-ec-custom-error: 1 Content-Length: 0
-
TRACE
최종적으로 서버에 도착한 packet을 요청합니다.
클라이언트가 보낸 request packet은 방화벽, Proxy Server, Gateway 등을 거치면서 packet 변조가 일어날 수 있는데 이러한 변조를 확인하기 위한 테스트입니다.
Request Body
request body의 유무를 의미합니다.
POST
,PUT
,PATCH
의 경우 리소스를 생성/수정하기 위한 데이터가 필요하므로 Request Body가 존재하고 나머지는 필요 없습니다.
Successful Response Body
successful response body의 유무를 의미합니다.
HEAD
의 경우 response body 없이 헤더만 응답받게 됩니다.
Safe
safe는 리소스를 변경하는지 에대한 유무를 의미합니다.
GET
,HEAD
,OPTIONS
의 경우 리소스를 변경하지 않습니다. 따라서 이들은 safe하다고 할 수 있습니다.
Idempotent
idempotent는 멱등성이라고 하며 여러 동일한 요청에 응답이 같은지를 판단합니다.
GET
은 여러 요청에 대해 같은 리소스를 응답하므로 idempotent이고, POST
는 동일한 요청에 대해 동일한 데이터를 가진 다른 리소스를 생성하게 되므로
idempotent에 위배됩니다.
한 가지 의문이 드는 것은 PUT
와 PATCH
에 대해서 PUT
은 Idempotent이고 PATCH
는 아닙니다.
PATCH는 수정을 하기 위해 수정 방식을 정합니다.
예를 들면 age필드를 변경하기 위해서 다음과 같은 두 가지 규칙이 존재합니다.
// 현재 리소스
{
name: 'Tito',
age: 32
}
// 방법 1. Idempotent
{
age: 33
}
// 방법 2. Idempotent X
{
$increment: 'age'
}
따라서 PATCH
는 Idempotent일 수도 아닐 수도 있게 됩니다.
Cachable
cachable는 이전에 가져온 리소스를 재사용 하는 것을 의미합니다.
기본적으로 GET
과 HEAD
에 대해서 캐시하며 별도의 헤더들을 이용하여 조절할 수 있습니다.
Allow In HTML Forms
HTML Forms에서 사용할 수 있는지에 대한 여부입니다.
HTML 표준에 따르면 POST
와 GET
만 가능합니다.