HTTP 메세지란 무엇인가
HTTP메세지는 HTTP를 통해 통신하는 클라이언트와 서버 사이에서 주고받는 데이터의 블록들이다.
HTTP메세지는 클라이언트가 서버에게 보내는 요청 메세지와 서버가 클라이언트로 보내는 응답 메세지가 있다.
메세지는 시작줄, 헤더 블록, 본문 세 부분으로 이루어진다.
시작줄은 해당 메세지가 어떤 메세지인지 간략하게 서술하고
헤더 블록은 메세지의 속성을 말해주고
본문은 보내고자하는 데이터를 가지고 있고 생략이 가능하다.
요청 메시지의 형식은
<메서드> <요청 url> <버전>
<헤더>
<엔터티 본문>
응답 메시지의 형식은
<버전> <상태 코드> <사유 구절>
<헤더>
<엔터티본문>
으로 이루어져 있다.
각 부분에 대해 자세히 알아보자.
- 메서드
메서드는 클라이언트 측에서 서버가 어떠한 동작을 해주기를 원하는지 알려주는 것이다.
대표적으로 사용되는 메서드는 아래의 표와 같다.
- 요청 URL
요청 대상이 되는 리소스를 지정한 URL을 의미한다.
- 버전
해당 HTTP메세지에서 사용 중인 HTTP의 버전을 의미한다.
- 상태 코드
클라이언트의 요청에 대해 어떻게 처리되었는지 알려주는 것으로 세 자리의 숫자로 표현된다.
각 코드의 첫 번째 자릿수는 상태의 일반적인 분류(성공, 에러 등)을 의미한다.
200~299는 요청에 대한 처리가 성공했음을 나타내고
300~399는 요청한 리소스가 다른 위치로 옮겨졌음을 나타내고
400~499는 클라이언트의 요청이 잘못되었음을 나타내고
500~599는 서버에서 에러가 났다는 것을 나타낸다.
- 사유 구절
숫자로 된 상태코드의 의미를 사용자(사람)이 이해할 수 있게 설명해주는 짧은 문구로 사유 구절은 오직 사람이 읽고 이해하기 위한 목적으로만 사용되고 프로그램은 상태 코드를 보고 처리한다.
- 헤더
이름, 콜론(:), 선택적인 공백, 값, CRLF(줄바꿈을 의미)가 순서대로 나타나고 헤더 부분은 빈 줄로 끝나 헤더 목록의 끝과 엔터디 본문의 시작을 표시한다.
헤더는 다음과 같이 분류된다.
헤더 분류 | 설명 |
일반 헤더 | 요청메세지와 응답메세지에 모두 나타날 수 있는 헤더로 부가 정보를 제공 |
요청 헤더 | 요청메세지에 나타나는 헤더로 요청에 대한 부가 정보를 제공 |
응답 헤더 | 응답메세지에 나타나는 헤더로 응답에 대한 부가 정보를 제공 |
엔터디 헤더 | 본문 크기와 콘텐츠, 리소스에 대해 서술 |
확장 헤더 | 명세(표준적으로 정의된 헤더)에 정의되지 않은 새로운 헤더 |
실제 사용되는 헤더를 예시로 들면 아래와 같다.
Date: Tue, 15 Nov 2020 02:14:22 GMT
(서버가 응답메세지를 만든 시작을 의미)
Content-length: 19312
(19312바이트 길이의 데이터가 엔터티 본문에 있다는 것을 의미)
Content-type: image/jpg
(엔터티 본문이 jpg이미지라는 것을 의미)
- 엔터티 본문
엔터티 본문은 HTTP 메세지가 가지는 임의의 데이터 블록으로 모든 HTTP메세지가 엔터티 본문을 가지고 있지는 않다.엔터티 본문이 없는 메세지의 경우 헤더의 집합이 빈 줄(CRLF)로 끝나게 된다.
하지만, CRLF를 쓰지 않고 끝나는 메세지도 받아들일 수 있도록 설계되어야 한다.