HTTP 메세지 구조
HTTP의 메세지는 3가지 부분으로 나뉘어져 있다.
- Start Line(시작 라인)
- Header(헤더)
- Body(바디)
HTTP메세지는 ASCII Characterset을 사용하는 문자열로 전송이 되기 때문에 필요한 부분을 파싱하기 위해서는 각 부분의 구조화가 필요하다. 각 부분은 다음과 같이 구조화된다.
Start Line
한 줄로 이루어져 있다. 첫 번째 줄이 무조건 시작 라인이 되며 시작 라인은 두 줄 이상은 될 수 없다.
Header
헤더는 첫 줄을 제외한 공백라인이 나오기 전까지의 줄이다. 헤더는 수십줄, 수백줄이 될 수도 있다.
Body
바디는 공백 라인 뒤의 모든 라인으로 이루어져 있다.
간단한 규칙이다. 자 그러면 각 부분에서 어떤 일을 하는지 살펴보자.
Start Line(시작 라인)
시작 라인은 요청 메세지인지 응답 메세지인지에 따라 다른 형식을 가진다.
Start Line(시작 라인) - 요청 메세지
클라이언트가 서버에 요청하는 메세지일 경우 시작 라인의 형식은 다음과 같다.
시작 라인은 HTTP Method, 경로 및 질의 정보(Path or Query), HTTP Version 세가지로 이루어진다.
HTTP Mehod
HTTP Method는 메세지를 수신하는 서버에서 어떤 작업을 해야 하는지를 알려준다. HTTP Method에는 GET, POST, PUT, PATCH, DELETE 등이 있다. <그림2>의 GET 메서드는 리소스를 조회하는 기능이다. 따라서 <그림3>과 같이 서버에서는 리소스 조회 후 결과값을 클라이언트에 반환해준다.
경로 및 질의 정보(Path or Query)
경로 및 질의 정보(Path or Query)는 리소스가 위치한 경로를 명시한다. <그림4>의 요청을 웹브라우저에 날렸을 때, <그림4>의 빨간색 밑줄 부분(Path or Query)이 <그림2>의 Path or Query 부분이 된다.
HTTP Version
HTTP는 버전 별로 프로토콜이 다르다. 예를 들어 전송계층 프로토콜은 HTTP/3은 UDP이고 HTTP/2는 TCP이다. 이러한 차이점을 인식하고 버전 별로 처리되어야 하는 방식이 다른 것이 있어 HTTP Version을 명시해준다.
Start Line(시작 라인) - 응답 메세지
위와 같은 요청이 클라이언트로 부터 있었을 때 서버의 응답 메세지는 HTTP Version, 응답 메세지 두 분으로 이루어진다.
HTTP Version
서버에서 보내는 HTTP 프로토콜의 버전이다.
응답 메세지
응답 메세지는 클라이언트의 요청 메세지가 잘 처리되었는지에 대한 응답을 해주는 것이다. 100~500번대의 응답 메세지가 있는데, 이는 이후 글에서 자세히 다루도록 하겠다.
헤더(Header)
헤더에는 HTTP 메세지에 대한 정보를 명시한다. <그림7>과 같은 서버에 요청하는 시작라인은 헤더의 kotlinworld.com를 Host로 하는 서버에 날아가야 한다. TCP에서 목적지에 대한 정보가 들어가지만, 하나의 IP Address는 여러 Host를 가질 수 있으므로 다음과 같이 사용해야 어떤 Host에 시작 라인 메서드가 질의되어야 하는지 알 수 있다.
이 외에도 Content-Type, Content-Length와 같은 Body의 Content Type과 Length를 명시하는 헤더 값이 있지만, 헤더 값은 수백개가 있으므로 이 정도로만 보고 넘어가도록 하겠다.
바디(Body)
메세지 바디에는 실제 전송을 하는 데이터가 들어간다. 요청 메세지의 GET메서드는 바디를 보통 가지고 있지 않으므로, 바디를 항상 가진 응답 메세지로 예시 그림을 그렸다.
정리
이 글에서는 HTTP 메세지가 어떤 구조를 가지는지를 알아봤다. HTTP 메세지 구조의 각 부분이 어떤 역할을 하는지 알고 가야 HTTP에 대한 자세한 내용을 배울 때 편리하다. 꼭 제대로 짚고 넘어가자.