NGINX QUIC+HTTP/3 구현에 사용 가능한 패키지
바이너리 파일은 미리보기 구현을 호스팅하는 별도의 nginx-quic 저장소의 quic 브랜치에서 가져온 최신 결과물입니다. NGINX QUIC+HTTP/3 에 대한 작업을 시작한 이후로도 QUIC를 지원하는 SSL/TLS 라이브러리 선택과 함께 NGINX 오픈 소스를 다운로드하고 빌드할 수 있습니다. 코드는 실험적으로 표시되었지만, 몇몇 커뮤니티 회원들이 nginx-quic를 제품 환경에서 성공적으로 사용하고 있다고 보고했습니다.
사전 빌드된 바이너리 파일을 공개하는 주된 동기는 NGINX와 QUIC+HTTP/3를 테스트하기 위해 보다 빠르고 쉽게 사용할 수 있도록 하는 것입니다. 이 바이너리 파일들은 소스 코드를 컴파일할 필요 없이 표준 패키지 관리 도구를 사용하여 설치할 수 있습니다.
2023년 2월 8일 기준 시점에서 오픈 소스 SSL/TLS의 사실상의 표준인 OpenSSL은 QUIC를 지원하지 않습니다. 따라서 우리는 의존성으로 자동 설치되는 quictls 라이브러리 패키지와 함께 바이너리 배포를 빌드합니다. 현재 안정성, 호환성, 기능 측면에서 최상의 조합을 제공하는 quictls를 선택했습니다.
목차
1. QUIC+HTTP/3 용 NGINX 구성
2. QUIC+HTTP/3 으로 NGINX 테스트하기
1. QUIC+HTTP/3 용 NGINX 구성
NGINX를 QUIC+HTTP/3에 대해 구성하기 위한 몇 가지 새로운 지시문들이 있지만, 기존 가상 서버(server{}) 구성 블록에서 HTTP/1.1 및 HTTP/2에 대한 지시문과 함께 쉽게 결합할 수 있습니다.
가장 기본적인 기능 구성의 경우 server{}(및 하위 location{}) 블록에 세 가지 지시문을 포함하기만 하면 됩니다.
Directive | Description |
---|---|
listen 443 quic reuseport; | NGINX가 HTTP/1.1 및 HTTP/2와 동일한 포트에서 HTTP/3 연결을 수신 대기하도록 지시하는 빠른 매개변수와 함께 새로운 listen 지시문을 추가합니다. Reuseport 매개변수는 여러 NGINX worker process가 있을 때 올바른 작동을 위해 필요합니다. 이는 커널에 들어오는 HTTP/3 연결을 worker process들 사이에 분배할 수 있도록 합니다. |
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_port 변수로 표시됨)는 HTTP/1.1 및 HTTP/2를 사용하는 TLS에 사용되는 것과 동일합니다. ma 값은 클라이언트가 NGINX가 UDP를 통해 HTTP/3 트래픽을 수락한다고 안전하게 가정할 수 있는 시간(초) 입니다. 그 시간이 지나면 클라이언트는 TCP로 되돌아가야 합니다. 여기에 지정된 값은 24시간에 해당합니다. |
다음은 예시 server{} 블록입니다.
server {
# 더 나은 호환성을 위해 권장합니다
# QUIC 및 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 / {
# 구성된 포트에서 QUIC를 사용할 수 있음을 알립니다.
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 재시도 패킷은 QUIC이 UDP를 통해 실행되기 때문에 TCP three-way 연결 핸드셰이크를 사용하여 연결을 확인할 수 없다는 사실을 일부 보완합니다.
- ssl_early_data – (지시문) “on”으로 설정되었을 때, NGINX에게 새로운 TLS 1.3 연결에서 클라이언트가 보낸 첫 번째 요청에서 애플리케이션 데이터를 수락하도록 지시합니다. 이는 해당 클라이언트로부터 이전 연결이 있었던 경우를 가리킵니다. 이는 zero round-trip time(O-RTT) 연결 재개라고도 알려져 있습니다. “Early data”의 전송은 TLS 1.3의 기능으로, TLS 핸드셰이크에 필요한 추가 round-trip 메시지 교환을 제거하여 QUIC+HTTP/3의 성능을 향상시킵니다.
참고 : O-RTT 연결 재개는 보안 위험을 초래할 수 있습니다. 왜냐하면 GET 이외의 HTTP 요청 메서드를 포함하는 경우, 초기 데이터는 재생 공격(replay attack)의 대상이 될 수 있습니다.

2. NGINX 테스트하기
이전에 언급한 대로, 미리 빌드된 바이너리 파일을 제공하는 것은 NGINX가 HTTP/3 트래픽을 올바르게 처리하는지 테스트하기를 더욱 쉽게 하기 위한 것입니다. 간단한 command-line 테스트를 위해서는 HTTP/3 지원이 포함된 curl을 빌드하거나 미리 빌드된 컨테이너를 사용할 수 있습니다. 또한, 대부분의 최신 브라우저는 QUIC+HTTP/3를 지원합니다.
브라우저의 개발자 도구를 사용하여 NGINX가 브라우저로부터의 HTTP/3 연결 요청을 올바르게 처리하는지 확인하기 위해 HTTP 헤더를 검사할 수 있습니다. QUIC+HTTP/3 구현이 올바르게 작동하는 경우, NGINX는 초기 TCP를 통한 브라우저의 HTTP 요청에 대한 응답으로 위에서 설명한 Alt-Svc 헤더를 포함합니다. 이를 통해 NGINX의 QUIC+HTTP/3 지원 여부를 확인할 수 있습니다.
이 시점에서, QUIC을 지원하는 브라우저는 Alt-Svc 헤더를 수신하면 Alt-Svc 지시문에 지정된 포트로 QUIC 연결을 수립합니다. 이후의 HTTP 요청과 응답은 QUIC를 통해 전송됩니다. QUIC+HTTP/3이 사용되고 있는지 확인하는 또 다른 방법은 ‘add_header’ 지시문을 추가하여 사용자 정의 HTTP 헤더의 값을 ‘$server_protocol’ 변수로 캡처된 프로토콜로 설정하는 것입니다. 이 헤더의 값을 추적함으로써, QUIC 연결이 설정되기 이전의 HTTP/1.x에서 QUIC를 사용하는 HTTP/3.0으로의 전환을 확인할 수 있습니다.
다음은 사용자 지정 HTTP 헤더가 X-protocol인 샘플 location 블록입니다.
location / {
# 구성된 포트에서 QUIC를 사용할 수 있음을 알립니다.
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
# QUIC+HTTP/3을 사용하는지 여부를 알립니다.
add_header X-protocol $server_protocol always;
#proxy_pass <upstream_group>;
#root /<root_directory>;
}
또한, Chrome HTTP Indicator 확장 프로그램과 같은 도구를 사용하면 시각적으로 사용 중인 프로토콜을 표시할 수 있습니다. (참고로, 이는 어떤 브라우저 확장 프로그램의 지지를 의미하는 것이 아니며, 가능한 보안 영향을 고려하여 상황에 맞는 확장 프로그램을 스스로 검토해야 합니다.)
NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 문의하십시오.
아래 뉴스레터를 구독하고 NGINX의 최신 정보들을 빠르게 전달 받아보세요.
댓글을 달려면 로그인해야 합니다.