🌍 네트워크

HTTP/3

HTTP/3

QUIC 기반 HTTP. UDP 위에서 신뢰성 제공.

📖 상세 설명

HTTP/3는 웹 통신의 차세대 프로토콜로, Google이 개발한 QUIC(Quick UDP Internet Connections) 프로토콜을 기반으로 합니다. 2022년 6월 IETF에서 RFC 9114로 공식 표준화되었으며, 기존 HTTP/2의 TCP 기반 한계를 극복하기 위해 UDP 위에서 신뢰성과 보안을 구현합니다. 현재 전 세계 웹 트래픽의 약 25% 이상이 HTTP/3를 사용하고 있습니다.

HTTP/3의 가장 혁신적인 특징은 0-RTT(Zero Round-Trip Time) 연결 설정입니다. HTTP/2에서는 TCP 3-way handshake + TLS 1.3 handshake로 최소 2-RTT가 필요했지만, HTTP/3는 이전 연결 정보를 재사용하여 첫 패킷부터 암호화된 데이터를 전송할 수 있습니다. 이로 인해 연결 지연이 100-200ms 이상 단축됩니다.

연결 마이그레이션(Connection Migration)은 HTTP/3만의 독보적인 기능입니다. TCP는 IP 주소와 포트 조합으로 연결을 식별하기 때문에, 모바일 기기가 Wi-Fi에서 LTE로 전환하면 연결이 끊어집니다. 반면 HTTP/3는 Connection ID를 사용하여 네트워크가 변경되어도 기존 연결을 유지합니다. 이는 모바일 환경에서 끊김 없는 스트리밍과 실시간 서비스를 가능하게 합니다.

HTTP/2의 Head-of-Line Blocking 문제도 완전히 해결되었습니다. HTTP/2는 단일 TCP 연결에서 멀티플렉싱을 지원하지만, 하나의 패킷이 손실되면 모든 스트림이 대기해야 했습니다. HTTP/3는 각 스트림이 독립적으로 작동하여, 한 스트림의 패킷 손실이 다른 스트림에 영향을 주지 않습니다. Cloudflare 측정에 따르면, 패킷 손실률 2%인 네트워크에서 HTTP/3가 HTTP/2보다 약 3배 빠른 성능을 보입니다.

💻 코드 예제

# cURL로 HTTP/3 요청 (cURL 7.66+ with HTTP/3 지원 빌드 필요)
curl --http3 https://cloudflare-quic.com
curl --http3-only https://www.google.com  # HTTP/3 강제 사용

# HTTP 버전 확인
curl -I --http3 https://cloudflare.com 2>&1 | grep -i "HTTP"
# HTTP/3 200

# HTTP/3 지원 여부 테스트
curl -sI https://www.cloudflare.com -o /dev/null -w '%{http_version}\n'
# 3 (HTTP/3 지원 시)

# Chrome에서 HTTP/3 확인 (DevTools)
# 1. F12 → Network 탭
# 2. 우클릭 → Protocol 컬럼 추가
# 3. h3 표시되면 HTTP/3 사용 중

# Chrome QUIC 내부 상태 확인
# 주소창에 입력: chrome://net-internals/#quic

# Firefox에서 HTTP/3 활성화 확인
# about:config → network.http.http3.enable = true

# Alt-Svc 헤더로 HTTP/3 지원 확인
curl -sI https://www.cloudflare.com | grep -i "alt-svc"
# alt-svc: h3=":443"; ma=86400
# Nginx HTTP/3 설정 (Nginx 1.25.0+ 또는 nginx-quic 빌드 필요)
# /etc/nginx/nginx.conf

http {
    # SSL 인증서 설정 (HTTP/3는 TLS 1.3 필수)
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
    ssl_protocols TLSv1.3;

    server {
        # HTTP/2 + HTTP/3 동시 지원 (권장)
        listen 443 ssl;
        listen 443 quic reuseport;  # HTTP/3 (QUIC)

        # IPv6 지원
        listen [::]:443 ssl;
        listen [::]:443 quic reuseport;

        server_name example.com;

        # HTTP/3 활성화
        http3 on;

        # Alt-Svc 헤더 추가 (클라이언트에게 HTTP/3 지원 알림)
        add_header Alt-Svc 'h3=":443"; ma=86400' always;

        # QUIC 최적화 설정
        quic_retry on;  # 연결 마이그레이션 지원
        ssl_early_data on;  # 0-RTT 활성화

        # 0-RTT replay attack 방지
        proxy_set_header Early-Data $ssl_early_data;

        location / {
            root /var/www/html;
            index index.html;
        }
    }
}

