QUIC과 HTTP/3이란?

QUIC(Quick UDP Internet Connections)는 유연성, 내장된 보안 기능, 적은 성능 문제, 빠른 도입률로 TCP(Transmission Control Protocol)를 대체하도록 설계된 범용 전송 레이어 프로토콜입니다. 원래 Google에서 개발한 QUIC는 클라이언트와 서버 간에 패킷을 이동하는 저수준 전송 메커니즘으로 UDP(User Datagram Protocol)를 사용합니다. 특히 QUIC는 HTTP/1.1 및 HTTP/2처럼 추가 레이어가 아닌 필수 구성 요소로 TLS(Transport Layer Security)도 통합합니다.

QUIC를 기반으로 하는 HTTP/3은 Hypertext Transfer Protocol(HTTP)의 세 번째 주요 버전으로, 2022년에 IETF 표준으로 채택되었습니다. QUIC+HTTP/3은 성능과 사용자 경험을 제한하는 TCP의 내재적 한계를 해결하기 위해 만들어졌습니다.

API의 작동 방식

API는 애플리케이션의 “공개적인 얼굴”로, 애플리케이션이 수행하는 기능과 제공할 수 있는 정보를 나타내며 적절한 요청 형식을 정의합니다. 개발자가 애플리케이션의 API를 생성하여 노출하면 다른 애플리케이션이 애플리케이션과 통신할 수 있게 됩니다.

많은 경우 API는 일반적으로 사용되는 기능을 쉽게 사용할 수 있도록 하기 때문에 개발자의 소중한 시간을 절약해 줍니다. 개발자는 기존 애플리케이션의 기능을 복제하기 보다는 기존 애플리케이션의 API를 호출하여 해당 기능을 애플리케이션에 통합할 수 있습니다.

Http 다이어그램

HTTP 전송 스택에 대한 간략한 개요

QUIC+HTTP/3 기본 사항

QUIC의 목표는 HTTP/3을 위한 고성능, 높은 신뢰성 및 고도의 보안 전송 프로토콜을 제공하는 것입니다(QUIC은 비 HTTP 트래픽에도 적합).

QUIC를 처음 사용하는 경우 아래의 소개 동영상을 시청하는 것이 좋습니다.

UDP, TCP 및 TLS

UDP는 간단한 경량형 프로토콜로, 첫 번째 연결을 설정하기 위해 TCP와 같은 복잡한 3자 핸드셰이크가 필요하지 않습니다. 이러한 단순성으로 인해 UDP는 빠르고 연결이 필요하지 않지만, TCP와 비교했을 때 신뢰할 수 있고 안전한 통신에 필수적인 기능이 부족하다는 의미이기도 합니다.

QUIC는 UDP와 TCP 프로토콜의 장점을 결합한 것이 특징입니다. 저수준 전송 프로토콜에서는 연결이 필요하지 않으며 연결 및 전송 지연을 줄이기 위해 UDP를 활용하지만, 상위 레이어에서는 패킷 전송을 보장하는 TCP의 연결 설정 및 손실 감지 기능을 다시 구현하여 연결 지향적입니다. 또한 손실된 데이터를 식별하고 재전송을 완료하여 원활한 사용자 경험을 보장하기 위한 작업을 처리합니다.

QUIC는 HTTP/1.1 및 HTTP/2의 경우처럼 추가 레이어가 아닌 필수 구성 요소로 TLS를 통합합니다. 이러한 통합을 통해 기본적으로 메시지를 암호화할 수 있습니다.

QUIC 네트워크 개요

아래 다이어그램은 QUIC 네트워크의 기본 구조를 보여줍니다. 다이어그램에서 볼 수 있듯이 HTTP/3 요청, 응답 또는 모든 애플리케이션 데이터를 포함하는 논리적 개체가 QUIC 스트림입니다. QUIC 스트림은 네트워크 엔드포인트 간 전송을 위해 여러 논리적 레이어 내에 둘러싸여 있습니다.

Quic의 네트워크 구조 다이어그램

QUIC 스트림의 구조

