HTTP 역사
- HTTP/0.9 1191년: GET 메서드만 지원, HTTP 헤더 x. 정적인 HTML 문서 전달에만 초점을 맞췄다.
- HTTP/1.0 1996년: POST, HEAD 메서드가 추가되고, 예전에 없던 헤더와 본문이 메시지 형식에 추가됐다. HTML 문서뿐만 아니라 이미지, 오디오, 비디오와 같은 미디어 형식의 파일도 전송할 수 있게 됐다.
- HTTP/1.1 1997년: 현재 사용하는 메서드가 모두 추가됐다. 한 번의 연결로 여러 요청과 응답을 보낼 수 있게 개선됨.
- HTTP/2 2015년: 1.1 버전에서 한 번의 연결로 보낼 수 있는 요청과 응답을 병렬로 보내게 함으로써 처리 속도 개선. 또한 헤더를 압축하게 함으로써 네트워크의 부하를 줄임.
- HTTP/3 진행중: 이전 버전은 모두 TCP를 사용해 데이터를 전송했는데 3 버전부터 QUIC 프로토콜로 데이터를 전송한다. 기존 HTTP 버전보다 통신의 신뢰성과 속도가 향상됐으며, 암호화를 기본적으로 제공해 보안 우수.
주목할 점은 기존 HTTP가 사용하던 전송 계층 프로토콜이 3 버전부터 TCP에서 QUIC 프로토콜로 변경됐다는 것이다. 신뢰성과 속도를 모두 챙긴 QUIC 프로토콜을 적용한 3버전은 현재 구글과 유튜브 등의 서비스에서 사용되고 있다.
1.1 버전과 2 버전도 여전히 활발히 사용되고 있으나 0.9 버전과 1.0 버전은 더 이상 사용되지 않는다.
HTTP /1.0
- 버전 정보가 각 요청에 포함되었다.
- 요청 메서드가 GET, HEAD, POST 세 가지로 확장되었다.
- 상태코드가 각 응답의 시작 부분에 포함되어 브라우저가 해당 내용을 보고 대처할 수 있게 되었다.
- HTTP 헤더 개념이 등장했다. 이는 요청과 응답에 대한 부가적인 메타데이터 전송을 허용하며 프로토콜을 유연, 확장 가능하게 만들었다.
- 새로운 HTTP 헤더의 등장 (Content-Type)으로 HTML 파일 이외의 다른 파일도 전송할 수 있게 되었다.
HTTP /1.1
-
1.0까지의 내용들 중 모호한 기능을 명확하게 하고 많은 개선사항들을 적용했다.

-
표준화 된 HTTP
-
연결 상태 유지(Persisted connection)
- HTTP/1.0 에서는 요청에 따른 응답이 수신되면 TCP 연결을 바로 종료했다. 웹 페이지가 복잡해지면서부터 문제가 발생. 매번 TCP 핸드셰이크 과정을 새로 거쳐야 해서 속도가 느려졌기 때문.
- HTTP/1.1에서 한번 수립한 연결을 재사용하게 설정. 지연 개선. But 연결 유지하는 시간이 길어질수록 서버에 부하가 생기기 때문에 연결을 유지하는 시간을 제한하고 있으면 이를 Keep-Alive라고 부른다.

-
파이프라이닝(Pipelineing)
- 클라이언트가 여러 요청을 연달아 보내야 할 때, 각 응답을 기다리는 것이 아니라 발생한 요청은 일단 전송하고 봄. 기존에는 여러 요청이 있을 때 하나의 요청-응답 세트로 반복하면서 처리했는데 이는 지연을 발생시킴.
-
이 외에도 HTML을 분할해 전송하는 청크 전송 인코딩(Chunked Transfer Encoding), 요청과 응답에 대한 메타 정보를 담는 캐시 제어(Cache-Control), 동일 IP에 여러 도메인을 호스트 할 수 있게 해주는 호스트(Host)등의 헤더와 기능이 추가 됨
HTTP/2
- HTTP/1.1 에서의 한계점
- 헤더의 중복: 매 요청마다 헤더를 중복해서 전송하는 과정에서 낭비 발생.
- HOLB(Head-of-Line Blocking) : 서버가 항상 요청받은 순서대로 응답해야 하기 때문에 발생.
- 1.1에서는 하나의 연결 내에서 응답 다중화(multiplexing)를 할 수 없었기 때문에 요청이 순차적으로 처리되어야 했는데, 서버가 응답 작성 중간에 문제가 생기면 후속 요청들이 전송되지 못하고 지연되는 문제
- 결국 1.1에서 TCP 연결을 최대 6개 동시에 연결하는 병렬 연결을 구현했지만 임시적인 해결책일 뿐이었다.
- 이 외에도 요청 별 우선순위를 지정할 수 없고, 클라이언트 기반 통신이기 때문에 서버에서 클라이언트 측으로 데이터를 전송할 수 있는 기능이 없다는 문제 있었다.
- HTTP/2는 SPDY라는 프로토콜을 기반으로 동작
- 1.1의 잘 알려진 성능 제한 사항을 해결하여 웹 페이지의 로드 대기 시간을 줄이는 것을 목표로 구글에서발표한 프로토콜
- 때문에 HTTP/2는 HTTP over SPDY 라는 이름으로도 불린다.

- 이진(binary)프로토콜.
- 1.1은 텍스트 기반 프로토콜이기 때문에 아스키코드로 작성되었다. 사람이 읽기엔 편하지만, 불필요하게 데이터가 커진다는 문제가 있었다.
- 바이너리로 변환하는 계층이 있어 단순 텍스트를 전송하는 것보다 훨씬 효율적으로 데이터를 전송할 수 있다.
- 응답 다중화(multiplexing) 지원
- 1.1에서는 TCP 연결에서 한 번에 하나의 요청만 처리 가능하며 요청 별 순서를 반드시 지켜야 했던 것과 대조적
- 2에서는 하나의 TCP 연결에서 여러 요청을 동시에 처리할 수 있음.
- 이것은 TCP 연결을 스트림(stream), 메시지(message), 프레임(frame) 이라는 단위로 더욱 세분화했기 때문임


HTTP/3
- HTTP/2는 여전히 TCP 위에서 동작하기 때문에 TCP로 인해 발생하는 문제를 해결할 수 없었다.
- 3은 QUIC 이라는 프로토콜 위에서 동작한다.
- QUIC: TCP의 신뢰성 보장을 위해 제공되는 기능들을 UDP 기반으로 직접 구현하여 성능을 개선한, 구글이 2013년에 공개한 프로토콜


참고