본문으로 건너뛰기
김신건의 로그

[Network] HTTP/3: QUIC 위의 HTTP, 0-RTT, connection migration

· 수정 · 📖 약 1분 · 537자/단어 #http #network #backend #protocol #quic #udp
HTTP/3, h3, QUIC, 0-RTT, connection migration, QPACK

정의

HTTP/3 (2022, RFC 9114) 는 HTTP 의 전송 레이어를 TCP → QUIC 으로 교체한 버전. UDP 위에 QUIC, QUIC 위에 HTTP.

핵심 동기: TCP HoL blocking 해결 + 0-RTT 핸드셰이크 + connection migration (IP 변경 시 연결 유지).

flowchart TB
    HTTP[HTTP semantics] --> QUIC[QUIC<br/>multi-streams + crypto + congestion]
    QUIC --> UDP[UDP]
    UDP --> IP[IP]

QUIC 의 핵심 (1분 요약)

특성TCP+TLS+HTTP/2QUIC+HTTP/3
핸드셰이크3-way + TLS = 2-3 RTT1 RTT (또는 0-RTT 재방문)
HoL BlockingTCP 레벨 발생stream 별 독립
Connection migration불가가능 (NAT 변경, WiFi → 4G)
암호화옵션필수 (TLS 1.3 통합)
패킷 손실 영향모든 stream 대기해당 stream 만
구현 위치OS (TCP) + 라이브러리 (TLS)전부 user-space (배포 빠름)

Handshake: 0-RTT 의 마법

sequenceDiagram
    autonumber
    participant C as Client
    participant S as Server

    rect rgb(220,240,220)
    Note over C,S: 첫 방문 (1-RTT)
    C->>S: Initial (TLS ClientHello + crypto frames)
    S-->>C: Initial + Handshake (server params + cert)
    C->>S: Handshake (finish) + HTTP request
    S-->>C: HTTP response
    end

    rect rgb(255,235,220)
    Note over C,S: 재방문 (0-RTT)
    C->>S: 0-RTT (HTTP request + cached params)
    S-->>C: HTTP response (즉시)
    end

CAUTION

0-RTT 데이터는 replay 공격에 취약. 비멱등 요청 (POST 결제) 은 반드시 1-RTT 후 처리. GET / HEAD 같은 안전한 method 만 0-RTT 권장.

TCP HoL vs QUIC stream 독립

flowchart TB
    subgraph T["TCP (HTTP/2)"]
        TS["stream 1, 3, 5 가<br/>같은 TCP 시퀀스 안"]
        TPacket1[패킷 1: 일부 stream 1]
        TPacket2[패킷 2: 일부 stream 3, *손실!*]
        TPacket3[패킷 3: 일부 stream 5]
        TS --> TPacket1 & TPacket2 & TPacket3
        TPacket2 -.->|"모든 stream 대기"| Block1["모든 stream 대기"]
    end
    subgraph Q["QUIC (HTTP/3)"]
        QS["stream 1, 3, 5 가<br/>각자 시퀀스"]
        QPacket1[패킷 1: stream 1 ✓]
        QPacket2[패킷 2: stream 3, *손실*]
        QPacket3[패킷 3: stream 5 ✓]
        QS --> QPacket1 & QPacket2 & QPacket3
        QPacket2 -.->|stream 3 만 대기| Block2["stream 1, 5 계속"]
    end

Connection Migration

WiFi → 4G 전환, NAT 재할당 시 연결 유지. Connection IDsrc IP/port 와 무관.

sequenceDiagram
    Client->>Server: WiFi IP 192.168.1.10:54321 (conn_id=XYZ)
    Server-->>Client: 응답 (conn_id=XYZ)
    Note over Client: 지하철 진입, 4G 전환
    Client->>Server: 4G IP 10.0.0.5:65432 (conn_id=XYZ)
    Server-->>Client: 응답 (같은 connection 이어감)
    Note over Client,Server: TLS / 세션 유지, 처음부터 다시 안 함

QPACK 헤더 압축

HPACK 의 순서 의존성 문제 를 해결한 변형. encoder/decoder stream 분리.

HPACKQPACK
헤더가 정확한 순서stream 독립 디코딩 가능
인덱스 갱신 → 모든 stream 영향별도 stream 으로 동기화

도입 현황 (2026)

영역비중
Cloudflare / Fastly / Akamai (CDN)기본 활성
모바일 앱 (gRPC, 자체 클라이언트)빠르게 증가
일반 웹 사이트 (브라우저 트래픽)약 35%+
기업 내부 (방화벽 UDP 차단)더딤

NOTE

방화벽이 UDP 를 차단 하면 HTTP/3 fallback → HTTP/2 (TCP). 도입의 가장 큰 현실 장벽.

흔한 함정

WARNING

  1. 방화벽 / 미들박스의 UDP 차단 = 사내망에서 H3 가 안 되는 가장 흔한 이유.
  2. 0-RTT 의 replay 위험 = POST / DELETE 등 비멱등은 0-RTT 거절.
  3. Connection ID 가 식별자처럼 쓰임 = 추적 / privacy 우려. RFC 가 주기적 변경 권장.
  4. 부하 분산기의 UDP 5-tuple 해싱 = NAT 변경 시 다른 백엔드 로. connection ID 기반 라우팅 필요.

관련 위키

이 글의 용어 (5개)
[Network] HTTP/2: multiplexing, HPACK, server push의 종말network
정의 HTTP/2 (2015, RFC 9113) 는 HTTP/1.1 의 문법은 유지하되 전송을 바이너리 + 멀티플렉싱 으로 바꾼다. Head-of-Line Blocking (HT…
[Network] Load Balancer: L4 vs L7, 알고리즘, sticky sessionnetwork
정의 Load Balancer 는 트래픽을 여러 백엔드로 분산 하는 인프라. 수평 확장 + 가용성 + 무중단 배포 의 토대. L4 vs L7 | 구분 | L4 (Transport…
Head-of-Line Blockingnetwork
정의 Head-of-Line Blocking (HOLB) 은 처리 순서가 정해진 큐에서 맨 앞 항목의 지연이 그 뒤 항목 전체의 지연으로 전파되는 현상이다. 네트워크 프로토콜에서…
TLS / SSLnetwork
정의 TLS (Transport Layer Security)는 (또는 위 ) 위에서 동작하는 암호화·인증 프로토콜이다. SSL 은 TLS 의 전신 (Netscape 1995, 더…
UDPnetwork
정의 UDP (User Datagram Protocol)는 비연결·비신뢰 전송 계층 프로토콜이다. RFC 768 (1980) 로 정의되었다. 와 대비된다. "보내고 잊는다(fir…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기