Skip to content
푸땡로그
Go back

HTTPS DNS 레코드로 첫 연결부터 HTTP/3를 쓰게 만들기

HTTP/3를 켜두었는데도 첫 방문이 여전히 HTTP/2로 시작할 수 있습니다. 서버가 HTTP 응답 헤더로만 “나 HTTP/3도 할 수 있어요”라고 알려주면, 브라우저는 이미 한 번 접속한 뒤에야 그 사실을 알기 때문입니다.

savearoundtrip은 이 낭비를 DNS 단계로 끌어올리자고 제안합니다. Alt-Svc 헤더만 쓰지 말고 HTTPS DNS 레코드에도 HTTP/3 지원 정보를 게시하면, 브라우저는 첫 연결부터 QUIC/HTTP/3를 선택할 수 있습니다.

이 글은 작성 시점 2026-06-17 · savearoundtrip, RFC 9460, MDN Alt-Svc 문서 스냅숏 기준으로 정리했습니다.

핵심 HTTP/3를 지원하는 것과 브라우저가 첫 연결 전에 그 사실을 아는 것은 다릅니다. HTTPS DNS 레코드는 "지원 여부를 언제 알게 되는가"를 앞당기는 최적화입니다.

왜 한 번 늦어지는가

기존 HTTP/3 광고는 흔히 Alt-Svc 헤더로 이뤄집니다. MDN의 Alt-Svc 문서에 따르면 이 헤더는 같은 origin을 처리할 수 있는 alternative service를 응답으로 알려주는 역할을 합니다.

문제는 Alt-SvcHTTP 응답 헤더라는 점입니다. 브라우저가 이 헤더를 읽으려면 이미 DNS를 조회하고, TCP 연결을 열고, TLS 핸드셰이크를 마치고, HTTP/1.1 또는 HTTP/2 요청을 보낸 뒤여야 합니다.

sequenceDiagram
    participant C as Browser
    participant D as DNS
    participant S as Server

    Note over C,S: 첫 연결
    C->>D: A / AAAA 조회
    D-->>C: IP 주소
    C->>S: TCP + TLS + HTTP/2
    S-->>C: 응답 + Alt-Svc: h3
    Note over C,S: 이제야 HTTP/3 지원을 알게 됨
    Note over C,S: 다음 연결
    C->>S: QUIC + HTTP/3

이 방식은 두 번째 연결부터는 좋아질 수 있지만, 첫 연결에는 도움이 되지 않습니다. savearoundtrip은 이 첫 연결의 낭비를 “HTTP/3를 알기 위한 round trip”으로 봅니다.


HTTPS 레코드는 무엇을 바꾸나

RFC 9460은 SVCB와 HTTPS 리소스 레코드를 정의합니다. HTTP origin에 연결할 때 필요한 서비스 바인딩 정보와 파라미터를 DNS 응답에 실어, 클라이언트가 연결을 열기 전에 더 나은 선택을 하도록 돕는 구조입니다.

HTTP/3 관점에서 중요한 값은 alpn입니다. alpn="h3,h2"처럼 게시하면 클라이언트는 이 endpoint가 HTTP/3와 HTTP/2를 지원한다는 사실을 DNS 조회 단계에서 알 수 있습니다.

sequenceDiagram
    participant C as Browser
    participant D as DNS
    participant S as Server

    Note over C,S: 첫 연결
    C->>D: HTTPS 레코드 조회
    D-->>C: alpn=h3 + IP hints (+ ECH)
    C->>S: QUIC + HTTP/3 핸드셰이크
    S-->>C: HTTP/3 응답

차이는 단순합니다. Alt-Svc는 “접속해보니 다음부터 HTTP/3 가능”이고, HTTPS 레코드는 “접속하기 전에 이미 HTTP/3 가능”입니다.


한 줄 설정의 의미

savearoundtrip에서 제시한 BIND 스타일 예시는 다음과 같습니다.

; zone file (BIND-style)
example.com.  3600  IN  HTTPS 1 . alpn="h3,h2" ipv4hint=203.0.113.10 ipv6hint=2001:db8::10

각 항목의 역할은 다음처럼 볼 수 있습니다.

항목의미
HTTPSRFC 9460의 HTTPS 리소스 레코드 타입
1ServiceMode priority. 파라미터를 직접 담는 모드
.target host. 현재 owner name 자체를 가리킴
alpn="h3,h2"지원하는 애플리케이션 프로토콜
ipv4hint, ipv6hintA/AAAA 응답 전에 연결 후보 주소로 쓸 수 있는 힌트

