웹프로그래밍/이론

[WEB] HTTP 요청 메서드 비교 정리

ssung.k 2020. 10. 15. 22:49

클라이언트와 서버는 서로 요청과 응답을 주고 받습니다.

이 때 클라이언트는 요청 메서드, 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에 위배됩니다.

한 가지 의문이 드는 것은 PUTPATCH 에 대해서 PUT 은 Idempotent이고 PATCH는 아닙니다.

PATCH는 수정을 하기 위해 수정 방식을 정합니다.

예를 들면 age필드를 변경하기 위해서 다음과 같은 두 가지 규칙이 존재합니다.

// 현재 리소스
{
  name: 'Tito',
  age: 32
}
// 방법 1. Idempotent
{
  age: 33
}

// 방법 2. Idempotent X
{
  $increment: 'age'
}

따라서 PATCH 는 Idempotent일 수도 아닐 수도 있게 됩니다.

 

 

Cachable

cachable는 이전에 가져온 리소스를 재사용 하는 것을 의미합니다.

기본적으로 GETHEAD에 대해서 캐시하며 별도의 헤더들을 이용하여 조절할 수 있습니다.

 

 

Allow In HTML Forms

HTML Forms에서 사용할 수 있는지에 대한 여부입니다.

HTML 표준에 따르면 POSTGET 만 가능합니다.