# 방화벽에서 UDP 443 포트 열기 (필수!)
# sudo ufw allow 443/udp
# sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT
# Python HTTP/3 클라이언트 (aioquic 라이브러리)
# pip install aioquic httpx[http2]

import asyncio
from aioquic.asyncio import connect
from aioquic.asyncio.protocol import QuicConnectionProtocol
from aioquic.quic.configuration import QuicConfiguration

# 기본 HTTP/3 요청
async def http3_request():
    configuration = QuicConfiguration(
        is_client=True,
        alpn_protocols=["h3"],  # HTTP/3 ALPN
    )

    async with connect(
        "www.cloudflare.com",
        443,
        configuration=configuration
    ) as protocol:
        # HTTP/3 스트림으로 요청 전송
        reader, writer = await protocol.create_stream()
        # ... 요청 처리
        print("HTTP/3 연결 성공!")

# httpx로 HTTP/2/3 자동 선택 (더 간단)
import httpx

async def httpx_example():
    # HTTP/2 사용 (HTTP/3는 아직 실험적)
    async with httpx.AsyncClient(http2=True) as client:
        response = await client.get("https://www.cloudflare.com")
        print(f"Protocol: {response.http_version}")
        print(f"Status: {response.status_code}")

# HTTP/3 지원 확인 함수
async def check_http3_support(domain: str) -> bool:
    """Alt-Svc 헤더로 HTTP/3 지원 여부 확인"""
    async with httpx.AsyncClient() as client:
        response = await client.head(f"https://{domain}")
        alt_svc = response.headers.get("alt-svc", "")
        return "h3" in alt_svc

# 실행
if __name__ == "__main__":
    asyncio.run(httpx_example())

🗣️ 실무에서 이렇게 말하세요

💬 성능 최적화 회의에서
"모바일 사용자 비중이 70%인데, Wi-Fi에서 LTE 전환 시 연결 끊김 이슈가 있습니다. HTTP/3의 Connection Migration을 도입하면 네트워크 전환 시에도 기존 세션을 유지할 수 있어서, 영상 스트리밍 끊김 문제를 해결할 수 있습니다."
💬 기술 면접에서
"HTTP/3는 TCP 대신 QUIC을 사용해서 Head-of-Line Blocking 문제를 해결합니다. HTTP/2는 하나의 TCP 연결에서 패킷 손실이 발생하면 모든 스트림이 블로킹되지만, HTTP/3는 각 스트림이 독립적이라 한 스트림의 손실이 다른 스트림에 영향을 주지 않습니다. 0-RTT로 초기 연결 시간도 100ms 이상 단축됩니다."
💬 인프라 도입 논의에서
"Cloudflare나 AWS CloudFront는 이미 HTTP/3를 지원하고 있어서 CDN 앞단에서 바로 활성화할 수 있습니다. 백엔드 서버는 HTTP/2로 유지하고, 엣지에서만 HTTP/3를 처리하는 방식으로 리스크 없이 도입 가능합니다."

⚠️ 흔한 실수 & 주의사항

방화벽에서 UDP 443 포트 차단

HTTP/3는 UDP 기반이므로 방화벽에서 UDP 443 포트를 열어야 합니다. 많은 기업 네트워크와 일부 ISP가 UDP 트래픽을 제한하므로, HTTP/2 폴백을 반드시 구현하세요.

0-RTT Replay Attack 무시

0-RTT 데이터는 재전송 공격(replay attack)에 취약합니다. 결제나 상태 변경 같은 중요한 요청은 0-RTT가 아닌 일반 요청으로 처리해야 합니다. Nginx에서 ssl_early_data 사용 시 Early-Data 헤더로 구분하세요.

Alt-Svc 헤더 누락

서버가 HTTP/3를 지원해도 Alt-Svc 헤더가 없으면 브라우저가 HTTP/2로만 연결합니다. 반드시 'Alt-Svc: h3=":443"; ma=86400' 헤더를 응답에 포함하세요.

올바른 HTTP/3 도입 전략

CDN(Cloudflare, CloudFront)을 통해 먼저 도입하고, Alt-Svc로 점진적 마이그레이션하세요. HTTP/2 폴백을 유지하고, 0-RTT는 GET/HEAD 같은 멱등성 있는 요청에만 사용합니다. 모니터링으로 QUIC 연결 비율을 추적하세요.

🔗 관련 용어

📚 더 배우기