1부 HTTP : HTTP 메시지
03. HTTP 메시지
🔔 HTTP 메시지는 HTTP 애플리케이션 간에 주고 받은 데이터의 블록들이다.
클라이언트, 서버, 프록시 사이를 흐른다.
🎨 01. 메시지 방향을 의미하는 용어
📌 01-1. 메시지는 원 서버 방향을 인바운드로 하여 송신된다.
🔔 원 서버란 전 세계에서 동시에 사용 가능한 하나의 서버를 뜻한다.
- 메시지가 원 서버로 향하는 것은 인바운드로 이동하는 것을 말한다.
- 모든 처리가 끝난 뒤에 메시지가 사용자 에이전트로 돌아오는 것은 아웃바운드로 이동하는 것을 뜻한다.

📌 01-2. 다운스트림으로 흐르는 메시지
- HTTP 메시지는 강물과 같이(위에서 아래로) 흐른다.
- 요청 메시지냐 응답 메시지냐에 관계없이 모든 메시지는 다운스트림으로 흐른다.
- 메시지의 발송자는 수신자의 업스트림이다.
- 요청에서는 프락시1이 프락시3의 업스트림이지만, 응답에서는 프락시3이 프락시1의 업스트림이다.

🎨 02. 메시지의 각 부분

- HTTP 메시지는 클라이언트로부터의 요청이나 서버로부터의 응답 중 하나를 포함한다.
- 메시지는 시작줄, 헤더 블록, 본문 이렇게 세 부분으로 이루어진다.
- 시작줄과 헤더는 그냥 줄 단위로 분리된 아스키 문자열이다. 각 줄은 캐리지 리턴(ASCII 13)과 개행 문자(ASCII 10)로 구성된 두 글자의 줄바꿈 문자열로 끝난다. 이 줄바꿈 문자열은 'CRLF'라고 쓴다.
CRLF는 Carriage Return (ASCII 13)과 Line Feed (ASCII 10)의 합성어로, 다음 줄로 넘어가기 위해 커서를 한 줄 아래로 이동 시키고(Line Feed) 가장 앞으로 옮기는 것(Carriage Return)을 뜻한다.
🔔 요청 메시지의 형식
<메서드> <요청 URL> <버전>
<헤더>
(개행)
<엔티티 본문>
🔔 응답 메시지의 형식
<버전> <상태 코드> <사유 구절>
<헤더>
(개행)
<엔티티 본문>
- 메서드는 클라이언트 측에서 서버가 리소스에 대해 수행해주길 바라는 동작이다.
- 요청 URL은 리소스를 지칭하는 완전한 URL 혹은 URL의 경로 구성요소이다.
📌 02-1. 시작줄
- 모든 HTTP 메시지는 시작줄로 시작한다.
- 요청 메시지의 시작줄은 무엇을 해야 하는지 말해준다.
- 응답 메세지의 시작줄은 무슨 일이 일어났는지 말해준다.
📌 02-2. 메서드

📌 02-3. 상태코드
- 상태 코드는 각 응답 메시지의 시작줄에 담겨 반환된다.
- 숫자로 된 코드 + 문자열로 된 사유 구절로 서로 일대일 대응한다.
🎨 03. 헤더
- 특정 종류의 메시지만 사용할 수 있는 헤더, 더 일반 목적으로 사용할 수 있는 헤더, 그리고 응답과 요청 메시지 양쪽 모두에서 정보를 제공하는 헤더로 나뉜다.
- 헤더는 크게 다섯가지로 분류된다.
- 일반 헤더는 응답 메시지 모두에서 사용되지만 컨텐츠 자체에는 적용되지 않는 HTTP 헤더이다.
- 클라이언트, 서버, 그리고 어딘가에 메시지를 보내는 다른 애플리케이션들을 위해 다양한 목적으로 사용된다.
- 가장 흔한 general 헤더는 Date, Cache-Control 및 Connection 이다.
- 요청 헤더는 HTTP 요청에서 사용되지만 메시지의 컨텐츠와는 관련이 없는 HTTP 헤더이다.
- 서버에게 클라이언트가 받고자 하는 데이터의 타입이 무엇인지와 같은 부가 정보를 제공한다.
- Accept, Accept-, If-와 같은 요청 헤더들은 조건부 요청 수행을 허용한다.
- Cookie, User-Agent (en-US), Referer와 같은 다른 것들은 컨텍스트를 정확히 나타내어 서버가 응답에 맞출 수 있게한다.
- 응답 헤더는 HTTP 응답에서 사용될 수 있는 HTTP 헤더이며, 메시지의 컨텐츠와는 관련 X
- Age, Location (en-US) 또는 Server와 같은 응답 헤더는 더 상세한 응답의 컨텍스트를 제공하기위해 사용된다.
- 엔티티 헤더는 메시지 바디의 컨텐츠를 나타내는 HTTP 헤더이다.
- 엔티티 헤더는 HTTP 요청 및 응답 모두에서 사용된다. Content-Length, Content-Language, Content-Encoding과 같은 헤더는 엔티티 헤더이다.
- 본문에 들어있는 데이터의 타입이 무엇인지 말해준다.
- 애플리케이션 개발자들에 의해 만들어졌지만 아직 승인된 HTTP 명세에는 추가되지 않은 비표준 헤더이다.
- HTTP 프로그램은 확장 헤더들에 대해 설령 그 의미를 모른다 할지라도 용인하고 전달해야 할 필요가 있다.