HTTP는 HyperText Transfer Protocol의 약자로, 문서 간의 링크를 전송하는 프로토콜이다.
처음에는 HyperText(HTML)를 전송하는 프로토콜로 시작하였으나, 지금은 text, image, 음성, 영상, JSON, XML 등 거의 모든 형태의 데이터를 HTTP 프로토콜로 전송한다.
HTTP/1.1과 HTTP/2는 TCP 기반 프로토콜이며, HTTP/3는 UDP 기반 프로토콜이다.
현재 HTTP/1.1이 주로 사용되고 있으나, HTTP/2 와 HTTP/3의 사용도 점점 증가하고 있다.
서버가 클라이언트의 상태를 보존하는 Stateful(상태유지) 라면, 항상 같은 서버가 유지되어야 한다. 만약 서버1과 통신을 하다가 서버 장애가 발생해 서버 2와 통신하게 된다면, 서버 1과 통신했던 절차들을 처음부터 다시 밟아야 한다. 서버2는 클라이언트와 처음 통신하므로 이전에 어떤 상태를 주고받았는지 모르기 때문이다.
그래서 HTTP 서버가 클라이언트의 상태를 보존하지 않는 Stateless(무상태)이기 때문에, 클라이언트는 이어지는 요청이라도 상태를 반복해서 보내주어, 필요한 정보를 모두 받아 올 수 있다.
장점: Stateless는 어떤 서버와도 통신이 가능하기 때문에, 서버 확장에 유리하다.
단점: 필요한 정보를 모두 받아와야 하므로, 클라이언트에서 많은 양의 데이터를 보내게 될 수 있다.
서버 1,2,3이 존재하고 연결을 유지하는 모델이라고 하자. 그러면 내가 서버 1과 통신할 때도, 서버 2, 3과도 연결을 유지해야 하기 때문에 의미 없는 서버 자원 소모가 발생하므로 비효율적이다.
{: width="50%" height="50%"}
{: width="50%" height="50%"}
request-line
method (SP(공백)) request-target (SP) HTTP-version CRLF(empty line)
HTTP 메서드
서버가 수행해야 할 동작을 지정하며, GET, POST, PUT, DELETE.. 등이 있다.
요청 대상
absolute-path[?query] (절대경로 = "/"로 시작하는 경로)
HTTP 버전
사용되는 HTTP 버전을 적어준다.
{: width="50%" height="50%"}
status-line
HTTP-version (SP) status-code (SP) reason-phrase CRLF(empty line)
HTTP버전, HTTP status-code, response-message가 들어간다.
header
header-field = field-name ":" OWS field-value OWS (OWS: 띄어쓰기 허용)
HTTP message-body
실제 전송할 데이터를 포함한다.