RFC 8999 QUIC 불변 사항 2021년 5월
Thomson 표준 트랙 [페이지]
스트림:
인터넷 엔지니어링 태스크 포스(IETF)
RFC:
8999
분류:
표준 트랙
발행:
ISSN:
2070-1721
저자:
M. Thomson
Mozilla

RFC 8999

QUIC의 버전 독립적 속성

초록

이 문서는 프로토콜의 모든 버전에 공통적인 QUIC 전송 프로토콜의 속성을 정의한다.

이 메모의 상태

이는 인터넷 표준 트랙 문서이다.

이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산출물이다. 이는 IETF 커뮤니티의 합의를 나타낸다. 이 문서는 공개 검토를 받았으며, 인터넷 엔지니어링 운영 그룹(IESG)에 의해 발행 승인을 받았다. 인터넷 표준에 대한 자세한 정보는 RFC 7841의 섹션 2에서 확인할 수 있다.

이 문서의 현재 상태, 정오표 및 이에 대한 피드백 제공 방법에 관한 정보는 https://www.rfc-editor.org/info/rfc8999에서 확인할 수 있다.

목차

1. QUIC에 대한 극도로 추상적인 설명

QUIC은 두 엔드포인트 사이의 연결 지향 프로토콜이다. 이러한 엔드포인트는 UDP 데이터그램을 교환한다. 이 UDP 데이터그램에는 QUIC 패킷이 포함된다. QUIC 엔드포인트는 QUIC 패킷을 사용하여 QUIC 연결을 설정하며, 이는 이러한 엔드포인트 간에 공유되는 프로토콜 상태이다.

2. 모든 QUIC 버전의 고정 속성

QUIC [QUIC-TRANSPORT]은 안전하고 다중화된 전송을 제공하는 것에 더해, 버전을 협상할 수 있는 선택지를 허용한다. 이를 통해 프로토콜은 새로운 요구 사항에 대응하여 시간이 지나면서 변경될 수 있다. 프로토콜의 많은 특성은 버전 간에 변경될 수 있다.

이 문서는 새로운 버전이 개발되고 배포될 때 안정적으로 유지되도록 의도된 QUIC의 부분집합을 설명한다. 이러한 모든 불변 사항은 IP 버전과 독립적이다.

이 문서의 주된 목표는 새로운 QUIC 버전을 배포할 수 있음을 보장하는 것이다. 변경될 수 없는 속성을 문서화함으로써, 이 문서는 QUIC 엔드포인트가 프로토콜의 다른 모든 측면에 대한 변경을 협상할 수 있는 능력을 보존하는 것을 목표로 한다. 그 결과, 이는 엔드포인트가 아닌 엔터티에 제공되는 최소한의 정보량도 보장한다. 이 문서에서 명시적으로 금지하지 않는 한, 프로토콜의 모든 측면은 서로 다른 버전 간에 변경될 수 있다.

부록 A에는 QUIC 버전 1에 대한 지식을 바탕으로 할 수 있는 몇 가지 잘못된 가정의 비포괄적 목록이 포함되어 있으며, 이는 QUIC의 모든 버전에 적용되지 않는다.

3. 규약 및 정의

이 문서의 핵심 단어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 및 "OPTIONAL"은 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석되어야 한다.

이 문서는 규범적 언어가 사용되지 않은 경우에도 미래 QUIC 버전에 대한 요구 사항을 정의한다.

이 문서는 [QUIC-TRANSPORT]의 용어 및 표기 규약을 사용한다.

4. 표기 규약

패킷의 형식은 이 섹션에서 정의한 표기를 사용하여 설명된다. 이 표기는 [QUIC-TRANSPORT]에서 사용된 것과 동일하다.

복합 필드는 이름이 지정된 뒤, 일치하는 중괄호 쌍으로 둘러싸인 필드 목록이 뒤따른다. 이 목록의 각 필드는 쉼표로 구분된다.

개별 필드에는 길이 정보와 함께 고정 값, 선택성 또는 반복에 대한 표시가 포함된다. 개별 필드는 다음 표기 규약을 사용하며, 모든 길이는 비트 단위이다:

x (A):