바깥쪽에서 시작하여 안쪽으로, 논리적 레이어와 개체는 다음과 같습니다.

  • UDP 데이터그램 - 길이 및 체크섬 데이터와 함께 소스 및 대상 포트를 지정하는 헤더가 포함되어 있으며 이어서 하나 이상의 QUIC 패킷이 옵니다. 데이터그램은 네트워크를 통해 클라이언트에서 서버로 전송되는 정보의 단위입니다.
  • QUIC 패킷 - 하나의 QUIC 헤더와 하나 이상의 QUIC 프레임을 포함합니다.
  • QUIC 헤더 - 패킷에 대한 메타데이터가 포함되며, 헤더에는 다음 두 가지 유형이 있습니다.
    • 연결 설정 중에 사용되는 긴 헤더.
    • 연결이 설정된 후 사용되는 짧은 헤더. 데이터 중에서도 연결 ID, 패킷 번호 및 키 단계(키 순환을 지원하기 위해 패킷 암호화에 사용된 키를 추적하는 데 사용됨)를 포함합니다. 패킷 번호는 특정 연결 및 키 단계에서 고유하며 항상 증가합니다.
  • 프레임 - 유형, 스트림 ID, 오프셋 및 스트림 데이터를 포함합니다. 스트림 데이터는 여러 프레임에 분산되어 있지만 연결 ID, 스트림 ID 및 오프셋을 사용하여 조립할 수 있으며, 데이터 청크를 올바른 순서로 표시하는 데 사용됩니다.
  • 스트림 - 단일 QUIC 연결 내에서 단방향 또는 양방향 데이터 흐름. 각 QUIC 연결은 각각 고유한 스트림 ID를 가진 여러 개의 독립 스트림을 지원할 수 있습니다. 일부 스트림을 포함하는 QUIC 패킷이 손실되더라도 손실된 패킷에 포함되지 않은 스트림의 진행에는 영향을 주지 않습니다(이는 HTTP/2에서 발생하는 헤드 오브 라인 블로킹(head-of-line blocking)을 피하는 데 매우 중요합니다). 스트림은 양방향이며 양쪽 엔드포인트에서 생성될 수 있습니다.
QUIC와 TLS 핸드셰이크의 작동 방식

TLS 핸드셰이크는 클라이언트와 서버 간의 안전한 연결을 제공합니다. QUIC에서 제공하는 암호화에는 TLS v1.3이 필요합니다. 아래 다이어그램에서 볼 수 있듯이 QUIC는 암호화 키를 제공하는 TLS "콘텐츠 레이어"는 유지하지만 "레코드 레이어"를 자체 전송 메커니즘으로 대체합니다.

TLS 및 Quic 레이어 다이어그램

또한 QUIC는 보안과 성능에 중요한 매개변수의 인증 및 협상을 위해 TLS를 사용합니다. 두 프로토콜은 엄격한 계층화 대신에 서로 협력합니다. QUIC는 TLS 핸드셰이크를 사용하여 보안 연결을 설정하고 TLS는 QUIC가 제공하는 신뢰성, 순서 지정된 전송, 레코드 레이어를 사용합니다.

높은 수준에서 보면 TLS와 QUIC 구성 요소 사이에는 두 가지 주요 상호 작용이 있습니다.

  • TLS 구성 요소는 QUIC 구성 요소를 통해 메시지를 주고받으며, QUIC는 TLS에 안정적인 스트림 추상화를 제공합니다.
  • TLS 구성 요소는 (a) 설치할 새로운 패킷 보호 키, (b) 핸드셰이크 완료, 서버 인증서 등의 상태 변경을 포함하여 QUIC 구성 요소에 대한 일련의 업데이트를 제공합니다.

QUIC TLS를 위한 HTTP/3 지원 옵션

