HTTP
는 HyperText Transfer Protocol의 줄임말로, HTML
과 같은 문서를 전송하기 위한 프로토콜이다.HTTP
는 웹 브라우저와 웹 서버의 소통을 위해 디자인되었다.HTTP Messages
양식에 맞춰 요청을 보내면,HTTP Messages
양식에 맞춰 응답한다.HTTP Messages
는 클라이언트와 서버 사이에서 데이터가 교환되는 방식이다.HTTP Messages
에는 다음과 같은 두 가지 유형이 있다.HTTP Messages
는 몇 줄의 텍스트 정보로 구성된다.
start line
:start line
에는 요청이나 응답의 상태를 나타낸다.
항상 첫 번째 줄에 위치하며, 응답에서는status line
이라고 부른다.HTTP headers
: 요청을 지정하거나, 메시지에 포함된 본문을 설명하는 헤더의 집합이다.empty line
: 헤더와 본문을 구분하는 빈 줄이 있다.body
: 요청과 관련된 데이터나 응답과 관련된 데이터 또는 문서를 포함한다.
요청과 응답의 유형에 따라 선택적으로 사용한다.
start line
과 HTTP headers
를 묶어 요청이나 응답의 헤드(head
)라고 하고,payload
는 body
라고 이야기한다.Stateless
는 말 그대로 상태를 가지지 않는 것을 의미한다.
즉, HTTP 프로토콜에서 클라이언트와 서버가 상호작용할 때 서버가 클라이언트의 상태를 추적하지 않는다는 것을 말한다.
예를 들어, 쇼핑몰에 로그인하거나 상품을 클릭하고 상세 화면으로 이동하고, 상품을 카트에 담거나 로그아웃할 수 있다.
하지만 이러한 동작들은 HTTP 프로토콜에서 추적되지 않는다.
즉, 클라이언트에서 발생한 상태 정보는 서버에서 추적되지 않는다.
따라서, 쇼핑몰에서 카트에 담기 버튼을 눌렀을 때 카트에 담긴 상품 정보(상태)는 서버에 저장해두어야 한다.
그러나 HTTP 프로토콜은 상태 정보를 저장하지 않는 프로토콜이기 때문에 다른 방법(쿠키-세션, API 등)을 통해 상태 정보를 저장하고 확인해야 한다.
이러한 Stateless
(무상태성)가 HTTP 프로토콜의 큰 특징이며, 상태 정보를 저장하지 않는 것이 HTTP 프로토콜의 원칙이다.
HTTP Requests
는 클라이언트가 서버에게 보내는 메시지이다.
Start line
에는 세 가지 요소가 있다.
- 수행할 작업(
GET
,PUT
,POST
등)이나 방식(HEAD
orOPTIONS
)을 설명하는HTTP method
를 나타낸다.
예를 들어GET method
는 리소스를 받아야 하고,POST method
는 데이터를 서버로 전송한다.
- 요청 대상(일반적으로
URL
이나URI
) 또는프로토콜
,포트
,도메인
의 절대 경로는 요청 컨텍스트에 작성된다. 이 요청 형식은HTTP method
마다 다르다.
- origin 형식 :
'?'
와 쿼리 문자열이 붙는 절대 경로이다.GET
,POST
,HEAD
,OPTIONS
등의 method와 함께 사용한다.
POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
- absolute 형식 : 완전한
URL
형식으로, 프록시에 연결하는 경우 대부분GET method
와 함께 사용된다.
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
- authority 형식 : 도메인 이름과 포트 번호로 이루어진
URL
의 일부분 이다.
HTTP 터널을 구축하는 경우,CONNECT
와 함께 사용할 수 있다.
CONNECT developer.mozilla.org:80 HTTP/1.1
- asterisk 형식 :
OPTIONS
와 함께 별표(*
) 하나로 서버 전체를 표현한다.
OPTIONS * HTTP/1.1
- HTTP 버전에 따라
HTTP message
의 구조가 달라진다.
따라서start line
에 HTTP 버전을 함께 입력한다.
Headers
는 기본 구조를 따른다.:
), 값을 입력한다.여러 종류의 헤더가 있고, 다음과 같이 그룹을 나눌 수 있다.
body
를 통해 전송되는 데이터와는 관련이 없는 헤더이다.fetch
를 통해 가져올 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더를 의미한다.User-Agent
, Accept-Type
, Accept-Language
와 같은 헤더는 요청을 보다 구체화한다.Referer
처럼 컨텍스트를 제공하거나 If-None
과 같이 조건에 따라 제약을 추가할 수 있다.Entity headers
로 불렀으며, body
에 담긴 리소스의 정보(콘텐츠 길이, MIME 타입 등)를 포함하는 헤더이다.HTTP messages
구조의 마지막에 위치한다.body
가 필요하지는 않는다.GET
, HEAD
, DELETE
, OPTIONS
처럼 서버에 리소스를 요청하는 경우에는 본문이 필요하지 않는다.POST
나 PUT
과 같은 일부 요청은 데이터를 업데이트하기 위해 사용된다.body
는 다음과 같이 두 종류로 나눌 수 있다.HTML form
과 관련이 있다.HTTP Responses
는 서버가 클라이언트에게 보내는 메시지이다.
응답의 첫 줄을 Status line
이라고 부르며, 다음의 정보를 포함한다.
HTTP/1.1
)200
, 302
, 404
등)Status line
의 한 예시로 HTTP/1.1 404 Not Found
가 있다.
HTTP headers
는 요청 헤더와 동일한 구조를 가지고 있다.:
), 값을 입력한다.요청의 헤더와 마찬가지로 몇 그룹으로 나눌 수 있다.
body
를 통해 전송되는 데이터와는 관련이 없는 헤더이다.Vary
, Accept-Ranges
와 같이 상태 줄에 넣기에는 공간이 부족했던 추가 정보를 제공한다.Entity headers
로 불렀으며, body
에 담긴 리소스의 정보(콘텐츠 길이, MIME 타입 등)를 포함하는 헤더이다.HTTP messages
구조의 마지막에 위치한다.body
가 필요하지는 않는다.201
, 204
와 같은 상태 코드를 가지는 응답에는 본문이 필요하지 않는다.응답의 body
는 다음과 같이 두 종류로 나눌 수 있다.
Single-resource bodies(단일-리소스 본문) :
Content-Type
, Content-Length
)로 정의한다.Transfer-Encoding
이 chunked
로 설정되어 있으며, 파일은 chunk
로 나뉘어 인코딩되어 있다.Multiple-resource bodies(다중-리소스 본문) : 서로 다른 정보를 담고 있는 body
이다.