# ⚡ HTTP/3 서비스 HTTP/3는 무엇을 설치할 필요가 없다는 뜻에서 기본으로 켜져 있습니다. 프로토콜 집합이 허락하면 서버는 UDP 443에 QUIC 리스너를 엽니다. 주의가 필요한 것은 검증입니다. 조용히 HTTP/2로 떨어진 클라이언트는 성공과 똑같이 보입니다. ## 🧾 시작하기 전에 - 호스트로 해석되는 이름과 그 이름의 인증서([HTTPS](/ko/start/https/)). - 제공자 방화벽과 호스트 양쪽에서 **UDP 443 개방**. QUIC에는 대체가 없습니다. UDP가 막히면 클라이언트는 HTTP/2를 쓰고 그 사실을 말하지 않습니다. - HTTP/3를 지원하는 클라이언트. 대부분의 배포판 `curl`은 지원하지 않으며, 요구하면 분명히 알려 줍니다. ```text curl: option --http3: the installed libcurl version doesn't support this ``` ## 🔌 켜기 ```caddyfile { email pingclair@pingclair.com servers { protocols h1 h2 h3 } } example.com { file_server /srv/site } ``` 사이트를 띄운 상태에서 호스트에서 측정: ```bash sudo ss -lunp | grep ':443 ' ``` ```text UNCONN 0 0 *:443 *:* users:(("pingclair",pid=5425,fd=22)) ``` 목록에서 `h3`를 빼면 이 리스너가 사라집니다. 목록이 스위치입니다 ([TLS에서 조정할 수 있는 것](/ko/guides/tls-tuning/#-which-protocols-are-served)). 리스너를 멈추지 않고 사이트 하나만 HTTP/3에서 빼낼 수도 있습니다. ```caddyfile example.com { tls { http3 off } file_server /srv/site } ``` ## ✅ 클라이언트가 사용했음을 증명하기 서버의 액세스 로그는 프로토콜을 말하지 않으므로 증거는 클라이언트에서 옵니다. ngtcp2나 quiche로 빌드된 curl이면 무엇이든 되고, HTTP/3를 못 쓰는 curl만 있는 호스트에서는 컨테이너가 가장 빠릅니다. ```bash docker run --rm --network host \ ymuski/curl-http3 curl -sI --http3 https://example.com/ ``` ```text curl 8.2.1-DEV (x86_64-pc-linux-gnu) libcurl/8.2.1-DEV BoringSSL zlib/1.2.13 nghttp2/1.52.0 quiche/0.18.0 ``` ```text HTTP/3 200 content-type: text/html; charset=utf-8 etag: "5e-6ab20622" accept-ranges: bytes x-served-by: pingclair server: Pingclair ``` `--network host`가 컨테이너에 호스트의 UDP 경로를 쓰게 합니다. 없으면 QUIC를 막는 네트워크 네임스페이스를 지날 수 있습니다. 첫 줄이 답입니다. 상태 줄이 `HTTP/2`가 아니라 `HTTP/3`입니다. 같은 URL을 `--http2`와 `--http1.1`로 요청하면 나머지 둘이 나오므로, 클라이언트가 단순히 떨어진 것이 아님을 알 수 있습니다. 컨테이너를 쓸 수 없으면 QUIC 핸드셰이크는 시스템 OpenSSL 3.5 이상으로 확인할 수 있습니다. ```bash openssl s_client -quic -alpn h3 -connect example.com:443 -servername example.com