HTTP는 웹에서 클라이언트와 서버가 데이터를 주고받는 프로토콜이다. 1991년 처음 등장한 이후 꾸준히 발전해왔는데, 각 버전이 어떤 문제를 해결하기 위해 나왔는지를 흐름으로 이해하면 훨씬 쉽게 정리된다.
HTTP/0.9 (1991)
- GET 메서드만 존재
- 응답은 HTML 문서만 가능 (헤더 없음)
- 요청 1건 처리 후 연결 즉시 종료
거의 원시적인 수준. 텍스트 한 줄 요청하고 HTML 한 줄 받는 게 전부였다.
HTTP/1.0 (1996)
- 헤더(Header) 개념 도입 → 메타데이터 전송 가능
- GET 외에 POST, HEAD 메서드 추가
- 상태 코드(Status Code) 도입 (200, 404 등)
- 요청마다 새 TCP 연결 생성 → 비효율적
헤더가 생기면서 쓸만해졌지만, 매번 새 TCP 연결을 만드는 게 큰 낭비였다.
HTTP/1.1 (1997) — 오랫동안 표준
- Keep-Alive (지속 연결): 하나의 TCP 연결로 여러 요청 처리
- 파이프라이닝(Pipelining): 응답 대기 없이 요청 연속 전송 (단, HOL Blocking 문제 존재)
- 청크 전송 인코딩(Chunked Transfer): 데이터를 나눠서 전송 가능
- Host 헤더 필수화 → 가상 호스팅 지원
- PUT, DELETE, OPTIONS 등 메서드 추가
HOL Blocking: 앞선 요청이 막히면 뒤의 요청도 전부 대기하는 문제. 파이프라이닝의 치명적 한계였다.
지속 연결 덕분에 훨씬 효율적으로 바뀌었다. 약 20년간 웹의 기본 프로토콜로 사용됐다.
HTTP/2 (2015)
- 바이너리 프레이밍(Binary Framing): 텍스트 대신 바이너리로 통신 → 파싱 효율 향상
- 멀티플렉싱(Multiplexing): 하나의 TCP 연결에서 여러 요청/응답을 동시에 처리 → HTTP 레벨 HOL Blocking 해소
- 헤더 압축(HPACK): 반복되는 헤더를 압축해 전송량 감소
- 서버 푸시(Server Push): 클라이언트 요청 없이 서버가 리소스를 미리 전송
- 스트림 우선순위 설정 가능
멀티플렉싱이 핵심. HTTP 레벨 HOL Blocking은 해결됐지만, TCP 레벨에서는 여전히 문제가 남아 있었다.


HTTP/3 (2022)
- TCP 대신 QUIC 프로토콜 사용 (UDP 기반)
- TCP 레벨 HOL Blocking 완전 해소: 패킷 손실이 다른 스트림에 영향 없음
- 연결 수립 속도 향상: TLS 핸드셰이크를 QUIC과 통합 (0-RTT/1-RTT)
- 연결 마이그레이션: Wi-Fi → LTE 전환 시에도 연결 유지
모바일 환경에서 특히 강력하다. 네트워크가 바뀌어도 연결이 끊기지 않는다는 게 체감상 크다.

한눈에 비교
| 항목 | 1.0 | 1.1 | 2 | 3 |
| 전송 방식 | 텍스트 | 텍스트 | 바이너리 | 바이너리 |
| 연결 방식 | 매번 새 연결 | 지속 연결 | 지속 연결 | QUIC |
| 멀티플렉싱 | ❌ | ❌ | ✅ | ✅ |
| HOL Blocking | 있음 | TCP+HTTP | TCP만 | 없음 |
| 헤더 압축 | ❌ | ❌ | HPACK | QPACK |
| 기반 프로토콜 | TCP | TCP | TCP | UDP(QUIC) |
정리하면서 느낀 점
각 버전은 이전 버전의 단점을 명확히 겨냥해서 나왔다.
1.1은 매번 TCP 연결을 새로 만드는 낭비를 없애고, 2는 HOL Blocking을, 3은 TCP 자체의 한계를 QUIC으로 대체했다.