- HTTP를 인터넷의 배달원이라 비유한다면, HTTP 메시지는 무언가를 담는 소포 또는 박스라고 말할 수 있다.
- HTTP 메시지는 HTTP 애플리케이션 간에 주고받은 데이터의 블록이다.
- 이 데이터의 블록들은 메시지의 내용과 의미를 설명하는 텍스트 메타 정보로 시작하고 다음에 선택적으로 데이터가 올 수 있다.
- HTTP는 트랜잭션 방향을 표현하기 위해 인바운드와 아웃바운드라는 용어를 사용한다.
- 인바운드 : 메시지가 원 서버로 향하는 것
- 아웃바운드 : 모든 처리가 끝난 뒤, 메시지가 사용자 에이전트로 돌아오는 것
- HTTP 메시지는 요청 메시지, 응답 메시지에 관계없이 모든 메시지는 다운스트림으로 흐른다.
- HTTP 메시지는 단순한 데이터의 구조화된 블록이다.
- 각 메시지는 클라이언트의 요청이나 서버로부터의 응답 중 하나를 포함한다.
- 메시지는 시작줄, 헤더 블록, 본문 세 부분으로 이루어진다.
- 시작줄 : 어떤 메시지인지 서술
- 헤더 블록 : 속성
- 본문 : 데이터(없을 수도 있음)
- 시작줄과 헤더는 줄 단위로 분리된 아스키 문자열이다.
- 각 줄은 캐리지 리턴(ASCII 13)과 개행 문자(ASCII 10)로 구성된 두 글자의 줄바꿈 문자열(CRLF)로 끝난다.
- 본문은 단순히 선택적인 데이터 덩어리. 텍스트나 이진 데이터를 포함할 수도 비어있을 수도 있다.
[메서드] [요청 URL] [HTTP 버전]
[헤더]
[본문]
GET /specials/saw-blade.gif HTTP/1.0
Host: www.joes-hardware.com
- 응답 메시지 형식
[HTTP 버전] [상태 코드] [사유 구절]
[헤더]
[본문]
HTTP/1.0 200 OK
Content-Type: image/gif
Content-Length: 8572
- 클라이언트 측에서 서버가 리소스에 수행해주길 바라는 동작
- GET, HEAD, POST 등과 같이 한 단어로 되어 있다.
- 요청 대상이 되는 리소스를 지칭한 완전한 URL 혹은 URL의 경로 구성요소
- 이 메시지에서 사용 중인 HTTP 버전이다.
- HTTP/<메이저>.<마이너>
- 요청 중에 무엇이 일어났는지 설명하는 세 자리의 숫자
- 각 코드의 첫 번째 자릿수는 상태의 일반적인 분류를 나타낸다. (2- 성공, 4- 클라이언트 문제, 5- 서버문제)
- 숫자로 된 상태 코드의 의미를 사람이 이해할 수 있게 설명해주는 짧은 문구
- 이름, 콜론(:), 선택적인 공백, 값, CRLF가 순서대로 나타나는 0개 이상의 헤더들
- 임의의 데이터 블록을 포함한다.
- 모든 메시지가 본문을 갖는 것은 아니기 때문에, 때때로 메시지는 CRLF로 끝나게 된다.
모든 HTTP 메시지는 시작줄로 시작한다. 요청 메시지의 시작줄은 무엇을 해야 하는지 말해준다.
응답 메시지의 시작줄은 무슨 일이 일어났는지 말해준다.
- 요청 메시지는 서버에게 리소스에 대해 무언가 해달라고 부탁한다.
- 서버에 어떠한 동작이 일어나야 하는지 설명해주는 메서드와 그 동작에 대한 대상을 지칭하는 요청 URL이 있다.
- 클라이언트의 HTTP 버전도 포함되어 있다.
- 이 모든 필드는 공백으로 구분된다.
- 응답 메시지는 수행 결과에 대한 상태 정보와 결과 데이터를 클라이언트에게 돌려준다.
- 응답 메시지에 쓰인 HTTP 버전, 숫자로된 상태 코드, 수행 상태에 대해 설명해주는 텍스트로 된 사유 구절이 들어 있다.
-
요청의 시작 줄은 메서드로 시작하며, 서버에게 무엇을 해야 하는지 말해준다.
-
HTTP 명세는 공통 요청 메서드의 집합을 정의한다.
메서드 설명 본문 여부 GET 서버에서 어떤 문서를 가져온다. NO HEAD 서버에서 어떤 문서에 대해 헤더만 가져온다. NO POST 서버가 처리해야 할 데이터를 보낸다. YES PUT 서버에 요청 메시지의 본문을 저장한다. YES TRACE 메시지가 프록시를 거쳐 서버에 도달하는 과정을 추적한다. NO OPTIONS 서버가 어떤 메서드를 수행할 수 있는지 확인한다. NO DELETE 서버에서 문서를 제거한다. NO -
모든 서버가 표의 메서드를 구현한 것은 아니다.
-
상태 코드는 클라이언트에게 무엇이 일어났는지 말해준다.
-
상태 코드는 응답의 시작줄에 위치한다.
-
상태 코드는 각 응답 메시지의 시작줄에 담겨 반환된다.
-
숫자로된 코드와 문자열로 구성되어 있어 사람이 이해하기 쉬운 메시지 두 형태로 반환된다.
-
상태 코드들은 세 자리 숫자로 된 코드값을 기준으로 분류된다.
전체 범위 정의된 범위 분류 100-199 100-101 정보 200-299 200-206 성공 300-399 300-305 리다이렉션 400-499 400-415 클라이언트 에러 500-599 500-505 서버 에러
- 사유 구절은 응답 시작줄의 마지막 구성요소
- 상태 코드에 대한 글로 된 설명을 제공
- 사유 구절은 엄격한 규칙이 없기 때문에 형식이 자유로운 편이다.
- 버전 번호는 HTTP/x.y 형식으로 요청과 응답 메시지 양쪽 모두에 기술된다.
- 버전 번호는 HTTP로 대화하는 애플리케이션들에게 대화 상대의 능력과 메시지의 형식에 대한 단서를 제공해주기 위한 것
- 버전 번호는 애플리케이션이 지원하는 가장 높은 HTTP 버전을 가리킨다.
- 버전 번호는 분수가 아니기 때문에 숫자를 따로 따로 비교해야 한다. (HTTP/2.22 > HTTP/2.3)
- HTTP 헤더 필드는 요청과 응답 메시지에 추가 정보를 더한다.
- 기본적으로 이름/값 쌍 목록으로 구성되어 있다.(Content-type: 19)
- 일반 헤더 : 요청의 응답 양쪽에 모두 나타날 수 있음
- 요청 헤더 : 요청에 대한 부가 정보를 제공
- 응답 헤더 : 응답에 대한 부가 정보를 제공
- Entity 헤더 : 본문 크기와 콘텐츠 혹은 리소스 그 자체를 서술
- 확장 헤더 : 명세에 정의되지 않은 새로운 헤더
- 헤더 줄은 여러 줄로 쪼개서 더 읽기 좋게 만든다. 최소 하나의 스페이스 또는 탭 문자가 와야 한다.
HTTP/1.0 200 OK
Content-Type: image/gif
Content-Length: 8572
Server: Test Server
Version 1.0
- HTTP 메시지의 세 번째 부분은 선택적인 엔터티 본문이다.
- 엔터티 본문 = 메시지의 화물
- HTTP 메시지는 이미지, 비디오, HTML 문서, 소프트웨어 애플리케이션, 신용카드 트랙잭션, 전자 우편 등 여러 종류의 디지털 데이터를 나를 수 있다.
- HTTP 버전 0.9는 HTTP 프로토콜의 초기 버전이다.
- 현재 HTTP가 갖고 있는 요청과 응답 메시지의 시초이기 때문에 훨씬 단순한 프로토콜로 구성되어 있다.
- HTTP/0.9 메시지도 마찬가지로 요청과 응답으로 이루어져 있지만, 요청은 그저 메서드와 요청 URL을 갖고 있을 뿐이며, 응답은 오직 엔터티로만 되어 있다.
- 상태 코드 X, 사유 구절 X, 헤더 X