빠른 UDP 인터넷 연결(QUIC)은 유연성, 기본 제공 보안, 성능 문제 감소, 빠른 도입 속도를 바탕으로 전송 제어 프로토콜(TCP)을 대체하도록 설계된 범용 전송 계층 프로토콜입니다. Google이 처음 개발한 QUIC은 클라이언트와 서버 간에 패킷을 전송하기 위한 하위 수준 전송 메커니즘으로 사용자 데이터그램 프로토콜(UDP)을 사용합니다. 특히 QUIC은 전송 계층 보안(TLS)을 HTTP/1.1 및 HTTP/2처럼 별도의 계층으로 추가하는 것이 아니라 핵심 구성 요소로 통합합니다.

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에서 발생하는 HOL(Head-of-Line) 블로킹을 방지하는 데 매우 중요합니다). 스트림은 양방향일 수 있으며 어느 엔드포인트에서든 생성할 수 있습니다.

QUIC이 TLS 핸드셰이크와 함께 작동하는 방식

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

QUIC 계층과 TLS 계층

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

개괄적으로 보면 TLS와 QUIC 구성 요소 간에는 두 가지 주요 상호 작용이 있습니다:

  • TLS 구성 요소는 QUIC 구성 요소를 통해 메시지를 송수신하며, QUIC은 TLS에 신뢰할 수 있는 스트림 추상화를 제공합니다.
  • TLS 구성 요소는 QUIC 구성 요소에 일련의 업데이트를 제공합니다. 여기에는 (a) 설치할 새 패킷 보호 키와 (b) 핸드셰이크 완료, 서버 인증서 등의 상태 변경이 포함됩니다.

QUIC TLS의 HTTP/3 지원 옵션

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

  • OpenSSL QUIC 구현 – OpenSSL은 현재 완전한 QUIC 스택을 자체적으로 구현하는 작업을 진행하고 있습니다. 이 개발이 완료되면 모든 QUIC 기능이 구현체 내부에 포함되므로, HTTP/3 사용자는 QUIC 관련 기능을 신경 쓰지 않고도 OpenSSL TLS API를 훨씬 쉽게 사용할 수 있습니다.
  • Libraries supporting 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 연결에서 하나의 느린 스트림이 다른 스트림을 지연시킬 수 있는 HOL(Head-of-Line) 블로킹 문제를 방지하는 데 도움이 됩니다.
  • 향상된 오류 정정 – 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는 기본 네트워크 인프라를 변경할 필요 없이 소프트웨어로 구현하고 업데이트할 수 있도록 설계되었기 때문에, 변화하는 네트워크 환경과 보안 문제에 맞춰 더욱 신속하게 업데이트하고 개선할 수 있습니다.