HTTP메시지는 HTTP 애플리케이션간에 주고 받은 데이터의 블록들이다.
각 데이터 블록들은 메시지의 내용과 의미를 설명하는 텍스트 메타 정보로 식작하고 그 다음에 선택적으로 데이터가 올 수 있다.
메시지는 클라이언트, 서버, 프록시 사이에 흐른다.
inbound
outbound
upstream
downstream
은 메시지의 방향을 의미한다.
인바운드와 아웃바운드는 트랜잭션 방향을 표현하기 위해 사용된다.
메시지가 서버 방향으로 향하는 것은 인바운드이고, 모든 처리가 끝난뒤에 메시지가 클라이언트 방향으로 흐르는 것을 아웃바운드라고 한다.
HTTP메시지는 요청메시지 인지 응답 메시지인지 관계없이 다운스트림으로 흐른다. 메시지의 발송자는 수신자의 업스트림이다.
HTTP 메시지는 데이터의 구조화된 블록이다. 각 메시지는 클라이언트로 부터 요청이나 서버로 부터의 응답 중 하나를 포함하며 시작줄, 헤더블록, 본문 세 부분으로 나눠진다.
시작 줄은 HTTP메시지가 어떤 메시지인지 서술하고, 헤더 블록은 메시지의 속성을, 본문은 데이터를 담고 있고 없을 수도 있다.
시작 줄과 헤더는 줄 단위로 분리된 아스키 문자열로 이루어져 있으며, 각 줄은 캐리지 리턴과 개행문자로 구성된 두 자의 줄바꿈 문자열로 끝난다. 이 줄바꿈 문자열은 ‘CRLF’라고 쓴다.
엔티티 본문이나 메시지본문은 단순히 선택적인 데이터 덩어리이다. 텍스트나 이진 데이터를 포함 할 수도 있고 비어 있을 수도 있다.
헤더는 본문에 대한 많은 정보를 준다. Content-type은 본문이 어떤 타입으로 되어있는지 설명하고 Content-length는 본문의 크기를 말해준다.
요청 메시지는 웹 서버에 특정 동작을 요구하며, 응답 메시지는 요청의 결과를 클라이언트에게 돌려준다.
요청 메시지의 형식은 다음과 같다
<메소드> <요청URL> <버젼>
<헤더>
<엔티티 본문>
응답 메시지 형식은 다음과 같다
<버전> <상태코드> <사유 구절>
<헤더>
<엔티티 본문>
시작줄에서만 문법이 다르다.
상태코드
요청 중에 무엇이 일어났는지 설명하는 세자리 숫자인다.
사유구절
상태 코드의 의미를 사람이 이해 할 수 있는 설명해주는 짧은 문구로, 상태 코드 이후부터 CRLF까지가 사유구절이다.
사유 구절은 오로지 사람에게 읽히기 위해 작성된다. 사유구절이 다르더라도 상태코드가 동일하다면 동등하게 처리된다.
엔티티 본문
임의의 데이터 블록을 포함한다. 단 모든 메시지가 엔티티 본문을 갖지는 않고 때때로 헤더의 마지막인 CRLF로 끝나게 된다.
모든 HTTP메시지는 시작줄로 시작한다.
요청줄
요청 메시지의 시작줄인 요청줄에는 서버에서 어떤 동작이 일어나야 하는지 설명하는 메서드와 그 동작에 대한 대상을 지칭하는 요청 URL이 들어있으며 HTTP버전도 포함하고 있다.
요청URL
요청 대상이 되는 리소스를 지칭하는 완전한 URL이거나 URL의 경로 구성 요소이다.
클라이언트가 서버와 직접 대화하고 있고, 경로 구성요소가 리소스를 가리키는 절대 경로이기만 하면 대체로 문제없이 서버는 URL에서 생략된 호스트/포트가 자신을 가리키는 것으로 간주한다.
버전
메시지에서 사용중인 HTTP의 버전이다
HTTP/<major>.<minor>
형식으로 작성한다.
메서드
요청의 시작 줄은 메서드로 시작하며, 서버에게 무엇을 해야 하는지 말해준다.
HTTP 명세는 공통 요청 메서드의 집합을 정의한다.
메서드 | 설명 |
---|---|
GET | 서버에서 어떤 문서를 가져온다. |
HEAD | 서버에서 어떤 문서에 대한 헤더만 가져온다. |
POST | 서버가 처리해야 할 데이터를 보낸다. 메시지 본문이 존재한다 |
PUT | 서버에 요청 메시지의 본문을 저장한다. 메시지 본문이 존재한다 |
TRACE | 메시지가 프록시를 거쳐 서버에 도달하는 과정을 추적한다 |
OPTIONS | 서버가 어떤 메서드를 수행할 수 있는지 확인한다. |
DELETE | 서버에서 문서를 제거한다. |
어떤 서버는 그들만의 메서드를 추가로 구현했을 수도 있으며, 이런 추가 메서드는 HTTP명세를 확장하는 것이기 때문에 확장 메서드라고 불린다.
응답줄
수행 결과에 대한 상태 정보와 결과 데이터를 클라이언트에게 돌려준다.
HTTP의 버전과 숫자로 된 상태코드, 수행 상태에 대한 사유구절이 들어있다.
상태 코드
클라이언트에게 서버에서 무엇이 일어났는지 말해준다.
상태 코드는 응답 메시지에 시작줄에 위치하며, 숫자로 된 코드와, 문자열로 이루어진 사유 구절로 구성되어 있다.
범위 | 정의된 범위 | 분류 |
---|---|---|
100-199 | 100-101 | 정보 |
200-299 | 200-206 | 성공 |
300-399 | 300-305 | 리다이렉션 |
400-499 | 400-415 | 클라이언트 에러 |
500-599 | 500-505 | 서버 에러 |
만약 인식할 수 없는 상태코드를 받았다면 프로토콜의 확장으로 정의된 상태코드일 것이다.
다만 개발자는 그 상태코드를 범주의 일반적인 구성원으로 가정하고 다루어야 한다.
사유 구절
사유 구절은 상태코드와 일대일로 대응된다. 사유 구절은 상태 코드의 사람이 이해하기 쉬운 버젼이다.
버전
HTTP애플리케이션들이 자신이 따르는 프로토콜의 버전을 상대방에게 말해주기 위한 수단이다.
하위 호환은 지원하지만, 상위 호환은 지원하지 않을수 있다.
쉽게 말해 1.1버전과 상호작용하는 1.2버전애플리케이션의 경우는 의도한 대로 동작하지 않을 수 있다. 1.1 버전 애플리케이션이 1.2버전의 기능을 구현하지 않았을 것이기 때문이다.
HTTP헤더는 요청과 응답 메시지에 추가 정보를 더한다. 기본적으로 이름/값 의 목록이다.
헤더는 일반적으로, 일반헤더, 요청헤더, 응답헤더, 엔티티 헤더, 확장 헤더로 분류된다.
엔티티 본문은 HTTP메시지의 화물이라고 할 수 있다.
HTTP 메시지는 이미지, 비디오, HTML문서, 텍스트 문서등 여러 종류의 데이터를 나를 수 있다.