x가 A비트 길이임을 나타낸다

x (A..B):

x가 A부터 B까지의 임의 길이일 수 있음을 나타낸다. A는 생략되어 최소 0비트를 나타낼 수 있고, B는 생략되어 정해진 상한이 없음을 나타낼 수 있다. 이 형식의 값은 항상 바이트 경계에서 끝난다

x (L) = C:

x가 C의 고정 값을 가짐을 나타낸다. x의 길이는 L로 설명되며, 이는 위의 길이 형식 중 어느 것이든 사용할 수 있다

x (L) ...:

x가 0회 이상 반복되고 각 인스턴스의 길이가 L임을 나타낸다

이 문서는 네트워크 바이트 순서, 즉 빅 엔디언 값을 사용한다. 필드는 각 바이트의 상위 비트부터 배치된다.

그림 1은 예제 구조를 보여준다:

Example Structure {
  One-bit Field (1),
  7-bit Field with Fixed Value (7) = 61,
  Arbitrary-Length Field (..),
  Variable-Length Field (8..24),
  Repeated Field (8) ...,
}
그림 1: 예제 형식

5. QUIC 패킷

QUIC 엔드포인트는 하나 이상의 QUIC 패킷을 포함하는 UDP 데이터그램을 교환한다. 이 섹션은 QUIC 패킷의 불변 특성을 설명한다. QUIC의 한 버전은 단일 UDP 데이터그램에 여러 QUIC 패킷을 허용할 수 있지만, 불변 속성은 데이터그램의 첫 번째 패킷만 설명한다.

QUIC은 두 가지 유형의 패킷 헤더, 즉 긴 헤더와 짧은 헤더를 정의한다. 긴 헤더를 가진 패킷은 첫 번째 바이트의 최상위 비트가 설정되어 식별되며, 짧은 헤더를 가진 패킷은 해당 비트가 지워져 있다.

QUIC 패킷은 헤더를 포함하여 무결성 보호될 수 있다. 그러나 QUIC 버전 협상 패킷은 무결성 보호되지 않는다. 섹션 6을 참조한다.

여기에 설명된 값들을 제외하면, QUIC 패킷의 페이로드는 버전별이며 임의 길이이다.

5.1. 긴 헤더

긴 헤더는 그림 2에 설명된 형식을 취한다.

Long Header Packet {
  Header Form (1) = 1,
  Version-Specific Bits (7),
  Version (32),
  Destination Connection ID Length (8),
  Destination Connection ID (0..2040),
  Source Connection ID Length (8),
  Source Connection ID (0..2040),
  Version-Specific Data (..),
}
그림 2: QUIC 긴 헤더

긴 헤더를 가진 QUIC 패킷은 첫 번째 바이트의 상위 비트가 1로 설정된다. 해당 바이트의 다른 모든 비트는 버전별이다.

다음 네 바이트에는 32비트 Version 필드가 포함된다. 버전은 섹션 5.4에서 설명된다.

다음 바이트에는 그 뒤에 오는 Destination Connection ID 필드의 바이트 단위 길이가 포함된다. 이 길이는 8비트 부호 없는 정수로 인코딩된다. Destination Connection ID 필드는 Destination Connection ID Length 필드 뒤에 오며 길이는 0에서 255바이트 사이이다. 연결 ID는 섹션 5.3에서 설명된다.

다음 바이트에는 그 뒤에 오는 Source Connection ID 필드의 바이트 단위 길이가 포함된다. 이 길이는 8비트 부호 없는 정수로 인코딩된다. Source Connection ID 필드는 Source Connection ID Length 필드 뒤에 오며, 길이는 0에서 255바이트 사이이다.

패킷의 나머지 부분에는 버전별 내용이 포함된다.

5.2. 짧은 헤더

짧은 헤더는 그림 3에 설명된 형식을 취한다.

Short Header Packet {
  Header Form (1) = 0,
  Version-Specific Bits (7),
  Destination Connection ID (..),
  Version-Specific Data (..),
}
그림 3: QUIC 짧은 헤더

짧은 헤더를 가진 QUIC 패킷은 첫 번째 바이트의 상위 비트가 0으로 설정된다.

