네트워크

HTTP 요청 및 응답 구조 알아보기

teo_99 2023. 9. 4. 18:21

이번 아티클에서는 HTTP 요청과 응답이 어떤 구조를 가지는지 알아보도록 하겠습니다.

 

HTTP 메세지 구조

HTTP 요청(Http Request), HTTP 응답(Http Response) 모두 HTTP 메세지입니다. 표준에서 정의하는 HTTP 메세지의 구조는 다음과 같습니다. 

보시다시피 HTTP 메세지는 크게 네 가지 부분으로 구성됩니다. start line, message headers, CRLF, message body입니다. 

 

start line

start line의 경우 HTTP 메세지에서 가장 처음에 위치하는 부분입니다. 그리고 start line은 HTTP 요청이냐, 응답이냐에 따라 두 가지 종류로 나뉘게 됩니다. HTTP 요청인 경우에는 request line이라는 이름으로 불리며, HTTP 응답인 경우 status line이라는 이름으로 불립니다. 

 

message headers

헤더가 위치하는 부분입니다. 헤더는 여러개가 위치할 수도 있고, 전혀 포함되지 않을 수도 있습니다. 헤더 각각은 key : value의 형태로 구성됩니다. 필드명은 Case-insensitive하기 때문에 대소문자를 구별하지 않습니다.

 

헤더는 각각 한 줄씩만 차지하며, 한 줄 이상의 value 값을 지정할 필요가 있는 경우에는 HT(Horizontal tab) 혹은 SP(space)를 사용하면 됩니다.

 

그리고 전달하고자 하는 정보가 어느 유형이냐에 따라 General Headers, Request Headers, Response Headers, Entity Headers로 나뉘게 됩니다. 

  • General Headers: request, response에서 공통적으로 사용될 수 있는 정보를 담음(ex. Cache Control)
  • Request Headers: request 혹은 클라이언트에 대한 정보를 담음(ex. Accept, User-Agent)
  • Response Headers: 서버에 대한 정보 혹은 요청한 자원에 대한 접근 방법을 담음(ex. Age, Location)
  • Entity Headers: 요청한 자원 혹은 body에 대한 정보를 담음(ex. Content-Type)

 

CRLF

말 그대로 CRLF(개행)이 위치하는 부분입니다. HTTP 메세지에서는 헤더 부분과 바디 부분을 구분짓기 위해서 CRLF를 사용합니다.

 

message body

message body 부분에는 entity body 혹은 Transfer Encoding이 된 entity-body가 위치할 수 있습니다. 여기서 entity-body는 쉽게 말해 HTML이나 JSON 같은 '실제 전송하고자 하는 데이터'라고 생각하시면 됩니다.

Transfer Encoding이란, 메세지를 인코딩하는 방식을 의미합니다. HTTP 요청 및 응답에서 데이터가 너무 크거나 미리 알 수 없는 경우 데이터를 분할해서 보내기도 하는데, 이 방식이 Transfer Encoding의 종류 중 하나인 Chunked Transfer Encoding입니다. 

참고: Transfer Encoding - MDN Web Docs

앞에서는 HTTP 메세지의 구조에 대해 살펴봤습니다. 지금까지 설명한 개념은 Request, Response에 공통적으로 적용되는 개념들이었습니다. 하지만 start line의 경우에만 Request냐 Response냐에 따라 구조가 조금 달라지는데, 해당 부분에 대해 알아보도록 하겠습니다.

 

Request message - Request Line

HTTP 요청이 Request인 경우에는 start line에 request line이 위치합니다. 그리고 request line은 다음과 같이 HTTP Method, Request URI, HTTP Version으로 구성됩니다.

Request Line

SP는 띄어쓰기, CRLF는 개행을 의미합니다.

 

Response message - Status Line

HTTP 요청이 Response인 경우에는 start line에 status line이 위치합니다. status line의 경우에는 다음과 같이 HTTP Version, Status Code, Reason Phrase로 구성됩니다.

 

참고 자료

RFC 2616 - HTTP/1.1