QUIC와 HTTP/3는 무엇인가?

QUIC(Quick UDP Internet Connections)는 유연성, 내장된 보안, 성능 문제 감소, 빠른 채택 속도를 통해 전송 제어 프로토콜(TCP)을 대체하도록 설계된 범용 전송 계층 프로토콜입니다. 원래 Google에서 개발한 QUIC은 클라이언트와 서버 간에 패킷을 이동하기 위한 저수준 전송 메커니즘으로 사용자 데이터그램 프로토콜(UDP)을 사용합니다. 특히, QUIC는 HTTP/1.1 및 HTTP/2와 같이 추가 계층이 아닌 필수 구성 요소로 TLS(전송 계층 보안)를 통합합니다.

QUIC 기반의 HTTP/3는 하이퍼텍스트 전송 프로토콜(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에서 경험하는 헤드 오브 라인 차단을 피하는 데 중요합니다). 스트림은 양방향일 수 있으며 두 엔드포인트 중 하나에서 생성될 수 있습니다.
QUIC이 TLS 핸드셰이크와 함께 작동하는 방식

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

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 연결에서 하나의 느린 스트림이 다른 스트림을 지연시킬 수 있는 헤드 오브 라인 차단 문제를 방지하는 데 도움이 됩니다.
  • 개선된 오류 수정 – 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를 사용하여 더 빠르고 효율적인 통신을 할 수 있는 다른 방법에 대해 알아보세요.