[편집자: 이제 NGINX는 QUIC 기반 HTTP/3를 공식 지원합니다. 오픈 소스 사용자는 NGINX 1.25.1 메인라인 버전에서, 엔터프라이즈 고객은 NGINX Plus R30에서 사용할 수 있습니다.]
[ngx_snippet name=’table-style-blog’]
NGINX의 QUIC+HTTP/3 지원 프리뷰 구현이 이제 다음 두 배포판용 사전 빌드 바이너리 패키지로 제공됨을 알려드립니다:
- Red Hat Enterprise Linux 9 및 바이너리 호환 배포판
- Ubuntu 22.04
이 바이너리는 미리 보기 구현을 호스팅하는 별도의 quic 브랜치가 있는 nginx-quic 리포지토리에서 제공하는 최신 결과물입니다. 당사가 NGINX에서 QUIC+HTTP/3 개발을 시작한 이후와 마찬가지로, 지금도 QUIC+HTTP/3 및 QUIC을 지원하는 SSL/TLS 라이브러리를 선택하여 NGINX Open Source를 다운로드하고 빌드할 수 있습니다 코드에는 실험용이라는 표시가 붙어 있지만, 여러 커뮤니티 구성원이 nginx-quic을 프로덕션 환경에서 성공적으로 사용하고 있다고 보고했습니다.
사전 빌드된 바이너리를 출시하는 주된 목적은 QUIC+HTTP/3가 적용된 NGINX를 더 빠르고 쉽게 테스트할 수 있도록 하는 것입니다. 이 바이너리를 사용하면 소스에서 직접 컴파일할 필요가 없으며, 표준 패키지 관리 도구를 사용해 설치할 수 있습니다.
이 글을 작성하는 현재, 오픈 소스 SSL/TLS의 사실상 표준인 OpenSSL은 QUIC을 지원하지 않습니다. 따라서 바이너리 배포판은 quictls 라이브러리 패키지와 함께 빌드되며, 이 패키지는 종속성으로 자동 설치됩니다. 현재 안정성, 호환성 및 기능의 균형이 가장 뛰어나다고 판단하여 quictls를 선택했습니다.
바이너리 배포판 설치 지침은 NGINX QUIC 웹사이트에서 확인할 수 있습니다.
QUIC+HTTP/3용 NGINX 구성
QUIC+HTTP/3용 NGINX를 구성하기 위한 몇 가지 새로운 지시어가 있지만, 기존 가상 서버(server{}) 구성 블록에서 HTTP/1.1 및 HTTP/2용 지시어와 쉽게 함께 사용할 수 있습니다.
가장 기본적인 기능 구성을 위해서는 server{} 블록(및 하위 location{} 블록)에 세 가지 지시어만 포함하면 됩니다:
| 지시어 | 설명 |
|---|---|
listen 443 quic reuseport; | NGINX가 HTTP/1.1 및 HTTP/2와 동일한 포트(여기서는 443)에서 HTTP/3 연결을 수신하도록 NGINX 워커 프로세스가 여러 개일 때 올바르게 작동하려면 |
ssl_protocols TLSv1.3; | QUIC의 요구 사항에 따라 허용되는 프로토콜 목록에 TLS 1.3을 포함합니다. (이 지시어는 이미 구성에 있을 가능성이 높지만, 필요한 경우 추가하십시오.) 모든 브라우저를 지원하려면 이전 TLS 버전도 포함해야 할 수 있습니다. TLS 1.3의 브라우저 지원에 관한 자세한 내용은 Can I use TLS 1.3?를 참조하십시오. |
add_header Alt-Svc 'h3=":$server_port"; ma=86400'; | NGINX가 QUIC로 업그레이드할 수 있으며 연결할 포트가 무엇인지 브라우저에 알리는 응답 헤더를 추가하도록 이 지시어를 포함합니다. 일반적으로 포트(여기서는
|
다음은 server{} 블록의 예시입니다:
server { # for better compatibility we recommend
# using the same port number for QUIC and TCP
listen 443 quic reuseport; # QUIC
listen 443 ssl; # TCP
ssl_certificate certs/example.com.crt;
ssl_certificate_key certs/example.com.key;
ssl_protocols TLSv1.3;
location / {
# advertise that QUIC is available on the configured port
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
#proxy_pass <upstream_group>;
#root /<root_directory>;
}
}다음과 같은 몇 가지 새로운 선택적 HTTP/3 관련 지시어와 변수가 있습니다(코드 조각에는 표시되지 않음).
$http3– (변수) 요청이 HTTP/3 세션 중에 전송되면h3로 설정됩니다(그렇지 않으면 빈 문자열입니다).quic_retry– (지시어)on으로 설정하면 요청자의 IP 주소를 검증하기 위해 사용할 새 연결 ID를 지정하는 QUIC 재시도 메시지를 요청자에게 보내도록 NGINX에 지시합니다. QUIC는 UDP를 통해 실행되므로 TCP 3방향 연결 핸드셰이크를 사용하여 연결을 검증할 수 없다는 점을 QUIC 재시도 패킷이 부분적으로 보완합니다.ssl_early_data– (지시어)on으로 설정하면, 해당 클라이언트가 이전에 연결한 적이 있는 경우 NGINX가 새 TLS 1.3 연결을 통해 클라이언트가 보내는 첫 번째 요청에서 애플리케이션 데이터를 수락하도록 합니다. 이를 제로 왕복 시간(0‑RTT) 연결 재개라고 합니다. “얼리 데이터” 전송 지원은 TLS 1.3의 기능으로, TLS 핸드셰이크에 필요한 추가 왕복 메시지 교환을 없애 QUIC+HTTP/3의 성능 향상에 기여합니다.참고: 얼리 데이터에 재전송 공격이 발생할 수 있으므로 해당 데이터에GET이외의 HTTP 요청 메서드가 포함된 경우 0‑RTT 연결 재개로 인해 보안 위험이 발생할 수 있습니다. 자세한 내용은 블로그의 TLS 1.3 관련 섹션인 NGINX Plus R17 발표를 참조하세요.
이 다이어그램은 QUIC+HTTP/3의 0‑RTT 연결 재개가 성능을 어떻게 향상하는지 보여 줍니다. 클라이언트가 NGINX에 대한 QUIC 연결을 재개할 때 첫 번째 메시지에 HTTP 요청을 보낼 수 있기 때문입니다. 반면 TLS를 사용하는 TCP의 경우 클라이언트는 NGINX와 보안 연결을 설정하기 위해 새로운 TLS 핸드셰이크를 수행해야 하므로 몇 차례의 추가 왕복 통신이 필요합니다.

새로운 지시문과 변수에 대한 자세한 내용은 3. 구성 섹션을 참조하세요. 해당 섹션은 nginx-quic README에 있습니다.
QUIC+HTTP/3로 NGINX 테스트하기
앞서 언급했듯이, 사전 빌드된 바이너리를 출시한 이유 중 하나는 NGINX가 HTTP/3 트래픽을 올바르게 처리하는지 더 쉽게 테스트할 수 있도록 하기 위해서입니다. 간단한 명령줄 테스트를 위해서는 HTTP/3를 지원하도록 curl을 빌드하거나 또는 사전 빌드된 컨테이너를 사용할 수 있습니다. 또한 대부분의 최신 브라우저 버전은 QUIC+HTTP/3를 지원합니다.
QUIC가 활성화된 사이트가 브라우저의 HTTP/3 연결 요청을 제대로 처리하는지 확인하려면 브라우저의 개발자 도구를 사용하여 NGINX가 반환하는 HTTP 헤더를 살펴볼 수 있습니다. 브라우저가 TCP를 통해 보낸 최초의 HTTP 요청에 대한 NGINX 응답에 Alt-Svc 헤더가 위에서 설명한 대로 포함되어 있다면 QUIC+HTTP/3 구현이 올바르게 작동하는 것입니다.
이 시점에서 QUIC을 지원하는 브라우저는 Alt-Svc 지시문에 지정된 포트로 QUIC 연결을 설정하며, 이후의 HTTP 요청과 응답은 QUIC을 통해 이루어집니다. QUIC+HTTP/3가 사용되고 있는지 확인하는 또 다른 방법은 add_header 지시문을 하나 더 추가하여 사용자 지정 HTTP 헤더의 값을 $server-protocol 변수가 캡처한 프로토콜로 설정하는 것입니다. 헤더 값이 QUIC 연결이 설정되기 전의 HTTP/1.x에서 QUIC이 사용될 때의 HTTP/3.0으로 변경되는 것을 추적할 수 있습니다.
다음은 사용자 지정 HTTP 헤더가 location 블록에서 X-protocol로 설정된 예시입니다:
location / { # advertise that QUIC is available on the configured port
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
# signal whether we are using QUIC+HTTP/3
add_header X-protocol $server_protocol always;
#proxy_pass <upstream_group>;
#root /<root_directory>;
}또는 Chrome의 HTTP Indicator 확장 프로그램처럼 현재 사용 중인 프로토콜을 시각적으로 표시해 주는 도구도 있습니다. (이는 특정 브라우저 확장 프로그램을 권장한다는 의미가 아니며, 확장 프로그램 사용으로 발생할 수 있는 보안상의 영향을 고려하여 현재 상황에서 허용 가능한지 직접 판단해야 합니다).
다음 단계
앞으로도 QUIC+HTTP/3 솔루션을 지속적으로 제공하고, 향후 몇 주에 걸쳐 더 많은 NGINX 최적화 사례를 소개할 예정입니다. 그동안 여러분이 직접 테스트한 결과를 공유하여 저희가 의사 결정을 내리는 데 도움을 주시기 바랍니다. 피드백은 NGINX 개발 메일링 리스트와 #quic‑http3 채널이 있는 NGINX 커뮤니티 Slack에서 공유하실 수 있습니다.
QUIC+HTTP/3 관련 작업의 최신 소식과 다음 주요 이정표인 nginx-quic 저장소의 메인라인 NGINX Open Source 브랜치 병합에 관한 업데이트를 받아보려면 NGINX 공지 메일링 리스트를 구독하세요.
웨비나 시청하기
또한 곧 개최되는 웨비나인 NGINX 및 QUIC+HTTP/3 실습(2023년 4월 19일 수요일)에 참석해 보시기 바랍니다:
- 북미 – 오전 10:00(태평양 표준시)
- 유럽·중동·아프리카 – 오전 11:00 CET
- APCJ – 오전 10:00 SGT
작성자 소개

관련 블로그 게시물
시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.
F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.
Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.
진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.
NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.
Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.