QUIC TLS는 QUIC 프로토콜을 위해 특별히 설계된 TLS의 변형입니다. 현재는 QUIC TLS에서 HTTP/3 지원을 원하는 사용자를 위한 두 가지 옵션이 있습니다.

  • OpenSSL QUIC 구현 - OpenSSL은 현재 완전한 QUIC 스택을 자체적으로 구현하기 위해 노력하고 있습니다. 이 개발은 모든 QUIC 기능을 구현 내에 캡슐화하여 HTTP/3 사용자가 QUIC 특정 기능에 대한 걱정 없이 OpenSSL TLS API를 훨씬 쉽게 사용할 수 있도록 합니다.
  • BoringSSL QUIC API를 지원하는 라이브러리 - 이제 BoringSSL, quicTLS 및 LibreSSL(OpenSSL의 분기로 시작됨)과 같은 다양한 SSL 라이브러리는 BoringSSL QUIC API를 구현하여 QUIC TLS 기능을 제공합니다. 현재는 OpenSSL QUIC TLS 구현이 아직 준비되지 않아 HTTP/3을 사용하려는 사용자에게 유일한 옵션입니다.
QUIC+HTTP/3의 장점

QUIC+HTTP/3은 불안정한 네트워크에서 지연 시간을 줄이고 데이터 전송을 개선하여 웹 애플리케이션의 성능을 향상시키는 것을 목표로 하며, 다음과 같은 장점이 있습니다.

  • 지연 시간 단축 - TCP와 같은 기존 프로토콜은 연결 설정 프로세스로 인해 지연 시간이 발생합니다. QUIC+HTTP/3의 멀티플렉싱 기능을 사용하면 연결을 보다 효율적으로 설정할 수 있으므로 연결 설정 및 데이터 전송 지연 시간이 단축됩니다.
  • 더 빠른 연결 설정 - QUIC+HTTP/3은 TLS 핸드셰이크와 암호화 설정을 단일 단계로 결합하여 안전한 연결을 설정하는 데 필요한 왕복 횟수를 줄입니다.
  • 멀티플렉싱 - QUIC+HTTP/3은 단일 연결 내에서 여러 데이터 스트림을 처리함으로써 네트워크 리소스를 보다 효율적으로 사용할 수 있게 하며, 기존 TCP 연결에서 하나의 느린 스트림이 다른 스트림을 지연시키는 헤드 오브 라인 블로킹(head-of-line blocking) 문제를 방지할 수 있습니다.
  • 향상된 오류 수정 - QUIC에는 순방향 오류 수정 기술이 통합되어 있어 재전송 없이 손실된 패킷을 복구할 수 있으므로 패킷 손실이 성능에 미치는 영향을 줄일 수 있습니다.
  • 패킷 손실 영향 감소 - UDP는 연결이 필요하지 않으며 TCP의 엄격한 오류 검사 없이도 빠른 전송이 가능합니다. 이는 특히 네트워크 상태가 안정적이지 않은 시나리오에서 유리합니다.
  • 적응형 혼잡도 제어 - QUIC+HTTP/3은 TCP의 혼잡도 제어보다 더 효율적이고 반응이 빠르도록 설계되어 다양한 네트워크 환경에서 더 나은 성능을 제공합니다.
  • 마이그레이션 지원 - QUIC+HTTP/3은 애플리케이션의 성능 저하 없이 서로 다른 네트워크 연결 간에 원활하게 전환할 수 있습니다(예: Wi-Fi에서 셀룰러로 전환).
  • 향상된 보안 - QUIC+HTTP/3은 기본적으로 암호화가 통합되어 데이터 전송에 대한 보안 및 개인정보 보호를 강화합니다. 이 암호화는 전송 중인 데이터의 도청과 변조를 방지합니다.
  • NAT 트래버설 - QUIC+HTTP/3의 UDP 사용은 NAT(네트워크 주소 변환) 트래버설을 지원하므로 기존 TCP 연결에 문제가 발생할 수 있는 시나리오에서 보다 간편하게 연결을 설정할 수 있습니다.
  • 지속적인 진화 - QUIC+HTTP/3은 기본 네트워크 인프라를 변경할 필요 없이 소프트웨어를 통해 구현 및 업데이트하도록 설계되었기 때문에 변화하는 네트워크 조건과 보안 문제에 맞춰 더욱 빠르게 업데이트하고 개선할 수 있습니다.
NGINX에서 QUIC+HTTP/3 사용에 대해 알아보기

아래 리소스를 살펴보고 NGINX의 QUIC+HTTP/3 구현과 더 빠르고 효율적인 통신을 위해 QUIC+HTTP/3을 사용할 수 있는 다른 방법에 대해 알아보십시오.