HTTP/3
HTTP/3
QUIC 기반 HTTP. UDP 위에서 신뢰성 제공.
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를 처리하는 방식으로 리스크 없이 도입 가능합니다."
HTTP/3는 UDP 기반이므로 방화벽에서 UDP 443 포트를 열어야 합니다. 많은 기업 네트워크와 일부 ISP가 UDP 트래픽을 제한하므로, HTTP/2 폴백을 반드시 구현하세요.
0-RTT 데이터는 재전송 공격(replay attack)에 취약합니다. 결제나 상태 변경 같은 중요한 요청은 0-RTT가 아닌 일반 요청으로 처리해야 합니다. Nginx에서 ssl_early_data 사용 시 Early-Data 헤더로 구분하세요.
서버가 HTTP/3를 지원해도 Alt-Svc 헤더가 없으면 브라우저가 HTTP/2로만 연결합니다. 반드시 'Alt-Svc: h3=":443"; ma=86400' 헤더를 응답에 포함하세요.
CDN(Cloudflare, CloudFront)을 통해 먼저 도입하고, Alt-Svc로 점진적 마이그레이션하세요. HTTP/2 폴백을 유지하고, 0-RTT는 GET/HEAD 같은 멱등성 있는 요청에만 사용합니다. 모니터링으로 QUIC 연결 비율을 추적하세요.