HTTP 메시지
HTTP 메시지
HTTP 메시지는 HTTP 애플리케이션 간에 주고받은 데이터의 블록들입니다.
이 데이터의 블록들은 메시지의 내용과 의미를 설명하는 텍스트 메타 정보로 시작하고 그 다음에 선택적으로 데이터가 올 수 있습니다.
1. 메세지의 흐름
메시지는 클라이언트, 서버, 프락시 사이를 흐릅니다.
메시지의 흐름 방향에는 인바운드, 아웃바운드, 업스트림, 다운스트림라는 용어들이 있습니다.
메시지가 원 서버로 항하는 것을 인바운드라 하고, 모든 처리가 끝난 뒤에 메시지가 사용자 에이전트로 돌아오는 것을 아웃바운드라고 합니다.
요청 메시지인지 응답 메시지인지 상관없이 모든 메시지는 다운스트림으로 흐릅니다.
즉 메시지의 발송자는 업스트림, 수신자는 다운스트림이라 할 수 있습니다.
2. 메시지의 각 부분
메시지는 시작줄, 헤더, 본문으로 세 부분으로 구성되어 있습니다.
시작줄은 이것이 어떤 메시지인지를, 헤더 블록은 속성을, 본문은 데이터를 담고 있습니다.
2.1 메시지 문법
요청 메시지의 형식은 다음과 같습니다.
- start line
- 메서드(Method)
클라이언트 측에서 서버가 리소스에 대해 수행해주길 바라는 동작입니다.
GET, POST 메서드가 해당됩니다. - 요청 URL(Path)
요청 대상이 되는 리소스를 지칭하는 완전한 URL 또는 URL의 경로 구성요소입니다. - 버전(Version of the protocol)
이 메시지에서 사용 중인 HTTP 버전입니다.
- 메서드(Method)
- 헤더들(Headers)
부가적인 정보들이 들어있습니다.
이름과 콜론(:) 다음에 오는 값(줄바꿈 없이)으로 구성되어 있는 0개 이상의 헤더들로 구성되어 있습니다. - 공백 줄(Blank line)
헤더가 끝나면 한 줄 띄고 바디가 옵니다. - 바디(Body)
전송하는 데이터가 들어있습니다.
전송하는 데이터가 없으면 body가 없습니다.
응답 메시지의 형식은 다음과 같습니다.
- status line
- 버전(Version of the protocol)
이 메시지에서 사용 중인 HTTP 버전입니다. - 상태 코드(Status code)
요청 중에 무엇이 일어났는지 설명하는 세 자리의 숫자입니다.
일반적으로 성공과 에러를 분류합니다. - 상태 텍스트(Status Text)
숫자로 된 상태 코드의 의미를 사람이 이해할 수 있게 짧게 설명해주는 문구입니다.
- 버전(Version of the protocol)
- 나머지는 요청 메시지와 동일합니다.
3. 메서드
클라이언트가 서버에게 어떤 요청을 보내는지 나타냅니다.
3.1 안전한 메서드
안전한 메서드는 HTTP 요청의 결과로 인해 서버에 아무런 일도 일어나지 않는 메서드를 말합니다.
보통 GET, HEAD 메서드가 있습니다.
3.2 GET
주로 서버에게 리소스를 달라고 요청하는 메서드입니다.
3.3 HEAD
GET처럼 행동하지만, 서버는 응답으로 바디없이 헤더만을 돌려줍니다.
3.4 PUT
서버가 요청의 본문을 가지고 요청 URL의 이름대로 새 문서를 만들거나, 이미 URL이 존재한다면 본문을 사용해서 교체하는 메서드입니다.
3.5 PATCH
리소스의 일부를 교체하기 위한 메서드입니다.
3.6 POST
서버에 입력 데이터를 전송하기 위한 메서드입니다.
실제로, HTML 폼을 지원하기 위해 흔히 사용됩니다.
3.7 TRACE
클라이언트에게 자신의 요청이 서버에 도달했을 때 어떻게 보이게 되는지 알려주는 메서드입니다.
요청 전송의 마지막 단계에 있는 서버는 자신이 받은 요청 메시지를 본문에 넣어 응답으로 되돌려줍니다.
※ TRACE 요청은 어떠한 바디도 보낼 수 없습니다.
3.8 OPTIONS
웹 서버에게 특정 리소스에 대해 어떤 메서드가 지원되는지 물어보는 메서드입니다.
3.9 DELETE
서버에게 요청 URL로 지정한 리소스를 삭제할 것을 요청하는 메서드입니다.
3.10 확장 메서드
HTTP 명세에 정의되어 있지 않은 메서드입니다.
HTTP는 필요에 따라 확장해도 문제가 없도록 설계되어 있습니다.
확장 메서드를 다룰 때는 "엄격하게 보내고 관대하게 받아들여라"라는 오랜 규칙에 따르는 것이 가장 좋다고 합니다.
4. 상태 코드
HTTP 상태 코드는 크게 다섯 가지로 나뉩니다.
4.1 100번대(1xx): 정보성 상태 코드
임시 응답으로 현재 클라이언트의 요청까지는 처리되었으나 계속 진행하라고 알리는 상태 코드입니다.
4.2 200번대(2xx): 성공 상태 코드
클라이언트가 보낸 요청이 성공적으로 처리되었다는 알리는 상태 코드입니다.
4.3 300번대(3xx): 리다이렉션 상태 코드
클라이언트가 관심있어 하는 리소스에 대해 다른 위치를 사용하라고 하거나 그 리소스의 내용 대신 다른 대안 응답을 제공하는 상태 코드입니다.
리다이렉션 상태 코드 중 몇몇은 리소스에 대한 애플리케이션의 로컬 복사본이 원래 서버와 비교했을 때 유효한지 확인하기 위해 사용됩니다.
예를 들어, HTTP 애플리케이션은 그의 리소스에 대한 로컬 복사본이 여전히 최신인지 혹은 원래 서버에 있는 리소스가 수정되었는지 검사할 수 있습니다.
4.4 400번대(4xx): 클라이언트 에러 상태 코드
클라이언트가 잘못 구성된 요청 메시지를 보냈다고 알리는 상태 코드입니다.
4.5 500번대(5xx): 서버 에러 상태 코드
서버 자체에서 에러가 발생했음을 알리는 상태 코드입니다.
5. 헤더
헤더와 메서드는 클라이언트와 서버가 무엇을 하는지 결정하기 위해 함께 사용됩니다.
헤더는 크게 다섯 가지로 분류됩니다.
5.1 일반 헤더
일반 헤더는 클라이언트와 서버 양쪽 모두가 사용합니다.
예를 들어, Date 헤더는 클라이언트와 서버를 가리지 않고 메시지가 만들어진 일시를 지칭하기 위해 사용됩니다.
일반 헤더에는 일반 캐시 헤더라는 것도 있습니다.
- 일반 캐시 헤더
애플리케이션에게 매번 원 서버로부터 객체를 가져오는 대신 로컬 복사본으로 캐시할 수 있도록 해줍니다.
5.2 요청 헤더
요청 메시지를 위한 헤더입니다.
서버에게 클라이언트가 받고자 하는 데이터의 타입이 무엇인지와 같은 부가 정보를 제공합니다.
예를 들어, Accept 헤더는 서버에게 클라이언트가 자신의 요청에 대응하는 어떤 미디어 타입도 받아들일 것임을 의미합니다.
요청 헤더에는 조건부 요청 헤더, 요청 보안 헤더, 프락시 요청 헤더라는 것도 있습니다.
- 조건부 요청 헤더
클라이언트는 서버가 요청에 응답하기 전에 먼저 조건이 참인지 확인하게 하는 제약을 포함시킬 수 있습니다. - 요청 보안 헤더
요청하는 클라이언트가 리소스에 접근하기 전에 자신을 인증하게 함으로써 트랜잭션을 약간 더 안전하게 만듭니다. - 프락시 요청 헤더
프락시의 기능을 도와줍니다.
5.3 응답 헤더
응답 메시지를 위한 헤더입니다.
클라이언트에게 정보를 제공합니다.
예를 들어, Sever 헤더는 클라이언트에게 어떤 서버의 몇 버전과 대화하고 있음을 의미합니다.
응답 헤더에는 협상 헤더, 응답 보안 헤더라는 것도 있습니다.
- 협상 헤더
서버가 협상 가능한 리소스에 대한 정보를 나타냅니다.
예를 들어, 영어와 한국어로 번역된 HTML 문서가 있는 경우와 같이 여러가지 표현이 가능한 상황에서 서버와 클라이언트가 어떤 표현을 택할 것인가에 대한 협상을 할 수 있도록 지원합니다. - 응답 보안 헤더
요청 보안 헤더와 비슷합니다.
5.4 엔터티 헤더
엔터티 본문에 대한 헤더입니다.
엔터티 본문에 들어있는 데이터에 대한 정보를 제공합니다.
예를 들어, Content-Type 헤더는 애플리케이션에게 데이터가 어떤 타입의 데이터임을 알려줍니다.
※ 이 글에서는 엔터티 본문과 바디는 같은 말로 사용했습니다.
엔터티 헤더에는 콘텐츠 헤더, 엔터티 캐싱 헤더라는 것도 있습니다.
- 콘텐츠 헤더
엔터티의 콘텐츠에 대한 구체적인 정보를 제공합니다.
위에 예시로 들었던 Content-Type 헤더가 여기에 포함됩니다. - 엔터티 캐싱 헤더
엔터티 캐싱에 대한 정보를 제공합니다.
예를 들어, 리소스에 대해 캐시된 사본이 아직 유효한지에 대한 정보와 캐시된 리소스가 더 이상 유효하지 않게 되는 시점을 더 잘 추정하기 위한 단서를 제공합니다.
5.5 확장 헤더
애플리케이션 개발자들에 의해 만들었졋지만 아직 승인된 HTTP 명세에는 추가되지 않은 비표준 헤더입니다.
마치며..
이 글은 HTTP 메시지에 대한 다소 간략히 적은 글입니다.
저는 이 글에서
- 메세지의 흐름에 무엇이 있는지,
- 요청 메시지와 응답 메시지는 어떤 구조인지,
- 메서드는 무엇이 있는지와 그 역할들이 무엇인지,
- 상태 코드 몇번대는 무엇을 나타내는지,
- 헤더의 역할과 종류는 무엇이 있는지
를 알아가셨으면 좋겠습니다.
개인적으로 확장 메서드와 확장 헤더는 그런게 있구나하는 정도로 넘어가시면 될 것 같습니다.
개인적으로 본 적이 없는 메서드, 상태 코드 혹은 헤더를 만나게 되더라도 그것이 무엇을 의미하는지는 구글링으로 쉽게 알 수 있기 때문에 상세한 내용은 알 필요 없다고 생각합니다.
물론 자주 쓰이는 것은 알고 있으면 좋습니다. ^-^