- #Etc
HTTP Method가 뭔데요 (1)
Prolip
2024-04-30
과거의 나: 그냥 GET으로 받고 POST로 보내면 되는 거 아닙니까?
시작..
이 글을 읽고 계신 여러분은 HTTP Method에 대해 정확히 알고 계신가요?
일단 솔직히 저는 아닙니다.
단순히 데이터를 요청할 때 GET, 특정 데이터를 서버로 보내 어떤 처리를 할 때 POST, 데이터 바꿀 때 PUT아니면 PATCH 지울 때 DELETE… 그냥 이렇게 단순히 생각만 하고 있었습니다.
그래서.. 공부도 하고 정리도 해볼까 싶어서 글을 작성하게 되었습니다.\
HTTP Method?
우선 HTTP Method가 무엇인지 자~~~세히 적혀있는 RFC 문서를 뒤적이게 되었습니다.
목차 9번의 Methods가 제가 궁금한 내용들인 거 같아 정리를 해보고자 합니다.
글의 내용에 따라 정리해본 개요의 내용은 다음과 같습니다.
1. 요청 메서드 토큰
The request method token is the primary source of request semantics; it indicates the purpose for which the client has made this request and what is expected by the client as a successful result.
.. 사실 전 첫 시작부터 아리송해지기 시작했습니다. 요청 메서드 토큰은 클라이언트가 요청을 보내는 목적과 기대하는 결과를 나타낸다고 합니다.
…이게 정확히 무슨 의미일까요?
- 요청 메서드 토큰은 클라이언트가 서버에 요청을 보낼 때 사용하는 HTTP Method를 의미합니다.
- 목적은 클라이언트가 요청을 보낸 이유를 의미합니다.
- 기대하는 결과는 서버가 요청을 처리한 후 클라이언트에 반환하는 응답입니다!
이제 각 메서드가 어떤 목적과 기대하는 결과를 가지는지 표로 간단하게 알아보겠습니다.
Method | 목적 | 기대하는 결과 |
---|---|---|
GET | 데이터를 조회하거나 가져오기 위해 사용. | 요청한 리소스 (서버로부터 받아오는 JSON 데이터 등) 반환. |
POST | 서버에 데이터를 제출하거나 새로운 리소스 생성, 혹은 기존 리소스를 수정하기 위해 사용. | 요청한 작업 (데이터 저장, 제출 등)이 완료되고 그 결과과 반환. |
PUT | 서버에 특정 리소스를 생성하거나, 해당 리소스를 새로운 데이터로 교체하기 위해 사용. | 리소스가 성공적으로 생성되거나 교체됨. |
DELETE | 서버에서 특정 리소스를 삭제하기 위해 사용. | 리소스가 성공적으로 삭제됨. |
OPTIONS | 서버가 지원하는 HTTP 메서드나 옵션을 확인하기 위해 사용. | 서버가 지원하는 메서드 목록이 반환됨. |
HEAD | GET과 유사하지만, body 없이 헤더 정보만 요청. | 요청한 리소스의 메타데이터 (크기, 수정 날짜 등)가 반환됨. |
TRACE | 요청이 서버를 거쳐 어떻게 전달되는지 추적하기 위해 사용. | 서버가 요청 메시지를 그대로 반환하여 경로를 보여줌. |
CONNECT | 클라이언트와 서버 간에 터널을 설정하기 위해 사용. | TCP 터널이 설정되고, 양방향 통신이 가능해짐. |
아하! 이렇게 각 메서드는 특정한 목적을 가지고 있군요! 이를 통해 클라이언트는 서버에 어떤 작업을 수행하고자 하는지 명확하게 전달할 수 있는 것입니다!
2. 요청 메서드와 헤더 필드의 관계
위에서 요청 메서드 토큰, 즉 HTTP Method는 클라이언트가 서버에 어떤 작업을 요청하는지를 정의한다고 소개했습니다.
하지만 요청 메서드만으로는 모든 요청의 세부 사항을 전달할 수 없기 때문에, 헤더 필드를 사용해 요청을 더 구체화할 수 있습니다.
쉽게 이해할 수 있도록 예시를 확인해보겠습니다.
조건부 요청 (Conditional Request)
- 조건부 요청 헤더 필드
- If-Modified-Since
- If-Unmodified-Since
- If-Match
- If-None-Match
- If-Modified-Since의 경우
- 목적: 클라이언트가 특정 리소스를 가져오려고 할 때, 해당 리소스가 특정 날짜 이후에 수정된 경우에만 가져오도록 요청.
- 기대하는 결과: 리소스가 지정된 날짜 이후에 수정된 경우에만 서버가 데이터를 반환합니다. 그렇지 않을 경우 ‘304 Not Modified’를 반환.
GET /example.json HTTP/1.1 Host: www.gojimin.com If-Modified-Since: Mon, 13 Fab 2022 09:11:00 KST
- 목적: 'example.json' 파일을 가져오되, 파일이 2022년 2월 13일 월요일 오전 9시 11분 이후에 수정된 경우에만 GET.
- 기대하는 결과: 파일이 수정되었으면 파일 내용을 반환하고, 수정되지 않으면 '304 Not Modified' 상태 코드를 반환
조건부 PUT 요청
- 목적: 클라이언트가 리소스를 업데이트 할 때, 해당 리소스가 특정 버전일 경우에만 업데이트.
- 헤더 필드: ‘If-Match’
- 기대하는 결과: 서버는 리소스의 현재 버전이 클라이언트가 제공한 버전과 일치하는 경우에만 업데이트를 수행.
PUT /example.txt HTTP/1.1
Host: www.gojimin.com
If-Match: "1.21.2"
Content-Type: text/plain
- 목적: 'example.txt' 파일을 업데이트하되, 현재 버전이 '1.21.2'일 경우에만 업데이트. 기대하는 결과: 현재 버전이 '1.21.2'와 일치하면 파일이 업데이트 되고, 그렇지 않으면 업데이트가 거부됨.
범위 요청 (Range Request)
- 목적: 클라이언트가 큰 파일의 일부만 가져오려고 할 때 사용.
- 헤더 필드: ‘Range’
- 기대하는 결과: 서버는 요청된 범위에 해당하는 데이터만 반환.
GET /myVideo.zip HTTP/1.1
Host: www.gojimin.com
Range: bytes=0-999
- 목적: 'myVideo.zip' 파일의 처음 1000바이트(0부터 999까지)를 가져오고 싶다. 기대하는 결과: 서버는 요청된 범위(처음 1000바이트)의 데이터만 반환.
이렇게 이해하기 쉽게 예시를 정리해봤습니다.. 자세한 내용은 해당 RFC 문서의 13절을 참고하시면 됩니다.
요약하자면!
헤더 필드와 요청 메서드에서 요청 메서드는 클라이언트가 수행하고자 하는 기본 작업을 정의한 것이며, 헤더 필드는 이 요청을 구체화하고 추가 정보를 제공하는데 사용됩니다.
조건부 요청을 통해 특정 조건이 만족될 때만 요청을 수행하도록 설정할 수 있습니다. 이는 불필요한 데이터 전송을 줄이고, 효율성을 높이기 위해 사용됩니다. (If-Modified-Since, If-Match, Range 등)
3. 대소문자를 구분하는 이유
HTTP Method 토큰은 대소문자를 구분합니다. 사실 지금까지 쓰면서 GET POST 이렇게 썼지 get, post 이렇게는 안 썼잖아요?
이유는 호환성과 일관성 유지 때문이라고 합니다.
일부 프로그래밍 언어와 시스템은 메서드 이름은 대소문자를 구분해 처리합니다. 예를 들어 자바나 C++ 같은 언어에서는 ‘GetData()’와 ‘getData()’를 서로 다른 메서드로 구분합니다. HTTP도 이러한 시스템과의 호환성을 유지하기 위해 메서드 이름에서 대소문자를 구분한다고 합니다.
HTTP 표준에서는 모든 메서드를 대문자로 정의합니다. 이는 표준 메서드의 사용을 일관되게 유지하기 위해서입니다.
4. 리소스 비특정적
HTTP의 표준 메서드는 특정 리소스에 종속되지 않으며, 모든 리소스에 대해 동일한 의미를 가집니다. 이는 HTTP 메서드가 특정 리소스에 한정되지 않고, 다양한 리소스에 일관되게 적용될 수 있음을 의미합니다.
…왜요?
네트워크에서의 가시성과 재사용성
- 가시성: HTTP 메서드는 모든 리소스에 대해 동일한 의미를 가지기 때문에, 어떤 리소스에 대해서도 일관된 방법으로 요청을 처리할 수 있습니다. 이는 네트워크를 통해 요청과 응답을 쉽게 추적하고 이해할 수 있게 합니다.
- 재사용성: 동일한 HTTP 메서드를 다양한 리소스에 적용할 수 있기 때문에, 코드의 재사용성과 유지보수성이 향상됩니다. 예를 들어, ‘GET’ 메서드는 HTML 페이지, 이미지, API 데이터 등 다양한 리소스를 가져오는 데 일관되게 사용됩니다.
이렇게만 보면 또 이해하기 어려우니까 예시를 들어봅시다.
HTTP 표준 메서드와 리소스
- GET: 서버에서 데이터를 조회할 때 사용됩니다. HTML 페이지, 이미지, API 데이터 등 다양한 리소스에 적용될 수 있습니다.
- POST: 서버에 데이터를 제출할 때 사용됩니다. 폼 데이터 제출, 파일 업로드, API 요청 등 다양한 리소스에 적용될 수 있습니다.
리소스별 의미 구현
각 리소스는 표준 메서드의 의미를 어떻게 구현할지 스스로 결정합니다.
- HTML 페이지: ‘GET /index.html’ 요청은 서버에서 ‘index.html’ 페이지를 반환합니다.
- API 엔드포인트: ‘GET /api/users’ 요청은 서버에서 사용자 목록을 JSON 형식으로 반환합니다.
- 파일: ‘GET /images/jimin.png’ 요청은 서버에서 ‘jimin.png’ 이미지를 반환합니다.
어라! 이 모든 경우의 ‘GET’ 메서드는 “데이터를 가져오는” 동일한 의미를 가지지만, 각 리소스는 그 의미를 자체적으로 구현하네요!!!
5. GET 및 HEAD는 필수 지원
모든 범용 서버 (웹 서버, API 서버 등 모든 일반적인 HTTP 서버)는 클라이언트가 데이터를 조회하거나 가져올 수 있도록 기본적으로 GET과 HEAD 메서드를 지원해야만 합니다. 이는 웹의 기본 기능을 보장하기 위해 필수적입니다.
6. 허용되는 메서드 집합 (Allow Header)
The set of methods allowed by a target resource can be listed in an Allow header field (Section 10.2.1).
대상 레소스에서 허용하는 메서드 집합을 Allow 헤더 필드에 나열할 수 있다고 합니다. 이건 또 무슨 말일까요?
대상 리소스는 서버에서 접근하려는 특정 자원 (특정 웹 페이지, API 엔드포인트)를 의미합니다.
Allow 헤더 필드는 특정 리소스에 대해 서버가 허용하는 HTTP 메서드 목록을 포함하는 헤더 필드로 이 헤더 필드를 통해 클라이언트에게 어떤 메서드를 사용할 수 있는지 알려줍니다.
Allow: GET, POST, OPTIONS
위는 특정 리소스가 GET, POST, OPTIONS 메서드를 허용함을 나타내는 예시입니다.
즉, 클라이언트는 이 리소스에 대해 GET, POST, OPTIONS 요청을 할 수 있습니다.
동적 변경
- However, the set of allowed methods can change dynamically. 하지만 허용되는 메서드 집합은 정적이지 않고, 리소스의 상태나 서버의 설정에 따라 동적으로 변경될 수 있다고 합니다.
- 예를 들어, 특정 리소스는 사용자가 로그인한 경우에만 POST 메서드를 허용한다고 가정하겠습니다.
기본 상태
Allow: GET, OPTIONS
로그인 상태 (사용자가 로그인한 경우)
Allow: GET, POST, OPTIONS
- 서버 설정 변경에 따른 메서드 변경 - 서버 관리자가 설정을 변경하여 특정 리소스에 대해 허용되는 메서드를 추가하거나 삭제할 수 있습니다.
- 리소스 상태에 따른 메서드 변경 - 예를 들어, 게시판의 경우 사용자가 해당 게시글의 작성자인 경우에만 해당 문서를 삭제할 수 있도록 DELETE 메서드를 허용할 수 있습니다.
문서에 대한 기본 상태
Allow: GET, OPTIONS
사용자가 해당 문서의 작성자인 경우
Allow: GET, DELETE, OPTIONS
상태 코드와의 연관성
- 405 Method Not Allowed - 클라이언트가 허용되지 않은 메서드로 요청을 보낼 경우, 서버는 405 상태 코드를 반환하며, 응답에 Allow 헤더를 포함하여 허용되는 메서드를 알려줄 수 있습니다.
HTTP/1.1 405 Method Not Allowed
Allow: GET, POST, OPTIONS
- 501 Not Implemented - 서버가 요청한 메서드를 인식하지 못하거나 구현하지 않았을 때 반환하는 코드입니다. 아래는 서버에 PATCH 요청을 보냈으나 서버가 PATCH 메서드를 지원하지 않는 경우의 예시입니다.
HTTP/1.1 501 Not Implemented
7. 추가 메서드와 HTTP 메서드 레지스트리
Additional methods, outside the scope of this specification, have been specified for use in HTTP. All such methods ought to be registered within the "Hypertext Transfer Protocol (HTTP) Method Registry", as described in Section 16.1.
HTTP 표준에 정의되지 않은 추가 메서드도 사용할 수 있다고 합니다. 물론 이러한 추가 메서드는 공식적으로 “하이퍼텍스트 전송 프로토콜(HTTP) 메서드 레지스트리”에 등록해야 한다고 합니다!
근데 그래서 이게 무슨 말일까요..
추가 메서드란?
- HTTP 표준에 명시되지 않은 메서드로, 특정한 필요에 의해 정의된 새로운 메서드를 의미합니다.
- 예를 들어, ‘PATCH’ 메서드는 기존 HTTP/1.1 표준에는 없었으나, 나중에 리소스의 부분적인 업데이트를 위해 추가되었습니다. PUT은 전체적인 업데이트를 지원하니 부분적으로 업데이트하기 위해 추가되었나봅니다.
HTTP 메서드 레지스트리
- 새로운 HTTP 메서드가 공식적으로 등록되는 목록입니다. 이 레지스트리는 IANA(Internet Assigned Numbers Authority)에서 관리한다고 합니다.
- 새로운 메서드를 등록함으로써, 모든 HTTP 클라이언트와 서버가 이를 인식하고 지원하기 위한 목적을 가지고 있습니다. 이는 웹의 일관성과 상호 운용성을 유지하는 데 중요하다고 합니다.
등록 절차
- 메서드 정의 - 새로운 메서드를 정의합니다. 이 메서드는 특정한 목적과 사용 사례를 가지고 있어야 합니다.
- 문서화 - 새로운 메서드의 동작, 사용 사례, 의미를 상세히 문서화합니다. 이 문서화는 메서드가 어떻게 작동하는지, 언제 사용해야 하는지 등을 명확히 설명합니다.
- 제출 및 검토 - 정의된 메서드를 IANA에 제출합니다. IANA는 이를 검토하고, 기술적 타당성과 필요성을 평가합니다.
- 등록 및 발표 - 메서드가 승인되면 IANA는 이를 HTTP 메서드 레지스트리에 등록합니다. 이후, 이 메서드는 공식적으로 사용할 수 있게 됩니다.
예시: PATCH
- PATCH는 리소스의 일부만 수정할 수 있도록 하는 메서드입니다.
- PATCH 메서드의 사용 사례, 동작 방식, 적용 범위 등을 상세히 문서화한 RFC 5789 문서가 있습니다.
- IANA에 의해 공식적으로 등록되어 HTTP 메서드 레지스트리에 포함되었습니다.
그래서 추가 메서드가 왜 필요할까요?
- 확장성(기존 표준의 한계 극복) - HTTP 표준 메서드로는 충분히 처리할 수 없는 새로운 요구사항이 생길 때, 새로운 메서드를 정의해 이를 해결하기 위함입니다.
- 일관성 유지 - 모든 새로운 메서드는 공식적으로 등록되므로, 모든 HTTP 클라이언트와 서버가 이를 인식하고 지원할 수 있습니다.
일단 여기까지..!
아니 HTTP method 뭐 있는지 알아보려고 문서를 보니 개요 부분에서만 너무 많은 지식을 머리에 넣어버리게 되었습니다. 사실 개요의 내용은 그렇게 길지 않으나 읽어보면서 이해가 되지 않는 부분들은 제가 다시 찾아보고 정리하다보니 이렇게 글이 길어지게 되었습니다. 다음 게시물에서 바로 다음 내용인 안전한 메서드부터 다시 정리해보려 합니다….. 읽어주셔서 감사합니다.