HTTP/2는 2015년 표준화된 HTTP 버전으로, HTTP/1.1의 성능 한계를 극복하기 위해 설계되었습니다.
HTTP/1.1 파이프라이닝은 여러 요청을 순서대로 보낼 수 있지만, 응답은 반드시 순서대로 받아야 합니다. 첫 번째 응답이 늦으면 나머지가 모두 기다립니다.
같은 헤더를 매 요청마다 반복 전송합니다. User-Agent, Cookie 등의 헤더가 크면 낭비가 심합니다.
요청과 응답을 스트림 단위로 분리합니다. 하나의 연결에서 여러 스트림이 동시에 진행되어 HOL Blocking이 해소됩니다.
[TCP 연결 1개]
스트림 1: GET /index.html (요청/응답)
스트림 2: GET /style.css (동시 처리)
스트림 3: GET /app.js (동시 처리)
중복 헤더를 보내지 않아 전송량이 크게 줄어듭니다.
HTML 응답과 함께 CSS, JS 파일을 미리 전송합니다. 클라이언트가 파싱 후 별도로 요청할 필요가 없어 지연이 줄어듭니다.
HTTP/1.1이 텍스트 기반인 것과 달리, HTTP/2는 바이너리 형식으로 통신합니다. 파싱이 효율적이고 오류에 강합니다.
요청마다 우선순위를 설정할 수 있습니다. 중요한 리소스를 먼저 받을 수 있게 됩니다.
| 항목 | HTTP/1.1 | HTTP/2 |
|---|---|---|
| 전송 형식 | 텍스트 | 바이너리 |
| 멀티플렉싱 | 없음 | 있음 |
| 헤더 압축 | 없음 | HPACK |
| 서버 푸시 | 없음 | 있음 |
| HOL Blocking | 있음 | TCP 수준에서 여전히 존재 |
HTTP/2가 애플리케이션 수준의 HOL Blocking은 해결했지만, TCP 패킷 손실 시 해당 연결의 모든 스트림이 기다려야 하는 TCP 수준 HOL Blocking은 남아있습니다. 이를 해결하기 위해 HTTP/3는 UDP 기반의 QUIC을 도입했습니다.