짧은 헤더를 가진 QUIC 패킷은 첫 번째 바이트 바로 뒤에 Destination Connection ID를 포함한다. 짧은 헤더에는 Destination Connection ID Length, Source Connection ID Length, Source Connection ID 또는 Version 필드가 포함되지 않는다. Destination Connection ID의 길이는 짧은 헤더를 가진 패킷에 인코딩되지 않으며, 이 명세에 의해 제한되지 않는다.

패킷의 나머지 부분은 버전별 의미를 가진다.

5.3. 연결 ID

연결 ID는 임의 길이의 불투명한 필드이다.

연결 ID의 주된 기능은 하위 프로토콜 계층(UDP, IP 및 그 이하)에서 주소 지정이 변경되어도 QUIC 연결의 패킷이 잘못된 QUIC 엔드포인트로 전달되지 않도록 하는 것이다. 연결 ID는 엔드포인트와 이를 지원하는 중간 장치가 각 QUIC 패킷을 올바른 엔드포인트 인스턴스로 전달할 수 있도록 사용된다. 엔드포인트에서 연결 ID는 패킷이 의도된 QUIC 연결을 식별하는 데 사용된다.

연결 ID는 각 엔드포인트가 버전별 방법을 사용하여 선택한다. 동일한 QUIC 연결의 패킷은 서로 다른 연결 ID 값을 사용할 수 있다.

5.4. 버전

Version 필드에는 4바이트 식별자가 포함된다. 이 값은 엔드포인트가 QUIC 버전을 식별하는 데 사용할 수 있다. 값이 0x00000000인 Version 필드는 버전 협상을 위해 예약되어 있다. 섹션 6을 참조한다. 다른 모든 값은 잠재적으로 유효하다.

이 문서에서 설명하는 속성은 QUIC의 모든 버전에 적용된다. 이 문서에서 설명한 속성을 따르지 않는 프로토콜은 QUIC이 아니다. 미래의 문서는 특정 QUIC 버전 또는 QUIC 버전 범위에 적용되는 추가 속성을 설명할 수 있다.

6. 버전 협상

QUIC 엔드포인트가 긴 헤더와 자신이 이해하지 못하거나 지원하지 않는 버전을 가진 패킷을 수신하면, 이에 대한 응답으로 Version Negotiation 패킷을 보낼 수 있다. 짧은 헤더를 가진 패킷은 버전 협상을 유발하지 않는다.

Version Negotiation 패킷은 첫 번째 바이트의 상위 비트를 설정하므로, 섹션 5.1에 정의된 긴 헤더를 가진 패킷의 형식을 따른다. Version Negotiation 패킷은 Version 필드가 0x00000000으로 설정되어 있다는 점으로 식별할 수 있다.

Version Negotiation Packet {
  Header Form (1) = 1,
  Unused (7),
  Version (32) = 0,
  Destination Connection ID Length (8),
  Destination Connection ID (0..2040),
  Source Connection ID Length (8),
  Source Connection ID (0..2040),
  Supported Version (32) ...,
}
그림 4: Version Negotiation 패킷

Version Negotiation 패킷의 첫 번째 바이트에서 최상위 비트만 정의된 값을 가진다. "Unused"로 표시된 나머지 7비트는 송신 시 임의 값으로 설정될 수 있으며, 수신 시 MUST 무시되어야 한다.

Source Connection ID 필드 뒤에, Version Negotiation 패킷은 각각 패킷을 보내는 엔드포인트가 지원하는 버전을 식별하는 Supported Version 필드 목록을 포함한다. Version Negotiation 패킷에는 다른 필드가 포함되지 않는다. 엔드포인트는 Supported Version 필드가 없거나 잘린 Supported Version 값을 포함하는 패킷을 MUST 무시해야 한다.

Version Negotiation 패킷은 무결성 또는 기밀성 보호를 사용하지 않는다. 특정 QUIC 버전은 엔드포인트가 지원되는 버전 집합의 수정 또는 손상을 감지할 수 있도록 하는 프로토콜 요소를 포함할 수 있다.

