
이 글은 'HTTP 완벽 가이드' 책을 읽고 정리한 내용입니다.
HTTP가 인터넷의 배달원이라면, HTTP 메시지는 무언가를 담아 보내는 소포와 같다.
메시지는 클라이언트, 서버, 프락시 사이를 흐르며 메시지의 방향을 의미하는 용어는 다음과 같다.
- 인바운드
- 아웃바운드
- 업스트림
- 다운스트림

HTTP 메시지는 강물과 같이 흐른다. 요청, 응답 메시지에 관계없이 모든 메시지는 다운스트림으로 흐른다.


메시지는 시작줄, 헤더 블록, 본문 이렇게 세 부분으로 이루어진다.
\r\n모든 HTTP 메시지는 "요청 메시지" , "응답 메시지" 으로 분류된다.
<메서드> <요청 URL> <버전>
<헤더>
<엔터티 본문>
<버전> <상태코드> <사유 구절>
<헤더>
<엔터티 본문>
모든 HTTP 메시지는 시작줄로 시작하며 이것이 어떤 메시지인지 서술한다.
- 요청 메시지 : 무엇을 해야하는지
- 응답 메시지 : 무슨일이 일어났는지
해당 부분에서 서버에서 어떤 동작이 일어나야 하는지 설명해준다.
해당 부분에서 수행 결과에 대한 정보를 클라이언트에게 돌려준다.
메서드 : 서버에게 무엇을 해야하는지 말해주는 역할

상태 코드 : 클라이언트에게 무엇이 일어났는지 말해주는 역할

(상태 코드에 대한 자세한 설명은 생략)
사유 구절 : 상태 코드에 대한 글로 된 설명, 응답 시작줄의 마지막 구성요소
버전 번호 : 'HTTP/x.y'형태로 요청, 응답 메세지 양쪽 모두에 기술된다.
헤더와 메서드는 클라이언트와 서버가 무엇을 하는지 결정하기 위해 함께 사용된다.
헤더는 크게 다섯가지로 분류된다.

일반 캐시 헤더
HTTP/1.0에 도입된 것으로 매번 원 서버로부터 객체를 가져오는 대신, 로컬 복사본으로 캐시할 수 있는 헤더이다.
(캐시에 대한 내용은 7장에서 자세히 설명)
요청 정보 헤더

요청 헤더의 종류
요청 헤더에는 기능에 따라 4가지로 분류된다.
1. Accept 관련 헤더 : 클라이언트가 무엇을 원하고 할 수 있는지에 대한 정보를 알려줄 수 있다. 이는 사용할 수 없는 것을 전송하는데 시간과 대역폭을 낭비하지 않기 때문에 서버, 클라이언트 양쪽 모두에게 유익하다.
2. 조건부 요청 헤더 : 이 요청 헤더를 사용하여 클라이언트는 서버에게 요청에 응답하기 전 자신이 설정한 조건이 참인지 확인하게 하는 제약을 포함시킬 수 있다.( 예를 들어 클라이언트 문서 사본 요청 시, 자신이 가지고 있는 사본과 다를 경우에만 전송을 해라)
3. 요청 보안 헤더 : 자체적으로 요청을 위한 간단한 인증요구/응답 체계를 가지고 있다. 이는 인증을 통해 트랜잭션을 더 안전하게 만들 수 있다.
4. 프락시 요청 헤더 : 프락시 서버의 기능을 돕기 위한 헤더
응답 정보 헤더
엔터티 정보 헤더

1. 콘텐츠 헤더 : 엔터티의 콘텐츠에 대한 구체적인 정보를 제공한다. (종류, 크기 등)
2. 엔터티 캐싱 헤더 : 리소스에 대해 키시된 사본이 아직 유효한지, 유효만료 시점이 언제인지 등
확장 헤더는 애플리케이션 개발자들에 의해 만들어졌지만 아직 승인된 HTTP 명세에는 추가되지 않는 비표준 헤더이다.
엔터티 본문이라고도 불리는 해당 부분은 HTTP 메세지의 화물이라고 할 수 있다.
HTTP가 수송하도록 설계된 것들로 HTTP 메시지는 이미지, 비디오, HTML 문서, 소프트웨어 애플리케이션, 신용카드 트랜잭션, 전자우편 등 여러 종류의 디지털 데이터를 실어 나를 수 있다.