HTTP/1.1·HTTP/2·HTTP/3의 차이: 전송 방식·다중화·HOL 블로킹·헤더 압축·암호화 비교
세 버전은 메서드, 상태 코드, 헤더 필드 같은 HTTP의 의미(RFC 9110)를 공유하며, 다른 것은 그것을 운반하는 형식과 트랜스포트입니다. HTTP/1.1(RFC 9112)은 TCP 위에서 텍스트 메시지를 보내고, 각 연결에서 응답을 하나씩 돌려줍니다. HTTP/2(RFC 9113)는 메시지를 바이너리 프레임으로 나누고, 하나의 TCP 연결 위에서 여러 스트림을 다중화합니다. HTTP/3(RFC 9114)는 UDP 위에서 동작하는 QUIC(RFC 9000)을 쓰며, 스트림 다중화와 TLS 1.3 암호화를 트랜스포트에서 처리합니다. 이로써 패킷 하나의 손실이 모든 스트림을 멈추게 하는 TCP의 HOL 블로킹(head-of-line blocking)을 피합니다.
| 비교 항목 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 사양 | RFC 9112(의미는 세 버전 공통인 RFC 9110) | RFC 9113 | RFC 9114(QUIC은 RFC 9000) |
| 트랜스포트 | TCP | TCP | QUIC(UDP 위에서 동작) |
| 메시지 형식 | 텍스트: 요청 줄과 헤더 필드를 한 줄에 하나씩 씁니다 | 바이너리 프레임 | 바이너리 프레임(QUIC 스트림 위) |
| 다중화 | 없음. 한 연결은 한 번에 요청과 응답 하나만 처리하므로, 병렬로 가져오려면 여러 연결을 열어야 합니다 | 하나의 TCP 연결 위에서 여러 스트림을 병렬로 보냅니다 | 여러 QUIC 스트림을 병렬로 보냅니다. 스트림은 트랜스포트가 관리합니다 |
| HOL 블로킹 | HTTP 계층에서 일어납니다. 같은 연결에서는 앞의 응답이 끝날 때까지 다음 응답을 보낼 수 없습니다(파이프라이닝을 써도 응답은 요청 순서대로 돌아옵니다) | HTTP 계층에서는 해소되었지만, TCP가 바이트를 엄격히 순서대로 전달하므로 패킷 하나가 손실되면 모든 스트림이 재전송을 기다립니다 | QUIC이 스트림마다 순서를 관리하므로, 손실은 데이터를 잃은 스트림에만 영향을 줍니다 |
| 헤더 압축 | 없음(본문은 압축할 수 있지만 헤더는 평문 텍스트로 보냅니다) | HPACK(RFC 7541) | QPACK(RFC 9204). 스트림이 순서대로 도착하지 않아도 동작하도록 HPACK을 고친 방식 |
| 암호화 | 선택. https는 TLS를 쓰고, http는 평문으로 보냅니다 | 사양은 TLS 위(h2)와 평문(h2c)을 모두 정의하며, TLS 위에서는 TLS 1.2 이상을 요구합니다. 주요 브라우저는 TLS 위의 HTTP/2에만 대응합니다 | 필수. TLS 1.3이 QUIC에 내장되어 있으며 평문 모드는 없습니다 |
| 연결 수립까지의 왕복 횟수 | TCP에 1왕복, TLS 1.3이면 1왕복이 더해져 모두 2왕복 뒤에 요청을 보냅니다 | HTTP/1.1과 같음(TCP와 TLS로 2왕복) | QUIC은 트랜스포트와 암호 핸드셰이크를 합쳐 1왕복으로 끝냅니다. 이전에 접속한 서버에는 첫 송신에 데이터를 싣는 0-RTT도 쓸 수 있습니다 |
| 네트워크가 바뀔 때 | TCP 연결은 출발지·목적지의 주소와 포트로 식별되므로, IP 주소가 바뀌면 새 연결이 필요합니다 | HTTP/1.1과 같음 | QUIC은 연결 ID로 연결을 식별하므로, 무선 LAN에서 모바일 네트워크로 바뀌어도 같은 연결을 이어 갈 수 있습니다(연결 마이그레이션) |
수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.