엔드포인트는 수신한 패킷의 Source Connection ID 필드 값을 Destination Connection ID 필드에 MUST 포함해야 한다. Source Connection ID 필드의 값은 수신한 패킷의 Destination Connection ID 필드에서 MUST 복사되어야 하며, 이 값은 처음에 클라이언트가 무작위로 선택한다. 두 연결 ID를 모두 에코하면, 클라이언트는 서버가 패킷을 수신했으며 Version Negotiation 패킷이 패킷을 관찰할 수 없는 공격자에 의해 생성되지 않았다는 약간의 확신을 얻을 수 있다.

Version Negotiation 패킷을 수신한 엔드포인트는 이후 패킷에 사용할 버전을 변경하기로 결정할 수 있다. 엔드포인트가 QUIC 버전을 변경하는 조건은 선택한 QUIC 버전에 따라 달라진다.

QUIC 버전 1을 지원하는 엔드포인트가 Version Negotiation 패킷을 생성하고 처리하는 방식에 대한 더 자세한 설명은 [QUIC-TRANSPORT]를 참조한다.

7. 보안 및 개인정보 보호 고려 사항

미들박스가 QUIC의 특정 버전의 특징을 관찰한 뒤, QUIC의 다른 버전이 유사한 특징을 보일 때 동일한 기본 의미가 표현되고 있다고 가정할 가능성이 있다. 그러한 특징은 잠재적으로 많다. 부록 A를 참조한다. QUIC 버전 1에서는 관찰 가능한 일부 특징을 제거하거나 모호하게 만들기 위한 노력이 이루어졌지만, 이러한 특징 중 상당수는 여전히 남아 있다. 다른 QUIC 버전은 다른 설계 결정을 내릴 수 있으므로 다른 특징을 보일 수 있다.

QUIC 버전 번호는 모든 QUIC 패킷에 나타나지 않는다. 이는 버전별 특징을 기반으로 흐름에서 정보를 신뢰성 있게 추출하려면 미들박스가 자신이 보는 모든 연결 ID에 대한 상태를 유지해야 함을 의미한다.

이 문서에서 설명하는 Version Negotiation 패킷은 무결성 보호되지 않으며, 공격자에 의한 삽입에 대해서는 제한적인 보호만 제공한다. 엔드포인트는 그 결과 다른 QUIC 버전을 시도하는 경우 Version Negotiation 패킷의 의미적 내용을 MUST 인증해야 한다.

8. 참고 문헌

8.1. 규범적 참고 문헌

[RFC2119]
Bradner, S., "RFC에서 요구 수준을 나타내기 위해 사용하는 핵심 단어", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC8174]
Leiba, B., "RFC 2119 핵심 단어에서 대문자와 소문자의 모호성", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.

8.2. 정보 제공 참고 문헌

[QUIC-TLS]
Thomson, M., Ed.S. Turner, Ed., "TLS를 사용한 QUIC 보안", RFC 9001, DOI 10.17487/RFC9001, , <https://www.rfc-editor.org/info/rfc9001>.
[QUIC-TRANSPORT]
Iyengar, J., Ed.M. Thomson, Ed., "QUIC: UDP 기반의 다중화되고 안전한 전송", RFC 9000, DOI 10.17487/RFC9000, , <https://www.rfc-editor.org/info/rfc9000>.
[RFC5116]
McGrew, D., "인증 암호화를 위한 인터페이스 및 알고리즘", RFC 5116, DOI 10.17487/RFC5116, , <https://www.rfc-editor.org/info/rfc5116>.

부록 A. 잘못된 가정

QUIC 버전 1 [QUIC-TRANSPORT]에는 관찰로부터 보호되지 않지만 새 버전이 배포될 때 변경 가능한 것으로 간주되는 여러 특징이 있다.

이 섹션은 QUIC 버전 1에 대한 지식을 바탕으로 QUIC에 대해 할 수 있는 잘못된 가정의 예를 나열한다. 이러한 문장 중 일부는 QUIC 버전 1에서도 참이 아니다. 이는 포괄적 목록이 아니며, 설명을 위한 예시일 뿐이다.

다음 문장 중 일부 또는 전부는 특정 QUIC 버전에 대해 거짓일 수 있다:

저자 주소

Martin Thomson
Mozilla