ipv4hintipv6hint는 정답 주소의 대체물이 아니라 연결 시작을 앞당기기 위한 힌트입니다. 최종 A/AAAA 응답이 오면 그 값이 우선합니다.


ECH까지 생각하면 DNS가 더 중요해진다

HTTPS 레코드는 HTTP/3 광고만을 위한 장치가 아닙니다. savearoundtripech 파라미터도 함께 설명합니다. ECH(Encrypted ClientHello)는 TLS ClientHello 안의 SNI 같은 정보를 암호화해 네트워크 관찰자가 방문 사이트를 덜 알 수 있게 만드는 흐름입니다.

여기에는 순서 문제가 있습니다. ClientHello를 암호화하려면 공개키가 필요하지만, 공개키를 HTTP 응답 헤더로 받으려면 이미 ClientHello를 보낸 뒤입니다. 그래서 ECH 설정은 연결 전에 볼 수 있는 채널, 즉 DNS의 HTTPS 레코드와 잘 맞습니다.

Tip HTTP/3 최적화만 보면 alpn이 먼저 보이지만, 장기적으로는 ech와 IP hints까지 함께 담는 "연결 전 메타데이터" 관점으로 보는 편이 좋습니다.

Alt-Svc는 버려도 될까

아직은 아닙니다. savearoundtrip FAQ도 Alt-Svc를 fallback으로 계속 보내라고 권합니다. HTTPS 레코드를 이해하지 못하는 클라이언트, 레코드를 제대로 전달하지 않는 resolver나 네트워크가 여전히 있을 수 있기 때문입니다.

안전한 적용 순서는 이렇게 잡는 편이 좋습니다.

  1. 서버 또는 CDN에서 HTTP/3가 실제로 동작하는지 확인합니다.
  2. DNS provider가 HTTPS 레코드를 지원하는지 확인합니다.
  3. alpn="h3,h2"를 게시합니다.
  4. dig +short HTTPS example.com 같은 명령으로 응답을 확인합니다.
  5. 기존 Alt-Svc 헤더는 fallback으로 유지합니다.

Cloudflare는 프록시된 zone에 대해 HTTP/3 설정에 따라 HTTPS 레코드를 자동 생성한다고 공식 블로그에서 설명한 바 있습니다. 반대로 DNS provider나 CDN에 따라 직접 설정이 필요할 수 있습니다.

주의 HTTPS 레코드는 HTTP/3를 마법처럼 켜주는 설정이 아닙니다. 서버와 CDN이 실제로 QUIC/HTTP/3를 받을 준비가 되어 있어야 하고, DNS 값은 그 사실을 연결 전에 알려주는 역할을 합니다.

블로그 대표 이미지 콘셉트

브라우저가 웹사이트에 접속하는 과정을 두 갈래로 비교한 기술 일러스트가 잘 맞습니다. 왼쪽은 HTTP/2로 먼저 접속한 뒤 Alt-Svc 헤더를 읽고 다음 방문에서야 HTTP/3로 전환되는 느린 경로를 보여줍니다.

오른쪽은 DNS 조회 단계에서 HTTPS 레코드의 alpn="h3,h2", ipv4hint, ech 정보를 받아 첫 연결부터 QUIC/HTTP/3를 선택하는 빠른 경로를 보여줍니다. 중앙에는 “Save one round trip”이라는 문구와 함께 DNS, TLS, QUIC, HTTP/3 흐름이 선으로 연결된 개발자 블로그용 네트워크 다이어그램 스타일이 좋습니다.


마무리

웹 성능 개선은 번들 크기나 이미지 최적화에서 끝나지 않습니다. 사용자의 첫 요청이 서버에 닿기 전에도 줄일 수 있는 비용이 있습니다.

이미 HTTP/3를 지원하고 있다면 다음 질문은 간단합니다. 내 도메인은 그 사실을 첫 연결 전에 알려주고 있는가?

HTTPS DNS 레코드는 이 질문에 답하는 작지만 실용적인 장치입니다. 첫 연결부터 HTTP/3로 가는 길을 열어두고, Alt-Svc는 뒤처진 환경을 위한 fallback으로 남겨두면 됩니다.


참고 자료


Share this post on:

Previous Post
AI 코딩 에이전트의 토큰 비용을 줄이는 로컬 LLM 라우터
Next Post
Claude Code /loop: 세션 안에서 반복 작업을 맡기는 가장 가벼운 방법