rfc9246.original   rfc9246.txt 
CDNI R. van Brandenburg Internet Engineering Task Force (IETF) R. van Brandenburg
Internet-Draft Tiledmedia Request for Comments: 9246 Tiledmedia
Intended status: Standards Track K. Leung Category: Standards Track K. Leung
Expires: 23 September 2022 ISSN: 2070-1721
P. Sorber P. Sorber
Apple, Inc. Apple, Inc.
22 March 2022 June 2022
URI Signing for Content Delivery Network Interconnection (CDNI) URI Signing for Content Delivery Network Interconnection (CDNI)
draft-ietf-cdni-uri-signing-26
Abstract Abstract
This document describes how the concept of URI Signing supports the This document describes how the concept of URI Signing supports the
content access control requirements of Content Delivery Network content access control requirements of Content Delivery Network
Interconnection (CDNI) and proposes a URI Signing method as a JSON Interconnection (CDNI) and proposes a URI Signing method as a JSON
Web Token (JWT) profile. Web Token (JWT) profile.
The proposed URI Signing method specifies the information needed to The proposed URI Signing method specifies the information needed to
be included in the URI to transmit the signed JWT, as well as the be included in the URI to transmit the signed JWT, as well as the
claims needed by the signed JWT to authorize a User Agent (UA). The claims needed by the signed JWT to authorize a User Agent (UA). The
mechanism described can be used both in CDNI and single Content mechanism described can be used both in CDNI and single Content
Delivery Network (CDN) scenarios. Delivery Network (CDN) scenarios.
Status of This Memo Status of This Memo
This Internet-Draft is submitted in full conformance with the This is an Internet Standards Track document.
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months This document is a product of the Internet Engineering Task Force
and may be updated, replaced, or obsoleted by other documents at any (IETF). It represents the consensus of the IETF community. It has
time. It is inappropriate to use Internet-Drafts as reference received public review and has been approved for publication by the
material or to cite them other than as "work in progress." Internet Engineering Steering Group (IESG). Further information on
Internet Standards is available in Section 2 of RFC 7841.
This Internet-Draft will expire on 23 September 2022. Information about the current status of this document, any errata,
and how to provide feedback on it may be obtained at
https://www.rfc-editor.org/info/rfc9246.
Copyright Notice Copyright Notice
Copyright (c) 2022 IETF Trust and the persons identified as the Copyright (c) 2022 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents
license-info) in effect on the date of publication of this document. (https://trustee.ietf.org/license-info) in effect on the date of
Please review these documents carefully, as they describe your rights publication of this document. Please review these documents
and restrictions with respect to this document. Code Components carefully, as they describe your rights and restrictions with respect
extracted from this document must include Revised BSD License text as to this document. Code Components extracted from this document must
described in Section 4.e of the Trust Legal Provisions and are include Revised BSD License text as described in Section 4.e of the
provided without warranty as described in the Revised BSD License. Trust Legal Provisions and are provided without warranty as described
in the Revised BSD License.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction
1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4 1.1. Terminology
1.2. Background and overview on URI Signing . . . . . . . . . 5 1.2. Background and Overview on URI Signing
1.3. CDNI URI Signing Overview . . . . . . . . . . . . . . . . 6 1.3. CDNI URI Signing Overview
1.4. URI Signing in a non-CDNI context . . . . . . . . . . . . 9 1.4. URI Signing in a Non-CDNI Context
2. JWT Format and Processing Requirements . . . . . . . . . . . 9 2. JWT Format and Processing Requirements
2.1. JWT Claims . . . . . . . . . . . . . . . . . . . . . . . 10 2.1. JWT Claims
2.1.1. Issuer (iss) claim . . . . . . . . . . . . . . . . . 10 2.1.1. Issuer (iss) Claim
2.1.2. Subject (sub) claim . . . . . . . . . . . . . . . . . 11 2.1.2. Subject (sub) Claim
2.1.3. Audience (aud) claim . . . . . . . . . . . . . . . . 11 2.1.3. Audience (aud) Claim
2.1.4. Expiry Time (exp) claim . . . . . . . . . . . . . . . 11 2.1.4. Expiry Time (exp) Claim
2.1.5. Not Before (nbf) claim . . . . . . . . . . . . . . . 12 2.1.5. Not Before (nbf) Claim
2.1.6. Issued At (iat) claim . . . . . . . . . . . . . . . . 12 2.1.6. Issued At (iat) Claim
2.1.7. JWT ID (jti) claim . . . . . . . . . . . . . . . . . 12 2.1.7. JWT ID (jti) Claim
2.1.8. CDNI Claim Set Version (cdniv) claim . . . . . . . . 13 2.1.8. CDNI Claim Set Version (cdniv) Claim
2.1.9. CDNI Critical Claims Set (cdnicrit) claim . . . . . . 13 2.1.9. CDNI Critical Claims Set (cdnicrit) Claim
2.1.10. Client IP Address (cdniip) claim . . . . . . . . . . 13 2.1.10. Client IP Address (cdniip) Claim
2.1.11. CDNI URI Container (cdniuc) claim . . . . . . . . . . 14 2.1.11. CDNI URI Container (cdniuc) Claim
2.1.12. CDNI Expiration Time Setting (cdniets) claim . . . . 14 2.1.12. CDNI Expiration Time Setting (cdniets) Claim
2.1.13. CDNI Signed Token Transport (cdnistt) claim . . . . . 14 2.1.13. CDNI Signed Token Transport (cdnistt) Claim
2.1.14. CDNI Signed Token Depth (cdnistd) claim . . . . . . . 15 2.1.14. CDNI Signed Token Depth (cdnistd) Claim
2.1.15. URI Container Forms . . . . . . . . . . . . . . . . . 15 2.1.15. URI Container Forms
2.1.15.1. URI Hash Container (hash:) . . . . . . . . . . . 16 2.1.15.1. URI Hash Container (hash:)
2.1.15.2. URI Regular Expression Container (regex:) . . . 16 2.1.15.2. URI Regular Expression Container (regex:)
2.2. JWT Header . . . . . . . . . . . . . . . . . . . . . . . 16 2.2. JWT Header
3. URI Signing Token Renewal . . . . . . . . . . . . . . . . . . 17 3. URI Signing Token Renewal
3.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1. Overview
3.2. Signed Token Renewal mechanism . . . . . . . . . . . . . 17 3.2. Signed Token Renewal Mechanism
3.2.1. Required Claims . . . . . . . . . . . . . . . . . . . 18 3.2.1. Required Claims
3.3. Communicating a signed JWTs in Signed Token Renewal . . . 18 3.3. Communicating a Signed JWT in Signed Token Renewal
3.3.1. Support for cross-domain redirection . . . . . . . . 18 3.3.1. Support for Cross-Domain Redirection
4. Relationship with CDNI Interfaces . . . . . . . . . . . . . . 19 4. Relationship with CDNI Interfaces
4.1. CDNI Control Interface . . . . . . . . . . . . . . . . . 19 4.1. CDNI Control Interface
4.2. CDNI Footprint & Capabilities Advertisement Interface . . 19 4.2. CDNI Footprint & Capabilities Advertisement Interface
4.3. CDNI Request Routing Redirection Interface . . . . . . . 19 4.3. CDNI Request Routing Redirection Interface
4.4. CDNI Metadata Interface . . . . . . . . . . . . . . . . . 19 4.4. CDNI Metadata Interface
4.5. CDNI Logging Interface . . . . . . . . . . . . . . . . . 21 4.5. CDNI Logging Interface
5. URI Signing Message Flow
5. URI Signing Message Flow . . . . . . . . . . . . . . . . . . 22 5.1. HTTP Redirection
5.1. HTTP Redirection . . . . . . . . . . . . . . . . . . . . 22 5.2. DNS Redirection
5.2. DNS Redirection . . . . . . . . . . . . . . . . . . . . . 25 6. IANA Considerations
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 28 6.1. CDNI Payload Type
6.1. CDNI Payload Type . . . . . . . . . . . . . . . . . . . . 28 6.1.1. CDNI UriSigning Payload Type
6.1.1. CDNI UriSigning Payload Type . . . . . . . . . . . . 28 6.2. CDNI Logging Record Type
6.2. CDNI Logging Record Type . . . . . . . . . . . . . . . . 28 6.2.1. CDNI Logging Record Version 2 for HTTP
6.2.1. CDNI Logging Record Version 2 for HTTP . . . . . . . 29 6.3. CDNI Logging Field Names
6.3. CDNI Logging Field Names . . . . . . . . . . . . . . . . 29 6.4. CDNI URI Signing Verification Code
6.4. CDNI URI Signing Verification Code . . . . . . . . . . . 30 6.5. CDNI URI Signing Signed Token Transport
6.5. CDNI URI Signing Signed Token Transport . . . . . . . . . 31 6.6. JSON Web Token Claims Registration
6.6. JSON Web Token Claims Registration . . . . . . . . . . . 32 6.6.1. Registry Contents
6.6.1. Registry Contents . . . . . . . . . . . . . . . . . . 32 6.7. Expert Review Guidance
6.7. Expert Review Guidance . . . . . . . . . . . . . . . . . 33 7. Security Considerations
7. Security Considerations . . . . . . . . . . . . . . . . . . . 33 8. Privacy
8. Privacy . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 9. References
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 35 9.1. Normative References
10. Contributors . . . . . . . . . . . . . . . . . . . . . . . . 35 9.2. Informative References
11. References . . . . . . . . . . . . . . . . . . . . . . . . . 35 Appendix A. Signed URI Package Example
11.1. Normative References . . . . . . . . . . . . . . . . . . 35 A.1. Simple Example
11.2. Informative References . . . . . . . . . . . . . . . . . 37 A.2. Complex Example
Appendix A. Signed URI Package Example . . . . . . . . . . . . . 39 A.3. Signed Token Renewal Example
A.1. Simple Example . . . . . . . . . . . . . . . . . . . . . 40 Acknowledgements
A.2. Complex Example . . . . . . . . . . . . . . . . . . . . . 40 Contributors
A.3. Signed Token Renewal Example . . . . . . . . . . . . . . 41 Authors' Addresses
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 42
1. Introduction 1. Introduction
This document describes the concept of URI Signing and how it can be This document describes the concept of URI Signing and how it can be
used to provide access authorization in the case of redirection used to provide access authorization in the case of redirection
between cooperating CDNs and between a Content Service Provider (CSP) between cooperating CDNs and between a Content Service Provider (CSP)
and a CDN. The primary goal of URI Signing is to make sure that only and a CDN. The primary goal of URI Signing is to make sure that only
authorized UAs are able to access the content, with a CSP being able authorized UAs are able to access the content, with a CSP being able
to authorize every individual request. It should be noted that URI to authorize every individual request. It should be noted that URI
Signing is not a content protection scheme; if a CSP wants to protect Signing is not a content protection scheme; if a CSP wants to protect
the content itself, other mechanisms, such as Digital Rights the content itself, other mechanisms, such as Digital Rights
Management (DRM), are more appropriate. In addition to access Management (DRM), are more appropriate. In addition to access
control, URI Signing also has benefits in reducing the impact of control, URI Signing also has benefits in reducing the impact of
denial-of-service attacks. denial-of-service attacks.
The overall problem space for CDN Interconnection (CDNI) is described The overall problem space for CDN Interconnection (CDNI) is described
in CDNI Problem Statement [RFC6707]. This document, along with the in the CDNI Problem Statement [RFC6707] specification. This
CDNI Requirements [RFC7337] document and the CDNI Framework document, along with the Content Distribution Network Interconnection
[RFC7336], describes the need for interconnected CDNs to be able to (CDNI) Requirements [RFC7337] document and the Framework for Content
implement an access control mechanism that enforces a CSP's Distribution Network Interconnection (CDNI) [RFC7336], describes the
distribution policies. need for interconnected CDNs to be able to implement an access
control mechanism that enforces a CSP's distribution policies.
Specifically, the CDNI Framework [RFC7336] states: Specifically, the CDNI Framework [RFC7336] states:
The CSP may also trust the CDN operator to perform actions such as The CSP may also trust the CDN operator to perform actions such as
delegating traffic to additional downstream CDNs, and to enforce delegating traffic to additional downstream CDNs, and to enforce
per-request authorization performed by the CSP using techniques per-request authorization performed by the CSP using techniques
such as URI Signing. such as URI Signing.
In particular, the following requirement is listed in the CDNI In particular, the following requirement is listed in the CDNI
Requirements [RFC7337]: Requirements [RFC7337]:
MI-16 {HIGH} The CDNI Metadata interface shall allow signaling of | MI-16 {HIGH} The CDNI Metadata interface shall allow signaling
authorization checks and verification that are to be performed by | of authorization checks and validation that are to be
the Surrogate before delivery. For example, this could | performed by the Surrogate before delivery. For example,
potentially include the need to verify information (e.g., Expiry | this could potentially include the need to validate
time, Client IP address) required for access authorization. | information (e.g., Expiry time, Client IP address) required
| for access authorization.
This document defines a method of signing URIs that allows Surrogates This document defines a method of signing URIs that allows Surrogates
in interconnected CDNs to enforce a per-request authorization in interconnected CDNs to enforce a per-request authorization
initiated by the CSP. Splitting the role of initiating per-request initiated by the CSP. Splitting the role of initiating per-request
authorization by the CSP and the role of verifying this authorization authorization by the CSP and the role of verifying this authorization
by the CDN allows any arbitrary distribution policy to be enforced by the CDN allows any arbitrary distribution policy to be enforced
across CDNs without the need of CDNs to have any awareness of the across CDNs without the need of CDNs to have any awareness of the
specific CSP distribution policies. specific CSP distribution policies.
The method is implemented using Signed JSON Web Tokens (JWTs) The method is implemented using signed JSON Web Tokens (JWTs)
[RFC7519]. [RFC7519].
1.1. Terminology 1.1. Terminology
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP "OPTIONAL" in this document are to be interpreted as described in
14 [RFC2119] [RFC8174] when, and only when, they appear in all BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here. capitals, as shown here.
This document uses the terminology defined in the CDNI Problem This document uses the terminology defined in the CDNI Problem
Statement [RFC6707]. Statement [RFC6707].
This document also uses the terminology of the JSON Web Token (JWT) This document also uses the terminology of the JSON Web Token (JWT)
[RFC7519]. [RFC7519].
In addition, the following terms are used throughout this document: In addition, the following terms are used throughout this document:
* Signed URI: A URI for which a signed JWT is provided. FCI: Footprint & Capabilities Advertisement interface
* Target CDN URI: URI created by the CSP to direct a UA towards the Signed URI: A URI for which a signed JWT is provided.
Upstream CDN (uCDN). The Target CDN URI can be signed by the CSP
and verified by the uCDN and possibly further Downstream CDNs Target CDN URI: A URI created by the CSP to direct a UA towards the
upstream CDN (uCDN). The Target CDN URI can be signed by the CSP
and verified by the uCDN and possibly further downstream CDNs
(dCDNs). (dCDNs).
* Redirection URI: URI created by the uCDN to redirect a UA towards Redirection URI: A URI created by the uCDN to redirect a UA towards
the dCDN. The Redirection URI can be signed by the uCDN and the dCDN. The Redirection URI can be signed by the uCDN and
verified by the dCDN. In a cascaded CDNI scenario, there can be verified by the dCDN. In a cascaded CDNI scenario, there can be
more than one Redirection URI. more than one Redirection URI.
* Signed Token Renewal: A series of signed JWTs that are used for Signed Token Renewal: A series of signed JWTs that are used for
subsequent access to a set of related resources in a CDN, such as subsequent access to a set of related resources in a CDN, such as
a set of HTTP Adaptive Streaming files. Every time a signed JWT a set of HTTP Adaptive Streaming files. Every time a signed JWT
is used to access a particular resource, a new signed JWT is sent is used to access a particular resource, a new signed JWT is sent
along with the resource that can be used to request the next along with the resource that can be used to request the next
resource in the set. When generating a new signed JWT in Signed resource in the set. When generating a new signed JWT in Signed
Token Renewal, parameters are carried over from one signed JWT to Token Renewal, parameters are carried over from one signed JWT to
the next. the next.
1.2. Background and overview on URI Signing 1.2. Background and Overview on URI Signing
A CSP and CDN are assumed to have a trust relationship that enables A CSP and CDN are assumed to have a trust relationship that enables
the CSP to authorize access to a content item, which is realized in the CSP to authorize access to a content item, which is realized in
practice by including a set of claims in a signed JWT in the URI practice by including a set of claims in a signed JWT in the URI
before redirecting a UA to the CDN. Using these attributes, it is before redirecting a UA to the CDN. Using these attributes, it is
possible for a CDN to check an incoming content request to see possible for a CDN to check an incoming content request to see
whether it was authorized by the CSP (e.g., based on a time window or whether it was authorized by the CSP (e.g., based on a time window or
pattern matching the URI). To prevent the UA from altering the pattern matching the URI). To prevent the UA from altering the
claims the JWT MUST be signed. claims, the JWT MUST be signed.
Figure 1, shown below, presents an overview of the URI Signing Figure 1 presents an overview of the URI Signing mechanism in the
mechanism in the case of a CSP with a single CDN. When the UA case of a CSP with a single CDN. When the UA browses for content on
browses for content on CSP's website (#1), it receives HTML web pages CSP's website (1), it receives HTML web pages with embedded content
with embedded content URIs. Upon requesting these URIs, the CSP URIs. Upon requesting these URIs, the CSP redirects to a CDN,
redirects to a CDN, creating a Target CDN URI (#2) (alternatively, creating a Target CDN URI (2) (alternatively, the Target CDN URI
the Target CDN URI itself is embedded in the HTML). The Target CDN itself is embedded in the HTML). The Target CDN URI is the Signed
URI is the Signed URI which may include the IP address of the UA and/ URI, which may include the IP address of the UA and/or a time window.
or a time window. The signed URI always contains a signed JWT The Signed URI always contains a signed JWT generated by the CSP
generated by the CSP using a shared secret or private key. Once the using a shared secret or private key. Once the UA receives the
UA receives the response with the Signed URI, it sends a new HTTP response with the Signed URI, it sends a new HTTP request using the
request using the Signed URI to the CDN (#3). Upon receiving the Signed URI to the CDN (3). Upon receiving the request, the CDN
request, the CDN authenticates the Signed URI by verifying the signed authenticates the Signed URI by verifying the signed JWT. If
JWT. If applicable, the CDN checks whether the time window is still applicable, the CDN checks whether the time window is still valid in
valid in the Signed URI and the pattern matches the URI of the the Signed URI and the pattern matches the URI of the request. After
request. After these claims are verified, the CDN delivers the these claims are verified, the CDN delivers the content (4).
content (#4).
Note: While using a symmetric shared key is supported, it is NOT Note: While using a symmetric shared key is supported, it is NOT
RECOMMENDED. See the Security Considerations (Section 7) section RECOMMENDED. See the Security Considerations (Section 7) about the
about the limitations of shared keys. limitations of shared keys.
-------- --------
/ \ / \
| CSP |< * * * * * * * * * * * | CSP |< * * * * * * * * * * *
\ / Trust * \ / Trust *
-------- relationship * -------- relationship *
^ | * ^ | *
| | * | | *
1. Browse | | 2. Signed * 1. Browse | | 2. Signed *
for | | URI * for | | URI *
skipping to change at page 6, line 32 skipping to change at line 263
| Agent| | CDN | | Agent| | CDN |
| |<-----------------\ / | |<-----------------\ /
+------+ 4. Content -------- +------+ 4. Content --------
Delivery Delivery
Figure 1: URI Signing in a CDN Environment Figure 1: URI Signing in a CDN Environment
1.3. CDNI URI Signing Overview 1.3. CDNI URI Signing Overview
In a CDNI environment, as shown in Figure 2 below, URI Signing In a CDNI environment, as shown in Figure 2 below, URI Signing
operates the same way in the initial steps #1 and #2, but the later operates the same way in the initial steps 1 and 2, but the later
steps involve multiple CDNs delivering the content. The main steps involve multiple CDNs delivering the content. The main
difference from the single CDN case is a redirection step between the difference from the single CDN case is a redirection step between the
uCDN and the dCDN. In step #3, the UA may send an HTTP request or a uCDN and the dCDN. In step 3, the UA may send an HTTP request or a
DNS request, depending on whether HTTP-based or DNS-based request DNS request, depending on whether HTTP-based or DNS-based request
routing is used. The uCDN responds by directing the UA towards the routing is used. The uCDN responds by directing the UA towards the
dCDN using either a Redirection URI (i.e., a Signed URI generated by dCDN using either a Redirection URI (i.e., a Signed URI generated by
the uCDN) or a DNS reply, respectively (#4). Once the UA receives the uCDN) or a DNS reply, respectively (4). Once the UA receives the
the response, it sends the Redirection URI/Target CDN URI to the dCDN response, it sends the Redirection URI/Target CDN URI to the dCDN
(#5). The received URI is verified by the dCDN before delivering the (5). The received URI is verified by the dCDN before delivering the
content (#6). Note: The CDNI call flows are covered in Detailed URI content (6).
Signing Operation (Section 5).
Note: The CDNI call flows are covered in URI Signing Message Flow
(Section 5).
+-------------------------+ +-------------------------+
|Request Redirection Modes| |Request Redirection Modes|
+-------------------------+ +-------------------------+
| a) HTTP | | a) HTTP |
| b) DNS | | b) DNS |
+-------------------------+ +-------------------------+
-------- --------
/ \< * * * * * * * * * * * * * * / \< * * * * * * * * * * * * * *
| CSP |< * * * * * * * * * * * * | CSP |< * * * * * * * * * * * *
skipping to change at page 8, line 23 skipping to change at line 338
For HTTP-based request routing, the Signed URI (i.e., the Target CDN For HTTP-based request routing, the Signed URI (i.e., the Target CDN
URI) provided by the CSP reaches the uCDN. After this URI has been URI) provided by the CSP reaches the uCDN. After this URI has been
verified by the uCDN, the uCDN creates and signs a new Redirection verified by the uCDN, the uCDN creates and signs a new Redirection
URI, redirecting the UA to the dCDN. Since this new URI can have a URI, redirecting the UA to the dCDN. Since this new URI can have a
new signed JWT, the relationship between the dCDN and CSP is not new signed JWT, the relationship between the dCDN and CSP is not
relevant. Because a relationship between uCDN and dCDN always relevant. Because a relationship between uCDN and dCDN always
exists, either asymmetric public/private keys or symmetric shared exists, either asymmetric public/private keys or symmetric shared
secret keys can be used for URI Signing with HTTP-based request secret keys can be used for URI Signing with HTTP-based request
routing. Note that the signed Redirection URI MUST maintain HTTPS as routing. Note that the signed Redirection URI MUST maintain HTTPS as
the scheme if it was present in the original and it MAY be upgraded the scheme if it was present in the original, and it MAY be upgraded
from http: to https:. from "http:" to "https:".
Two types of keys can be used for URI Signing: asymmetric keys and Two types of keys can be used for URI Signing: asymmetric keys and
symmetric shared keys. Asymmetric keys are based on a public/private symmetric shared keys. Asymmetric keys are based on a public/private
key pair mechanism and always contain a private key known only to the key pair mechanism and always contain a private key known only to the
entity signing the URI (either CSP or uCDN) and a public key for the entity signing the URI (either CSP or uCDN) and a public key for the
verification of the Signed URI. With symmetric keys, the same key is verification of the Signed URI. With symmetric keys, the same key is
used by both the signing entity for signing the URI and the verifying used by both the signing entity for signing the URI and the verifying
entity for verifying the Signed URI. Regardless of the type of keys entity for verifying the Signed URI. Regardless of the type of keys
used, the verifying entity has to obtain the key in a manner that used, the verifying entity has to obtain the key in a manner that
allows trust to be placed in the assertions made using that key allows trust to be placed in the assertions made using that key
skipping to change at page 8, line 46 skipping to change at line 361
requirements (outside the scope of this document) for distributing requirements (outside the scope of this document) for distributing
asymmetric keys and symmetric keys. Key distribution for symmetric asymmetric keys and symmetric keys. Key distribution for symmetric
keys requires confidentiality to prevent third parties from getting keys requires confidentiality to prevent third parties from getting
access to the key, since they could then generate valid Signed URIs access to the key, since they could then generate valid Signed URIs
for unauthorized requests. Key distribution for asymmetric keys does for unauthorized requests. Key distribution for asymmetric keys does
not require confidentiality since public keys can typically be not require confidentiality since public keys can typically be
distributed openly (because they cannot be used to sign URIs) and the distributed openly (because they cannot be used to sign URIs) and the
corresponding private keys are kept secret by the URI signer. corresponding private keys are kept secret by the URI signer.
Note: While using a symmetric shared key is supported, it is NOT Note: While using a symmetric shared key is supported, it is NOT
RECOMMENDED. See the Security Considerations (Section 7) section RECOMMENDED. See the Security Considerations (Section 7) about the
about the limitations of shared keys. limitations of shared keys.
1.4. URI Signing in a non-CDNI context 1.4. URI Signing in a Non-CDNI Context
While the URI Signing method defined in this document was primarily While the URI Signing method defined in this document was primarily
created for the purpose of allowing URI Signing in CDNI scenarios, created for the purpose of allowing URI Signing in CDNI scenarios,
i.e., between a uCDN and a dCDN, there is nothing in the defined URI i.e., between a uCDN and a dCDN, there is nothing in the defined URI
Signing method that precludes it from being used in a non-CDNI Signing method that precludes it from being used in a non-CDNI
context. As such, the described mechanism could be used in a single- context. As such, the described mechanism could be used in a single-
CDN scenario such as shown in Figure 1 in Section 1.2, for example to CDN scenario such as shown in Figure 1 in Section 1.2 for example to
allow a CSP that uses different CDNs to only have to implement a allow a CSP that uses different CDNs to only have to implement a
single URI Signing mechanism. single URI Signing mechanism.
2. JWT Format and Processing Requirements 2. JWT Format and Processing Requirements
The concept behind URI Signing is based on embedding a signed JSON The concept behind URI Signing is based on embedding a signed JSON
Web Token (JWT) [RFC7519] in an HTTP or HTTPS URI [RFC7230] (see Web Token (JWT) [RFC7519] in an HTTP or HTTPS URI [RFC7230] (see
[RFC7230] Section 2.7). The signed JWT contains a number of claims Section 2.7 of [RFC7230]). The signed JWT contains a number of
that can be verified to ensure the UA has legitimate access to the claims that can be verified to ensure the UA has legitimate access to
content. the content.
This document specifies the following attribute for embedding a This document specifies the following attribute for embedding a
signed JWT in a Target CDN URI or Redirection URI: signed JWT in a Target CDN URI or Redirection URI:
* URI Signing Package (URISigningPackage): The URI attribute that URI Signing Package (URISigningPackage): The URI attribute that
encapsulates all the URI Signing claims in a signed JWT encoded encapsulates all the URI Signing claims in a signed JWT encoded
format. This attribute is exposed in the Signed URI as a path- format. This attribute is exposed in the Signed URI as a path-
style parameter or a form-style parameter. style parameter or a form-style parameter.
The parameter name of the URI Signing Package Attribute is defined in The parameter name of the URI Signing Package Attribute is defined in
the CDNI Metadata (Section 4.4). If the CDNI Metadata interface is the CDNI Metadata (Section 4.4). If the CDNI Metadata interface is
not used, or does not include a parameter name for the URI Signing not used, or does not include a parameter name for the URI Signing
Package Attribute, the parameter name can be set by configuration Package Attribute, the parameter name can be set by configuration
(out of scope of this document). (out of scope of this document).
skipping to change at page 10, line 21 skipping to change at line 428
In order to provide distribution policy flexibility, the exact subset In order to provide distribution policy flexibility, the exact subset
of claims used in a given signed JWT is a runtime decision. Claim of claims used in a given signed JWT is a runtime decision. Claim
requirements are defined in the CDNI Metadata (Section 4.4). If the requirements are defined in the CDNI Metadata (Section 4.4). If the
CDNI Metadata interface is not used, or does not include claim CDNI Metadata interface is not used, or does not include claim
requirements, the claim requirements can be set by configuration (out requirements, the claim requirements can be set by configuration (out
of scope of this document). of scope of this document).
The following claims (where the "JSON Web Token Claims" registry The following claims (where the "JSON Web Token Claims" registry
claim name is specified in parentheses below) are used to enforce the claim name is specified in parentheses below) are used to enforce the
distribution policies. All of the listed claims are mandatory to distribution policies. All of the listed claims are mandatory to
implement in a URI Signing implementation, but are not necessarily implement in a URI Signing implementation but are not necessarily
mandatory to use in a given signed JWT. (The "optional" and mandatory to use in a given signed JWT. (The "optional" and
"mandatory" identifiers in square brackets refer to whether or not a "mandatory" identifiers in square brackets refer to whether or not a
given claim MUST be present in a URI Signing JWT.) given claim MUST be present in a URI Signing JWT.)
Note: The time on the entities that generate and verify the signed Note: The time on the entities that generate and verify the Signed
URI MUST be in sync. In the CDNI case, this means that CSP, uCDN, URI MUST be in sync. In the CDNI case, this means that CSP, uCDN,
and dCDN servers need to be time-synchronized. It is RECOMMENDED to and dCDN servers need to be time synchronized. It is RECOMMENDED to
use NTP [RFC5905] for time synchronization. use NTP [RFC5905] for time synchronization.
Note: See the Security Considerations (Section 7) section on the Note: See the Security Considerations (Section 7) on the limitations
limitations of using an expiration time and client IP address for of using an expiration time and Client IP address for distribution
distribution policy enforcement. policy enforcement.
2.1.1. Issuer (iss) claim 2.1.1. Issuer (iss) Claim
Issuer (iss) [optional] - The semantics in [RFC7519] Section 4.1.1 Issuer (iss) [optional] - The semantics in Section 4.1.1 of [RFC7519]
MUST be followed. If this claim is used, it MUST be used to identify MUST be followed. If this claim is used, it MUST be used to identify
the issuer (signer) of the JWT. In particular, the recipient will the Issuer (signer) of the JWT. In particular, the recipient will
have already received, in trusted configuration, a mapping of issuer have already received, in trusted configuration, a mapping of Issuer
name to one or more keys used to sign JWTs, and must verify that the name to one or more keys used to sign JWTs and must verify that the
JWT was signed by one of those keys. If this claim is used and the JWT was signed by one of those keys. If this claim is used and the
CDN verifying the signed JWT does not support Issuer verification, or CDN verifying the signed JWT does not support Issuer verification, or
if the Issuer in the signed JWT does not match the list of known if the Issuer in the signed JWT does not match the list of known
acceptable Issuers, or if the Issuer claim does not match the key acceptable Issuers, or if the Issuer claim does not match the key
used to sign the JWT, the CDN MUST reject the request. If the used to sign the JWT, the CDN MUST reject the request. If the
received signed JWT contains an Issuer claim, then any JWT received signed JWT contains an Issuer claim, then any JWT
subsequently generated for CDNI redirection MUST also contain an subsequently generated for CDNI redirection MUST also contain an
Issuer claim, and the Issuer value MUST be updated to identify the Issuer claim, and the Issuer value MUST be updated to identify the
redirecting CDN. If the received signed JWT does not contain an redirecting CDN. If the received signed JWT does not contain an
Issuer claim, an Issuer claim MAY be added to a signed JWT generated Issuer claim, an Issuer claim MAY be added to a signed JWT generated
for CDNI redirection. for CDNI redirection.
2.1.2. Subject (sub) claim 2.1.2. Subject (sub) Claim
Subject (sub) [optional] - The semantics in [RFC7519] Section 4.1.2 Subject (sub) [optional] - The semantics in Section 4.1.2 of
MUST be followed. If this claim is used, it MUST be a JSON Web [RFC7519] MUST be followed. If this claim is used, it MUST be a JSON
Encryption (JWE [RFC7516]) Object in compact serialization form, Web Encryption (JWE [RFC7516]) Object in compact serialization form,
because it contains personally identifiable information. This claim because it contains personally identifiable information. This claim
contains information about the subject (for example, a user or an contains information about the Subject (for example, a user or an
agent) that MAY be used to verify the signed JWT. If the received agent) that MAY be used to verify the signed JWT. If the received
signed JWT contains a Subject claim, then any JWT subsequently signed JWT contains a Subject claim, then any JWT subsequently
generated for CDNI redirection MUST also contain a Subject claim, and generated for CDNI redirection MUST also contain a Subject claim, and
the Subject value MUST be the same as in the received signed JWT. A the Subject value MUST be the same as in the received signed JWT. A
signed JWT generated for CDNI redirection MUST NOT add a Subject signed JWT generated for CDNI redirection MUST NOT add a Subject
claim if no Subject claim existed in the received signed JWT. claim if no Subject claim existed in the received signed JWT.
2.1.3. Audience (aud) claim 2.1.3. Audience (aud) Claim
Audience (aud) [optional] - The semantics in [RFC7519] Section 4.1.3 Audience (aud) [optional] - The semantics in Section 4.1.3 of
MUST be followed. This claim is used to ensure that the CDN [RFC7519] MUST be followed. This claim is used to ensure that the
verifying the JWT is an intended recipient of the request. The claim CDN verifying the JWT is an intended recipient of the request. The
MUST contain an identity belonging to the chain of entities involved claim MUST contain an identity belonging to the chain of entities
in processing the request (e.g., identifying the CSP or any CDN in involved in processing the request (e.g., identifying the CSP or any
the chain) that the recipient is configured to use for the processing CDN in the chain) that the recipient is configured to use for the
of this request. A CDN MAY modify the claim as long it can generate processing of this request. A CDN MAY modify the claim as long it
a valid signature. can generate a valid signature.
2.1.4. Expiry Time (exp) claim 2.1.4. Expiry Time (exp) Claim
Expiry Time (exp) [optional] - The semantics in [RFC7519] Expiry Time (exp) [optional] - The semantics in Section 4.1.4 of
Section 4.1.4 MUST be followed, though URI Signing implementations [RFC7519] MUST be followed, though URI Signing implementations MUST
MUST NOT allow for any time synchronization "leeway". If this claim NOT allow for any time-synchronization "leeway". If this claim is
is used and the CDN verifying the signed JWT does not support Expiry used and the CDN verifying the signed JWT does not support Expiry
Time verification, or if the Expiry Time in the signed JWT Time verification, or if the Expiry Time in the signed JWT
corresponds to a time equal to or earlier than the time of the corresponds to a time equal to or earlier than the time of the
content request, the CDN MUST reject the request. If the received content request, the CDN MUST reject the request. If the received
signed JWT contains an Expiry Time claim, then any JWT subsequently signed JWT contains an Expiry Time claim, then any JWT subsequently
generated for CDNI redirection MUST also contain an Expiry Time generated for CDNI redirection MUST also contain an Expiry Time
claim, and the Expiry Time value MUST be the same as in the received claim, and the Expiry Time value MUST be the same as in the received
signed JWT. A signed JWT generated for CDNI redirection MUST NOT add signed JWT. A signed JWT generated for CDNI redirection MUST NOT add
an Expiry Time claim if no Expiry Time claim existed in the received an Expiry Time claim if no Expiry Time claim existed in the received
signed JWT. signed JWT.
2.1.5. Not Before (nbf) claim 2.1.5. Not Before (nbf) Claim
Not Before (nbf) [optional] - The semantics in [RFC7519] Not Before (nbf) [optional] - The semantics in Section 4.1.5 of
Section 4.1.5 MUST be followed, though URI Signing implementations [RFC7519] MUST be followed, though URI Signing implementations MUST
MUST NOT allow for any time synchronization "leeway". If this claim NOT allow for any time-synchronization "leeway". If this claim is
is used and the CDN verifying the signed JWT does not support Not used and the CDN verifying the signed JWT does not support Not Before
Before time verification, or if the Not Before time in the signed JWT time verification, or if the Not Before time in the signed JWT
corresponds to a time later than the time of the content request, the corresponds to a time later than the time of the content request, the
CDN MUST reject the request. If the received signed JWT contains a CDN MUST reject the request. If the received signed JWT contains a
Not Before time claim, then any JWT subsequently generated for CDNI Not Before time claim, then any JWT subsequently generated for CDNI
redirection MUST also contain a Not Before time claim, and the Not redirection MUST also contain a Not Before time claim, and the Not
Before time value MUST be the same as in the received signed JWT. A Before time value MUST be the same as in the received signed JWT. A
signed JWT generated for CDNI redirection MUST NOT add a Not Before signed JWT generated for CDNI redirection MUST NOT add a Not Before
time claim if no Not Before time claim existed in the received signed time claim if no Not Before time claim existed in the received signed
JWT. JWT.
2.1.6. Issued At (iat) claim 2.1.6. Issued At (iat) Claim
Issued At (iat) [optional] - The semantics in [RFC7519] Section 4.1.6 Issued At (iat) [optional] - The semantics in Section 4.1.6 of
MUST be followed. If the received signed JWT contains an Issued At [RFC7519] MUST be followed. If the received signed JWT contains an
claim, then any JWT subsequently generated for CDNI redirection MUST Issued At claim, then any JWT subsequently generated for CDNI
also contain an Issued At claim, and the Issued At value MUST be redirection MUST also contain an Issued At claim, and the Issued At
updated to identify the time the new JWT was generated. If the value MUST be updated to identify the time the new JWT was generated.
received signed JWT does not contain an Issued At claim, an Issued At If the received signed JWT does not contain an Issued At claim, an
claim MAY be added to a signed JWT generated for CDNI redirection. Issued At claim MAY be added to a signed JWT generated for CDNI
redirection.
2.1.7. JWT ID (jti) claim 2.1.7. JWT ID (jti) Claim
JWT ID (jti) [optional] - The semantics in [RFC7519] Section 4.1.7 JWT ID (jti) [optional] - The semantics in Section 4.1.7 of [RFC7519]
MUST be followed. A JWT ID can be used to prevent replay attacks if MUST be followed. A JWT ID can be used to prevent replay attacks if
the CDN stores a list of all previously used values, and verifies the CDN stores a list of all previously used values and verifies that
that the value in the current JWT has never been used before. If the the value in the current JWT has never been used before. If the
signed JWT contains a JWT ID claim and the CDN verifying the signed signed JWT contains a JWT ID claim and the CDN verifying the signed
JWT either does not support JWT ID storage or has previously seen the JWT either does not support JWT ID storage or has previously seen the
value used in a request for the same content, then the CDN MUST value used in a request for the same content, then the CDN MUST
reject the request. If the received signed JWT contains a JWT ID reject the request. If the received signed JWT contains a JWT ID
claim, then any JWT subsequently generated for CDNI redirection MUST claim, then any JWT subsequently generated for CDNI redirection MUST
also contain a JWT ID claim, and the value MUST be the same as in the also contain a JWT ID claim, and the value MUST be the same as in the
received signed JWT. If the received signed JWT does not contain a received signed JWT. If the received signed JWT does not contain a
JWT ID claim, a JWT ID claim MUST NOT be added to a signed JWT JWT ID claim, a JWT ID claim MUST NOT be added to a signed JWT
generated for CDNI redirection. Sizing of the JWT ID is application generated for CDNI redirection. Sizing of the JWT ID is application
dependent given the desired security constraints. dependent given the desired security constraints.
2.1.8. CDNI Claim Set Version (cdniv) claim 2.1.8. CDNI Claim Set Version (cdniv) Claim
CDNI Claim Set Version (cdniv) [optional] - The CDNI Claim Set CDNI Claim Set Version (cdniv) [optional] - The CDNI Claim Set
Version (cdniv) claim provides a means within a signed JWT to tie the Version (cdniv) claim provides a means within a signed JWT to tie the
claim set to a specific version of this specification. The cdniv claim set to a specific version of this specification. The cdniv
claim is intended to allow changes in and facilitate upgrades across claim is intended to allow changes in and facilitate upgrades across
specifications. The type is JSON integer and the value MUST be set specifications. The type is a JSON integer and the value MUST be set
to "1", for this version of the specification. In the absence of to "1" for this version of the specification. In the absence of this
this claim, the value is assumed to be "1". For future versions this claim, the value is assumed to be "1". For future versions, this
claim will be mandatory. Implementations MUST reject signed JWTs claim will be mandatory. Implementations MUST reject signed JWTs
with unsupported CDNI Claim Set versions. with unsupported CDNI Claim Set versions.
2.1.9. CDNI Critical Claims Set (cdnicrit) claim 2.1.9. CDNI Critical Claims Set (cdnicrit) Claim
CDNI Critical Claims Set (cdnicrit) [optional] - The CDNI Critical CDNI Critical Claims Set (cdnicrit) [optional] - The CDNI Critical
Claims Set (cdnicrit) claim indicates that extensions to this Claims Set (cdnicrit) claim indicates that extensions to this
specification are being used that MUST be understood and processed. specification are being used that MUST be understood and processed.
Its value is a comma separated listing of claims in the Signed JWT Its value is a comma-separated listing of claims in the Signed JWT
that use those extensions. If any of the listed extension claims are that use those extensions. If any of the listed extension claims are
not understood and supported by the recipient, then the Signed JWT not understood and supported by the recipient, then the Signed JWT
MUST be rejected. Producers MUST NOT include claim names defined by MUST be rejected. Producers MUST NOT include claim names defined by
this specification, duplicate names, or names that do not occur as this specification, duplicate names, or names that do not occur as
claim names within the Signed JWT in the cdnicrit list. Producers claim names within the Signed JWT in the cdnicrit list. Producers
MUST NOT use the empty list "" as the cdnicrit value. Recipients MAY MUST NOT use the empty list "" as the cdnicrit value. Recipients MAY
consider the Signed JWT to be invalid if the cdnicrit list contains consider the Signed JWT to be invalid if the cdnicrit list contains
any claim names defined by this specification or if any other any claim names defined by this specification or if any other
constraints on its use are violated. This claim MUST be understood constraints on its use are violated. This claim MUST be understood
and processed by all implementations. and processed by all implementations.
2.1.10. Client IP Address (cdniip) claim 2.1.10. Client IP Address (cdniip) Claim
Client IP Address (cdniip) [optional] - The Client IP Address Client IP Address (cdniip) [optional] - The Client IP Address
(cdniip) claim holds an IP address or IP prefix for which the Signed (cdniip) claim holds an IP address or IP prefix for which the Signed
URI is valid. This is represented in CIDR notation, with dotted URI is valid. This is represented in CIDR notation with dotted
decimal format for IPv4 addresses [RFC0791] or canonical text decimal format for IPv4 addresses [RFC0791] or canonical text
representation for IPv6 addresses [RFC5952]. The request MUST be representation for IPv6 addresses [RFC5952]. The request MUST be
rejected if sourced from a client outside the specified IP range. rejected if sourced from a client outside the specified IP range.
Since the client IP is considered personally identifiable information Since the Client IP is considered personally identifiable
this field MUST be a JSON Web Encryption (JWE [RFC7516]) Object in information, this field MUST be a JSON Web Encryption (JWE [RFC7516])
compact serialization form. If the CDN verifying the signed JWT does Object in compact serialization form. If the CDN verifying the
not support Client IP verification, or if the Client IP in the signed signed JWT does not support Client IP verification, or if the Client
JWT does not match the source IP address in the content request, the IP in the signed JWT does not match the source IP address in the
CDN MUST reject the request. The type of this claim is a JSON string content request, the CDN MUST reject the request. The type of this
that contains the JWE. If the received signed JWT contains a Client claim is a JSON string that contains the JWE. If the received signed
IP claim, then any JWT subsequently generated for CDNI redirection JWT contains a Client IP claim, then any JWT subsequently generated
MUST also contain a Client IP claim, and the Client IP value MUST be for CDNI redirection MUST also contain a Client IP claim, and the
the same as in the received signed JWT. A signed JWT generated for Client IP value MUST be the same as in the received signed JWT. A
CDNI redirection MUST NOT add a Client IP claim if no Client IP claim signed JWT generated for CDNI redirection MUST NOT add a Client IP
existed in the received signed JWT. claim if no Client IP claim existed in the received signed JWT.
It should be noted that use of this claim can cause issues, for It should be noted that use of this claim can cause issues, for
example, in situations with dual-stack IPv4 and IPv6 networks, MPTCP, example, in situations with dual-stack IPv4 and IPv6 networks, MPTCP,
QUIC, and mobile clients switching from Wi-Fi to Cellular networks QUIC, and mobile clients switching from Wi-Fi to Cellular networks
where the client's source address can change, even between address where the client's source address can change, even between address
families. This claim exists mainly for legacy feature parity families. This claim exists mainly for legacy feature parity
reasons, therefore use of this claim should be done judiciously. An reasons; therefore, use of this claim should be done judiciously. An
example of a reasonable use case would be making a signed JWT for an example of a reasonable use case would be making a signed JWT for an
internal preview of an asset where the end consumer understands that internal preview of an asset where the end consumer understands that
they must be originated from the same IP for the entirety of the they must be originated from the same IP for the entirety of the
session. Using this claim at large is NOT RECOMMENDED. session. Using this claim at large is NOT RECOMMENDED.
2.1.11. CDNI URI Container (cdniuc) claim 2.1.11. CDNI URI Container (cdniuc) Claim
URI Container (cdniuc) [mandatory] - The URI Container (cdniuc) holds URI Container (cdniuc) [mandatory] - The URI Container (cdniuc) holds
the URI representation before a URI Signing Package is added. This the URI representation before a URI Signing Package is added. This
representation can take one of several forms detailed in representation can take one of several forms detailed in
Section 2.1.15. If the URI Container used in the signed JWT does not Section 2.1.15. If the URI Container used in the signed JWT does not
match the URI of the content request, the CDN verifying the signed match the URI of the content request, the CDN verifying the signed
JWT MUST reject the request. When comparing the URI, the percent JWT MUST reject the request. When comparing the URI, the percent
encoded form as defined in [RFC3986] Section 2.1 MUST be used. When encoded form as defined in Section 2.1 of [RFC3986] MUST be used.
redirecting a URI, the CDN generating the new signed JWT MAY change When redirecting a URI, the CDN generating the new signed JWT MAY
the URI Container to comport with the URI being used in the change the URI Container to comport with the URI being used in the
redirection. redirection.
2.1.12. CDNI Expiration Time Setting (cdniets) claim 2.1.12. CDNI Expiration Time Setting (cdniets) Claim
CDNI Expiration Time Setting (cdniets) [optional] - The CDNI CDNI Expiration Time Setting (cdniets) [optional] - The CDNI
Expiration Time Setting (cdniets) claim provides a means for setting Expiration Time Setting (cdniets) claim provides a means for setting
the value of the Expiry Time (exp) claim when generating a subsequent the value of the Expiry Time (exp) claim when generating a subsequent
signed JWT in Signed Token Renewal. Its type is a JSON numeric signed JWT in Signed Token Renewal. Its type is a JSON numeric
value. It denotes the number of seconds to be added to the time at value. It denotes the number of seconds to be added to the time at
which the JWT is verified that gives the value of the Expiry Time which the JWT is verified that gives the value of the Expiry Time
(exp) claim of the next signed JWT. The CDNI Expiration Time Setting (exp) claim of the next signed JWT. The CDNI Expiration Time Setting
(cdniets) SHOULD NOT be used when not using Signed Token Renewal and (cdniets) SHOULD NOT be used when not using Signed Token Renewal and
MUST be present when using Signed Token Renewal. MUST be present when using Signed Token Renewal.
2.1.13. CDNI Signed Token Transport (cdnistt) claim 2.1.13. CDNI Signed Token Transport (cdnistt) Claim
CDNI Signed Token Transport (cdnistt) [optional] - The CDNI Signed CDNI Signed Token Transport (cdnistt) [optional] - The CDNI Signed
Token Transport (cdnistt) claim provides a means of signalling the Token Transport (cdnistt) claim provides a means of signaling the
method through which a new signed JWT is transported from the CDN to method through which a new signed JWT is transported from the CDN to
the UA and vice versa for the purpose of Signed Token Renewal. Its the UA and vice versa for the purpose of Signed Token Renewal. Its
type is a JSON integer. Values for this claim are defined in type is a JSON integer. Values for this claim are defined in
Section 6.5. If using this claim you MUST also specify a CDNI Section 6.5. If using this claim, you MUST also specify a CDNI
Expiration Time Setting (cdniets) as noted above. Expiration Time Setting (cdniets) as noted above.
2.1.14. CDNI Signed Token Depth (cdnistd) claim 2.1.14. CDNI Signed Token Depth (cdnistd) Claim
CDNI Signed Token Depth (cdnistd) [optional] - The CDNI Signed Token CDNI Signed Token Depth (cdnistd) [optional] - The CDNI Signed Token
Depth (cdnistd) claim is used to associate a subsequent signed JWT, Depth (cdnistd) claim is used to associate a subsequent signed JWT,
generated as the result of a CDNI Signed Token Transport claim, with generated as the result of a CDNI Signed Token Transport claim, with
a specific URI subset. Its type is a JSON integer. Signed JWTs MUST a specific URI subset. Its type is a JSON integer. Signed JWTs MUST
NOT use a negative value for the CDNI Signed Token Depth claim. NOT use a negative value for the CDNI Signed Token Depth claim.
If the transport used for Signed Token Transport allows the CDN to If the transport used for Signed Token Transport allows the CDN to
associate the path component of a URI with tokens (e.g., an HTTP associate the path component of a URI with tokens (e.g., an HTTP
Cookie Path as described in section 4.1.2.4 of [RFC6265]), the CDNI Cookie Path as described in Section 4.1.2.4 of [RFC6265]), the CDNI
Signed Token Depth value is the number of path segments that should Signed Token Depth value is the number of path segments that should
be considered significant for this association. A CDNI Signed Token be considered significant for this association. A CDNI Signed Token
Depth of zero means that the client SHOULD be directed to return the Depth of zero means that the client SHOULD be directed to return the
token with requests for any path. If the CDNI Signed Token Depth is token with requests for any path. If the CDNI Signed Token Depth is
greater than zero, then the CDN SHOULD send the client a token to greater than zero, then the CDN SHOULD send the client a token to
return for future requests wherein the first CDNI Signed Token Depth return for future requests wherein the first CDNI Signed Token Depth
segments of the path match the first CDNI Signed Token Depth segments segments of the path match the first CDNI Signed Token Depth segments
of the signed URI path. This matching MUST use the URI with the of the Signed URI path. This matching MUST use the URI with the
token removed, as specified in Section 2.1.15. token removed, as specified in Section 2.1.15.
If the URI path to match contains fewer segments than the CDNI Signed If the URI path to match contains fewer segments than the CDNI Signed
Token Depth claim, a signed JWT MUST NOT be generated for the Token Depth claim, a signed JWT MUST NOT be generated for the
purposes of Signed Token Renewal. If the CDNI Signed Token Depth purposes of Signed Token Renewal. If the CDNI Signed Token Depth
claim is omitted, it means the same thing as if its value were zero. claim is omitted, it means the same thing as if its value were zero.
If the received signed JWT contains a CDNI Signed Token Depth claim, If the received signed JWT contains a CDNI Signed Token Depth claim,
then any JWT subsequently generated for CDNI redirection or Signed then any JWT subsequently generated for CDNI redirection or Signed
Token Transport MUST also contain a CDNI Signed Token Depth claim, Token Transport MUST also contain a CDNI Signed Token Depth claim,
and the value MUST be the same as in the received signed JWT. and the value MUST be the same as in the received signed JWT.
skipping to change at page 16, line 9 skipping to change at line 685
'hash:' or 'regex:'. More forms may be added in the future to extend 'hash:' or 'regex:'. More forms may be added in the future to extend
the capabilities. the capabilities.
Before comparing a URI with contents of this container, the following Before comparing a URI with contents of this container, the following
steps MUST be performed: steps MUST be performed:
* Prior to verification, remove the signed JWT from the URI. This * Prior to verification, remove the signed JWT from the URI. This
removal is only for the purpose of determining if the URI matches; removal is only for the purpose of determining if the URI matches;
all other purposes will use the original URI. If the signed JWT all other purposes will use the original URI. If the signed JWT
is terminated by anything other than a sub-delimiter (as defined is terminated by anything other than a sub-delimiter (as defined
in [RFC3986] Section 2.2), everything from the reserved character in Section 2.2 of [RFC3986]), everything from the reserved
(as defined in [RFC3986] Section 2.2) that precedes the URI character (as defined in Section 2.2 of [RFC3986]) that precedes
Signing Package Attribute to the last character of the signed JWT the URI Signing Package Attribute to the last character of the
will be removed, inclusive. Otherwise, everything from the first signed JWT will be removed, inclusive. Otherwise, everything from
character of the URI Signing Package Attribute to the sub- the first character of the URI Signing Package Attribute to the
delimiter that terminates the signed JWT will be removed, sub-delimiter that terminates the signed JWT will be removed,
inclusive. inclusive.
* Normalize the URI according to section 2.7.3 [RFC7230] and * Normalize the URI according to Section 2.7.3 of [RFC7230] and
sections 6.2.2 and 6.2.3 [RFC3986]. This applies to both Sections 6.2.2 and 6.2.3 of [RFC3986]. This applies to both
generation and verification of the signed JWT. generation and verification of the signed JWT.
2.1.15.1. URI Hash Container (hash:) 2.1.15.1. URI Hash Container (hash:)
Prefixed with 'hash:', this string is a URL Segment form ([RFC6920] Prefixed with 'hash:', this string is a URL Segment form (Section 5
Section 5) of the URI. of [RFC6920]) of the URI.
2.1.15.2. URI Regular Expression Container (regex:) 2.1.15.2. URI Regular Expression Container (regex:)
Prefixed with 'regex:', this string is any POSIX Section 9 [POSIX.1] Prefixed with 'regex:', this string is any regular expression
Extended Regular Expression compatible regular expression used to compatible with POSIX (Section 9 of [POSIX.1]) Extended Regular
match against the requested URI. These regular expressions MUST be Expression used to match against the requested URI. These regular
evaluated in the POSIX locale (POSIX Section 7.2 [POSIX.1]). expressions MUST be evaluated in the POSIX locale (Section 7.2 of
[POSIX.1]).
Note: Because '\' has special meaning in JSON [RFC8259] as the escape Note: Because '\' has special meaning in JSON [RFC8259] as the escape
character within JSON strings, the regular expression character '\' character within JSON strings, the regular expression character '\'
MUST be escaped as '\\'. MUST be escaped as '\\'.
An example of a 'regex:' is the following: An example of a 'regex:' is the following:
[^:]*\\://[^/]*/folder/content/quality_[^/]*/segment.{3}\\.mp4(\\?.*)? [^:]*\\://[^/]*/dir/content/quality_[^/]*/segment.{3}\\.mp4(\\?.*)?
Note: Due to computational complexity of executing arbitrary regular Note: Due to computational complexity of executing arbitrary regular
expressions, it is RECOMMENDED to only execute after verifying the expressions, it is RECOMMENDED to only execute after verifying the
JWT to ensure its authenticity. JWT to ensure its authenticity.
2.2. JWT Header 2.2. JWT Header
The header of the JWT MAY be passed via the CDNI Metadata interface The header of the JWT MAY be passed via the CDNI Metadata interface
instead of being included in the URISigningPackage. The header value instead of being included in the URISigningPackage. The header value
MUST be transmitted in the serialized encoded form and prepended to MUST be transmitted in the serialized encoded form and prepended to
skipping to change at page 17, line 21 skipping to change at line 746
special provisions need to be made in order to ensure URI Signing can special provisions need to be made in order to ensure URI Signing can
be applied. In general, segmented protocols work by breaking large be applied. In general, segmented protocols work by breaking large
objects (e.g., videos) into a sequence of small independent segments. objects (e.g., videos) into a sequence of small independent segments.
Such segments are then referenced by a separate manifest file, which Such segments are then referenced by a separate manifest file, which
either includes a list of URLs to the segments or specifies an either includes a list of URLs to the segments or specifies an
algorithm through which a User Agent can construct the URLs to the algorithm through which a User Agent can construct the URLs to the
segments. Requests for segments therefore originate from the segments. Requests for segments therefore originate from the
manifest file and, unless the URLs in the manifest file point to the manifest file and, unless the URLs in the manifest file point to the
CSP, are not subjected to redirection and URI Signing. This opens up CSP, are not subjected to redirection and URI Signing. This opens up
a vulnerability to malicious User Agents sharing the manifest file a vulnerability to malicious User Agents sharing the manifest file
and deep-linking to the segments. and deep linking to the segments.
One method for dealing with this vulnerability would be to include, One method for dealing with this vulnerability would be to include,
in the manifest itself, Signed URIs that point to the individual in the manifest itself, Signed URIs that point to the individual
segments. There exist a number of issues with that approach. First, segments. There exist a number of issues with that approach. First,
it requires the CDN delivering the manifest to rewrite the manifest it requires the CDN delivering the manifest to rewrite the manifest
file for each User Agent, which would require the CDN to be aware of file for each User Agent, which would require the CDN to be aware of
the exact segmentation protocol used. Secondly, it could also the exact segmentation protocol used. Secondly, it could also
require the expiration time of the Signed URIs to be valid for an require the expiration time of the Signed URIs to be valid for an
extended duration if the content described by the manifest is meant extended duration if the content described by the manifest is meant
to be consumed in real time. For instance, if the manifest file were to be consumed in real time. For instance, if the manifest file were
to contain a segmented video stream of more than 30 minutes in to contain a segmented video stream of more than 30 minutes in
length, Signed URIs would require to be valid for at least 30 length, Signed URIs would require to be valid for at least 30
minutes, thereby reducing their effectiveness and that of the URI minutes, thereby reducing their effectiveness and that of the URI
Signing mechanism in general. For a more detailed analysis of how Signing mechanism in general. For a more detailed analysis of how
segmented protocols such as HTTP Adaptive Streaming protocols affect segmented protocols such as HTTP Adaptive Streaming protocols affect
CDNI, see Models for HTTP-Adaptive-Streaming-Aware CDNI [RFC6983]. CDNI, see Models for HTTP-Adaptive-Streaming-Aware Content
Distribution Network Interconnection (CDNI) [RFC6983].
The method described in this section allows CDNs to use URI Signing The method described in this section allows CDNs to use URI Signing
for segmented content without having to include the Signed URIs in for segmented content without having to include the Signed URIs in
the manifest files themselves. the manifest files themselves.
3.2. Signed Token Renewal mechanism 3.2. Signed Token Renewal Mechanism
In order to allow for effective access control of segmented content, In order to allow for effective access control of segmented content,
the URI Signing mechanism defined in this section is based on a the URI Signing mechanism defined in this section is based on a
method through which subsequent segment requests can be linked method through which subsequent segment requests can be linked
together. As part of the JWT verification procedure, the CDN can together. As part of the JWT verification procedure, the CDN can
generate a new signed JWT that the UA can use to do a subsequent generate a new signed JWT that the UA can use to do a subsequent
request. More specifically, whenever a UA successfully retrieves a request. More specifically, whenever a UA successfully retrieves a
segment, it receives, in the HTTP 2xx Successful message, a signed segment, it receives, in the HTTP 2xx Successful message, a signed
JWT that it can use whenever it requests the next segment. As long JWT that it can use whenever it requests the next segment. As long
as each successive signed JWT is correctly verified before a new one as each successive signed JWT is correctly verified before a new one
is generated, the model is not broken, and the User Agent can is generated, the model is not broken, and the User Agent can
successfully retrieve additional segments. Given the fact that with successfully retrieve additional segments. Given the fact that with
segmented protocols, it is usually not possible to determine a priori segmented protocols it is usually not possible to determine a priori
which segment will be requested next (i.e., to allow for seeking which segment will be requested next (i.e., to allow for seeking
within the content and for switching to a different representation), within the content and for switching to a different representation),
the Signed Token Renewal uses the URI Regular Expression Container the Signed Token Renewal uses the URI Regular Expression Container
scoping mechanisms in the URI Container (cdniuc) claim to allow a scoping mechanisms in the URI Container (cdniuc) claim to allow a
signed JWT to be valid for more than one URL. signed JWT to be valid for more than one URL.
In order for this renewal of signed JWTs to work, it is necessary for In order for this renewal of signed JWTs to work, it is necessary for
a UA to extract the signed JWT from the HTTP 2xx Successful message a UA to extract the signed JWT from the HTTP 2xx Successful message
of an earlier request and use it to retrieve the next segment. The of an earlier request and use it to retrieve the next segment. The
exact mechanism by which the client does this is outside the scope of exact mechanism by which the client does this is outside the scope of
skipping to change at page 18, line 33 skipping to change at line 808
3.2.1. Required Claims 3.2.1. Required Claims
The cdnistt claim (Section 2.1.13) and cdniets claim (Section 2.1.12) The cdnistt claim (Section 2.1.13) and cdniets claim (Section 2.1.12)
MUST both be present for Signed Token Renewal. cdnistt MAY be set to MUST both be present for Signed Token Renewal. cdnistt MAY be set to
a value of '0' to mean no Signed Token Renewal, but there still MUST a value of '0' to mean no Signed Token Renewal, but there still MUST
be a corresponding cdniets that verifies as a JSON number. However, be a corresponding cdniets that verifies as a JSON number. However,
if use of Signed Token Renewal is not desired, it is RECOMMENDED to if use of Signed Token Renewal is not desired, it is RECOMMENDED to
simply omit both. simply omit both.
3.3. Communicating a signed JWTs in Signed Token Renewal 3.3. Communicating a Signed JWT in Signed Token Renewal
This section assumes the value of the CDNI Signed Token Transport This section assumes the value of the CDNI Signed Token Transport
(cdnistt) claim has been set to 1. (cdnistt) claim has been set to 1.
When using the Signed Token Renewal mechanism, the signed JWT is When using the Signed Token Renewal mechanism, the signed JWT is
transported to the UA via a 'URISigningPackage' cookie added to the transported to the UA via a 'URISigningPackage' cookie added to the
HTTP 2xx Successful message along with the content being returned to HTTP 2xx Successful message along with the content being returned to
the UA, or to the HTTP 3xx Redirection message in case the UA is the UA, or to the HTTP 3xx Redirection message in case the UA is
redirected to a different server. redirected to a different server.
3.3.1. Support for cross-domain redirection 3.3.1. Support for Cross-Domain Redirection
For security purposes, the use of cross-domain cookies is not For security purposes, the use of cross-domain cookies is not
supported in some application environments. As a result, the Cookie- supported in some application environments. As a result, the Cookie-
based method for transport of the Signed Token described in based method for transport of the Signed Token described in
Section 3.3 might break if used in combination with an HTTP 3xx Section 3.3 might break if used in combination with an HTTP 3xx
Redirection response where the target URL is in a different domain. Redirection response where the target URL is in a different domain.
In such scenarios, Signed Token Renewal of a signed JWT SHOULD be In such scenarios, Signed Token Renewal of a signed JWT SHOULD be
communicated via the query string instead, in a similar fashion to communicated via the query string instead, in a similar fashion to
how regular signed JWTs (outside of Signed Token Renewal) are how regular signed JWTs (outside of Signed Token Renewal) are
communicated. Note the value of the CDNI Signed Token Transport communicated. Note the value of the CDNI Signed Token Transport
skipping to change at page 19, line 36 skipping to change at line 859
the logs communicated through the CDNI Logging interface. the logs communicated through the CDNI Logging interface.
4.1. CDNI Control Interface 4.1. CDNI Control Interface
URI Signing has no impact on this interface. URI Signing has no impact on this interface.
4.2. CDNI Footprint & Capabilities Advertisement Interface 4.2. CDNI Footprint & Capabilities Advertisement Interface
The CDNI Request Routing: Footprint and Capabilities Semantics The CDNI Request Routing: Footprint and Capabilities Semantics
document [RFC8008] defines support for advertising CDNI Metadata document [RFC8008] defines support for advertising CDNI Metadata
capabilities, via CDNI Payload Type. The CDNI Payload Type capabilities via CDNI Payload Type. The CDNI Payload Type registered
registered in Section 6.1 can be used for capability advertisement. in Section 6.1 can be used for capability advertisement.
4.3. CDNI Request Routing Redirection Interface 4.3. CDNI Request Routing Redirection Interface
The CDNI Request Routing Redirection Interface [RFC7975] describes The CDNI Request Routing Redirection Interface [RFC7975] describes
the recursive request redirection method. For URI Signing, the uCDN the recursive request redirection method. For URI Signing, the uCDN
signs the URI provided by the dCDN. URI Signing therefore has no signs the URI provided by the dCDN. URI Signing therefore has no
impact on this interface. impact on this interface.
4.4. CDNI Metadata Interface 4.4. CDNI Metadata Interface
The CDNI Metadata Interface [RFC8006] describes the CDNI metadata The CDNI Metadata Interface [RFC8006] describes the CDNI Metadata
distribution needed to enable content acquisition and delivery. For distribution needed to enable content acquisition and delivery. For
URI Signing, a new CDNI metadata object is specified. URI Signing, a new CDNI Metadata object is specified.
The UriSigning Metadata object contains information to enable URI The UriSigning Metadata object contains information to enable URI
Signing and verification by a dCDN. The UriSigning properties are Signing and verification by a dCDN. The UriSigning properties are
defined below. defined below.
Property: enforce Property: enforce
Description: URI Signing enforcement flag. Specifically, this Description: URI Signing enforcement flag. Specifically, this
flag indicates if the access to content is subject to URI flag indicates if the access to content is subject to URI
Signing. URI Signing requires the dCDN to ensure that the URI Signing. URI Signing requires the dCDN to ensure that the
is signed and verified before delivering content. Otherwise, URI is signed and verified before delivering content.
the dCDN does not perform verification, regardless of whether Otherwise, the dCDN does not perform verification,
or not the URI is signed. regardless of whether or not the URI is signed.
Type: Boolean Type: Boolean
Mandatory-to-Specify: No. The default is true. Mandatory-to-Specify: No. The default is true.
Property: issuers Property: issuers
Description: A list of valid Issuers against which the Issuer Description: A list of valid Issuers against which the Issuer
claim in the signed JWT may be cross-referenced. claim in the signed JWT may be cross-referenced.
Type: Array of Strings Type: Array of Strings
Mandatory-to-Specify: No. The default is an empty list. An Mandatory-to-Specify: No. The default is an empty list. An
empty list means that any Issuer in the trusted key store of empty list means that any Issuer in the trusted key store of
issuers is acceptable. Issuers is acceptable.
Property: package-attribute Property: package-attribute
Description: The attribute name to use for the URI Signing Description: The attribute name to use for the URI Signing
Package. Package.
Type: String Type: String
Mandatory-to-Specify: No. The default is "URISigningPackage". Mandatory-to-Specify: No. The default is "URISigningPackage".
Property: jwt-header Property: jwt-header
Description: The header part of JWT that is used for verifying Description: The header part of JWT that is used for verifying
a signed JWT when the JWT token in the URI Signing Package does a signed JWT when the JWT token in the URI Signing Package
not contain a header part. does not contain a header part.
Type: String Type: String
Mandatory-to-Specify: No. By default, the header is assumed to Mandatory-to-Specify: No. By default, the header is assumed
be included in the JWT token. to be included in the JWT token.
The following is an example of a URI Signing metadata payload with The following is an example of a URI Signing metadata payload with
all default values: all default values:
{ {
"generic-metadata-type": "MI.UriSigning" "generic-metadata-type": "MI.UriSigning"
"generic-metadata-value": {} "generic-metadata-value": {}
} }
The following is an example of a URI Signing metadata payload with The following is an example of a URI Signing metadata payload with
skipping to change at page 21, line 39 skipping to change at line 957
} }
4.5. CDNI Logging Interface 4.5. CDNI Logging Interface
For URI Signing, the dCDN reports that enforcement of the access For URI Signing, the dCDN reports that enforcement of the access
control was applied to the request for content delivery. When the control was applied to the request for content delivery. When the
request is denied due to enforcement of URI Signing, the reason is request is denied due to enforcement of URI Signing, the reason is
logged. logged.
The following CDNI Logging field for URI Signing SHOULD be supported The following CDNI Logging field for URI Signing SHOULD be supported
in the HTTP Request Logging Record as specified in CDNI Logging in the HTTP Request Logging Record as specified in "Content
Interface [RFC7937], using the new "cdni_http_request_v2" record-type Distribution Network Interconnection (CDNI) Logging Interface"
registered in Section 6.2.1. [RFC7937] using the new "cdni_http_request_v2" record-type registered
in Section 6.2.1.
* s-uri-signing (mandatory): * s-uri-signing (mandatory):
- format: 3DIGIT Format: 3DIGIT
- field value: this characterises the URI Signing verification Field value: this characterizes the URI Signing verification
performed by the Surrogate on the request. The allowed values performed by the Surrogate on the request. The allowed values
are registered in Section 6.4. are registered in Section 6.4.
- occurrence: there MUST be zero or exactly one instance of this Occurrence: there MUST be zero or exactly one instance of this
field. field.
* s-uri-signing-deny-reason (optional): * s-uri-signing-deny-reason (optional):
- format: QSTRING Format: QSTRING
- field value: a string for providing further information in case Field value: a string for providing further information in case
the signed JWT was rejected, e.g., for debugging purposes. the signed JWT was rejected, e.g., for debugging purposes.
- occurrence: there MUST be zero or exactly one instance of this Occurrence: there MUST be zero or exactly one instance of this
field. field.
5. URI Signing Message Flow 5. URI Signing Message Flow
URI Signing supports both HTTP-based and DNS-based request routing. URI Signing supports both HTTP-based and DNS-based request routing.
JSON Web Token (JWT) [RFC7519] defines a compact, URL-safe means of JSON Web Token (JWT) [RFC7519] defines a compact, URL-safe means of
representing claims to be transferred between two parties. The representing claims to be transferred between two parties. The
claims in a Signed JWT are encoded as a JSON object that is used as claims in a Signed JWT are encoded as a JSON object that is used as
the payload of a JSON Web Signature (JWS) structure enabling the the payload of a JSON Web Signature (JWS) structure enabling the
claims to be digitally signed or integrity protected with a Message claims to be digitally signed or integrity protected with a Message
skipping to change at page 22, line 42 skipping to change at line 1007
using key information that is specific to a pair of adjacent CDNI using key information that is specific to a pair of adjacent CDNI
hops (e.g., between the CSP and the uCDN or between the uCDN and a hops (e.g., between the CSP and the uCDN or between the uCDN and a
dCDN). This allows a CDNI hop to ascertain the authenticity of a dCDN). This allows a CDNI hop to ascertain the authenticity of a
given request received from a previous CDNI hop. given request received from a previous CDNI hop.
The URI Signing method (assuming HTTP redirection, iterative request The URI Signing method (assuming HTTP redirection, iterative request
routing, and a CDN path with two CDNs) includes the following steps: routing, and a CDN path with two CDNs) includes the following steps:
End-User dCDN uCDN CSP End-User dCDN uCDN CSP
| | | | | | | |
| 1.CDNI FCI interface used to | | | 1.CDNI FCI used to | |
| advertise URI Signing capability| | | advertise URI Signing capability | |
| |------------------->| | | |------------------->| |
| | | | | | | |
| 2.Provides information to verify Signed JWT | | 2.Provides information to verify Signed JWT |
| | |<-------------------| | | |<-------------------|
| | | | | | | |
| 3.CDNI Metadata interface used to| | | 3.CDNI Metadata interface used to| |
| provide URI Signing attributes| | | provide URI Signing attributes| |
| |<-------------------| | | |<-------------------| |
: : : : : : : :
: (Later in time) : : : : (Later in time) : : :
|4.Authorization request | | |4.Authorization request | |
|------------------------------------------------------------->| |------------------------------------------------------------->|
| | | [Apply distribution | | | [Apply distribution
| | | policy] | | | | policy] |
| | | | | | | |
| | (ALT: Authorization decision) | | (ALT: Authorization decision)
|5.Request is denied | | <Negative> | |5.Request is denied | | <Negative> |
|<-------------------------------------------------------------| |<-------------------------------------------------------------|
| | | | | | | |
|6.CSP provides signed URI | <Positive> | |6.CSP provides Signed URI | <Positive> |
|<-------------------------------------------------------------| |<-------------------------------------------------------------|
| | | | | | | |
|7.Content request | | | |7.Content request | | |
|---------------------------------------->| [Verifiy URI | |---------------------------------------->| [Verify URI |
| | | signature] | | | | signature] |
| | | | | | | |
| | (ALT: Verification result) | | | (ALT: Verification result) |
|8.Request is denied | <Negative>| | |8.Request is denied | <Negative>| |
|<----------------------------------------| | |<----------------------------------------| |
| | | | | | | |
|9.Re-sign URI and redirect to <Positive>| | |9.Re-sign URI and redirect to <Positive>| |
| dCDN (newly signed URI) | | | dCDN (newly Signed URI) | |
|<----------------------------------------| | |<----------------------------------------| |
| | | | | | | |
|10.Content request | | | |10.Content request | | |
|------------------->| [Verify URI | | |------------------->| [Verify URI | |
| | signature] | | | | signature] | |
| | | | | | | |
| (ALT: Verification result) | | | (ALT: Verification result) | |
|11.Request is denied| <Negative> | | |11.Request is denied| <Negative> | |
|<-------------------| | | |<-------------------| | |
| | | | | | | |
|12.Content delivery | <Positive> | | |12.Content delivery | <Positive> | |
|<-------------------| | | |<-------------------| | |
: : : : : : : :
: (Later in time) : : : : (Later in time) : : :
|13.CDNI Logging interface to include URI Signing information | |13.CDNI Logging interface to include URI Signing information |
| |------------------->| | | |------------------->| |
Figure 3: HTTP-based Request Routing with URI Signing Figure 3: HTTP-Based Request Routing with URI Signing
1. Using the CDNI Footprint & Capabilities Advertisement interface, 1. Using the CDNI Footprint & Capabilities Advertisement interface,
the dCDN advertises its capabilities including URI Signing the dCDN advertises its capabilities including URI Signing
support to the uCDN. support to the uCDN.
2. CSP provides to the uCDN the information needed to verify signed 2. CSP provides to the uCDN the information needed to verify Signed
URIs from that CSP. For example, this information will include URIs from that CSP. For example, this information will include
one or more keys used for validation. one or more keys used for validation.
3. Using the CDNI Metadata interface, the uCDN communicates to a 3. Using the CDNI Metadata interface, the uCDN communicates to a
dCDN the information needed to verify signed URIs from the uCDN dCDN the information needed to verify Signed URIs from the uCDN
for the given CSP. For example, this information may include for the given CSP. For example, this information may include
the URI query string parameter name for the URI Signing Package the URI query string parameter name for the URI Signing Package
Attribute in addition to keys used for validation. Attribute in addition to keys used for validation.
4. When a UA requests a piece of protected content from the CSP, 4. When a UA requests a piece of protected content from the CSP,
the CSP makes a specific authorization decision for this unique the CSP makes a specific authorization decision for this unique
request based on its local distribution policy. request based on its local distribution policy.
5. If the authorization decision is negative, the CSP rejects the 5. If the authorization decision is negative, the CSP rejects the
request and sends an error code (e.g., 403 Forbidden) in the request and sends an error code (e.g., 403 Forbidden) in the
skipping to change at page 24, line 42 skipping to change at line 1101
8. If the verification result is negative, the uCDN rejects the 8. If the verification result is negative, the uCDN rejects the
request and sends an error code 403 Forbidden in the HTTP request and sends an error code 403 Forbidden in the HTTP
response. response.
9. If the verification result is positive, the uCDN computes a 9. If the verification result is positive, the uCDN computes a
Signed JWT that is based on unique parameters of that request Signed JWT that is based on unique parameters of that request
and provides it to the end user as the URI to use to further and provides it to the end user as the URI to use to further
request the content from the dCDN. request the content from the dCDN.
10. On receipt of the corresponding content request, the dCDN 10. On receipt of the corresponding content request, the dCDN
verifies the Signed JWT in the signed URI using the information verifies the Signed JWT in the Signed URI using the information
provided by the uCDN in the CDNI Metadata. provided by the uCDN in the CDNI Metadata.
11. If the verification result is negative, the dCDN rejects the 11. If the verification result is negative, the dCDN rejects the
request and sends an error code 403 Forbidden in the HTTP request and sends an error code 403 Forbidden in the HTTP
response. response.
12. If the verification result is positive, the dCDN serves the 12. If the verification result is positive, the dCDN serves the
request and delivers the content. request and delivers the content.
13. At a later time, the dCDN reports logging events that include 13. At a later time, the dCDN reports logging events that include
URI Signing information. URI Signing information.
With HTTP-based request routing, URI Signing matches well the general With HTTP-based request routing, URI Signing matches well the general
chain of trust model of CDNI both with symmetric and asymmetric keys chain of trust model of CDNI both with symmetric and asymmetric keys
because the key information only needs to be specific to a pair of because the key information only needs to be specific to a pair of
adjacent CDNI hops. adjacent CDNI hops.
Note: While using a symmetric shared key is supported, it is NOT Note: While using a symmetric shared key is supported, it is NOT
RECOMMENDED. See the Security Considerations (Section 7) section RECOMMENDED. See the Security Considerations (Section 7) about the
about the limitations of shared keys. limitations of shared keys.
5.2. DNS Redirection 5.2. DNS Redirection
For DNS-based request routing, the CSP and uCDN must agree on a trust For DNS-based request routing, the CSP and uCDN must agree on a trust
model appropriate to the security requirements of the CSP's model appropriate to the security requirements of the CSP's
particular content. Use of asymmetric public/private keys allows for particular content. Use of asymmetric public/private keys allows for
unlimited distribution of the public key to dCDNs. However, if a unlimited distribution of the public key to dCDNs. However, if a
shared secret key is required, then the distribution SHOULD be shared secret key is required, then the distribution SHOULD be
performed by the CSP directly. performed by the CSP directly.
Note: While using a symmetric shared key is supported, it is NOT Note: While using a symmetric shared key is supported, it is NOT
RECOMMENDED. See the Security Considerations (Section 7) section RECOMMENDED. See the Security Considerations (Section 7) about the
about the limitations of shared keys. limitations of shared keys.
The URI Signing method (assuming iterative DNS request routing and a The URI Signing method (assuming iterative DNS request routing and a
CDN path with two CDNs) includes the following steps. CDN path with two CDNs) includes the following steps.
End-User dCDN uCDN CSP End-User dCDN uCDN CSP
| | | | | | | |
| 1.CDNI FCI interface used to | | | 1.CDNI FCI used to | |
| advertise URI Signing capability| | | advertise URI Signing capability | |
| |------------------->| | | |------------------->| |
| | | | | | | |
| 2.Provides information to verify Signed JWT | | 2.Provides information to verify Signed JWT |
| | |<-------------------| | | |<-------------------|
| 3.CDNI Metadata interface used to| | | 3.CDNI Metadata interface used to| |
| provide URI Signing attributes| | | provide URI Signing attributes| |
| |<-------------------| | | |<-------------------| |
: : : : : : : :
: (Later in time) : : : : (Later in time) : : :
|4.Authorization request | | |4.Authorization request | |
|------------------------------------------------------------->| |------------------------------------------------------------->|
| | | [Apply distribution | | | [Apply distribution
| | | policy] | | | | policy] |
| | | | | | | |
| | (ALT: Authorization decision) | | (ALT: Authorization decision)
|5.Request is denied | | <Negative> | |5.Request is denied | | <Negative> |
|<-------------------------------------------------------------| |<-------------------------------------------------------------|
| | | | | | | |
|6.Provides signed URI | <Positive> | |6.Provides Signed URI | <Positive> |
|<-------------------------------------------------------------| |<-------------------------------------------------------------|
| | | | | | | |
|7.DNS request | | | |7.DNS request | | |
|---------------------------------------->| | |---------------------------------------->| |
| | | | | | | |
|8.Redirect DNS to dCDN | | |8.Redirect DNS to dCDN | |
|<----------------------------------------| | |<----------------------------------------| |
| | | | | | | |
|9.DNS request | | | |9.DNS request | | |
|------------------->| | | |------------------->| | |
skipping to change at page 27, line 18 skipping to change at line 1220
5. If the authorization decision is negative, the CSP rejects the 5. If the authorization decision is negative, the CSP rejects the
request and sends an error code (e.g., 403 Forbidden) in the request and sends an error code (e.g., 403 Forbidden) in the
HTTP response. HTTP response.
6. If the authorization decision is positive, the CSP computes a 6. If the authorization decision is positive, the CSP computes a
Signed JWT that is based on unique parameters of that request Signed JWT that is based on unique parameters of that request
and includes it in the URI provided to the end user to request and includes it in the URI provided to the end user to request
the content. the content.
7. End user sends DNS request to the uCDN. 7. The end user sends a DNS request to the uCDN.
8. On receipt of the DNS request, the uCDN redirects the request to 8. On receipt of the DNS request, the uCDN redirects the request to
the dCDN. the dCDN.
9. End user sends DNS request to the dCDN. 9. The end user sends a DNS request to the dCDN.
10. On receipt of the DNS request, the dCDN responds with IP address 10. On receipt of the DNS request, the dCDN responds with IP address
of one of its Surrogates. of one of its Surrogates.
11. On receipt of the corresponding content request, the dCDN 11. On receipt of the corresponding content request, the dCDN
verifies the Signed JWT in the URI using the information verifies the Signed JWT in the URI using the information
provided by the uCDN in the CDNI Metadata. provided by the uCDN in the CDNI Metadata.
12. If the verification result is negative, the dCDN rejects the 12. If the verification result is negative, the dCDN rejects the
request and sends an error code 403 Forbidden in the HTTP request and sends an error code 403 Forbidden in the HTTP
skipping to change at page 27, line 51 skipping to change at line 1253
With DNS-based request routing, URI Signing matches well the general With DNS-based request routing, URI Signing matches well the general
chain of trust model of CDNI when used with asymmetric keys because chain of trust model of CDNI when used with asymmetric keys because
the only key information that needs to be distributed across the only key information that needs to be distributed across
multiple, possibly untrusted, CDNI hops is the public key, which is multiple, possibly untrusted, CDNI hops is the public key, which is
generally not confidential. generally not confidential.
With DNS-based request routing, URI Signing does not match well with With DNS-based request routing, URI Signing does not match well with
the general chain of trust model of CDNI when used with symmetric the general chain of trust model of CDNI when used with symmetric
keys because the symmetric key information needs to be distributed keys because the symmetric key information needs to be distributed
across multiple CDNI hops, to CDNs with which the CSP may not have a across multiple CDNI hops to CDNs with which the CSP may not have a
trust relationship. This raises a security concern for applicability trust relationship. This raises a security concern for applicability
of URI Signing with symmetric keys in case of DNS-based inter-CDN of URI Signing with symmetric keys in case of DNS-based inter-CDN
request routing. Due to these flaws, this architecture MUST NOT be request routing. Due to these flaws, this architecture MUST NOT be
implemented. implemented.
Note: While using a symmetric shared key is supported, it is NOT Note: While using a symmetric shared key is supported, it is NOT
RECOMMENDED. See the Security Considerations (Section 7) section RECOMMENDED. See the Security Considerations (Section 7) about the
about the limitations of shared keys. limitations of shared keys.
6. IANA Considerations 6. IANA Considerations
6.1. CDNI Payload Type 6.1. CDNI Payload Type
This document requests the registration of the following CDNI Payload IANA has registered the following CDNI Payload Type under the IANA
Type under the IANA "CDNI Payload Types" registry: "CDNI Payload Types" registry:
+===============+===============+ +===============+===============+
| Payload Type | Specification | | Payload Type | Specification |
+===============+===============+ +===============+===============+
| MI.UriSigning | RFCthis | | MI.UriSigning | RFC 9246 |
+---------------+---------------+ +---------------+---------------+
Table 1 Table 1
[RFC Editor: Please replace RFCthis with the published RFC number for
this document.]
6.1.1. CDNI UriSigning Payload Type 6.1.1. CDNI UriSigning Payload Type
Purpose: The purpose of this payload type is to distinguish Purpose: The purpose of this payload type is to distinguish
UriSigning MI objects (and any associated capability advertisement). UriSigning Metadata interface (MI) objects (and any associated
capability advertisement).
Interface: MI/FCI Interface: MI/FCI
Encoding: see Section 4.4 Encoding: see Section 4.4
6.2. CDNI Logging Record Type 6.2. CDNI Logging Record Type
This document requests the registration of the following CDNI Logging IANA has registered the following CDNI Logging record-type under the
record-type under the IANA "CDNI Logging record-types" registry: IANA "CDNI Logging record-types" registry:
+======================+===========+===========================+ +======================+===========+===========================+
| record-types | Reference | Description | | record-types | Reference | Description |
+======================+===========+===========================+ +======================+===========+===========================+
| cdni_http_request_v2 | RFCthis | Extension to CDNI Logging | | cdni_http_request_v2 | RFC 9246 | Extension to CDNI Logging |
| | | Record version 1 for | | | | Record version 1 for |
| | | content delivery using | | | | content delivery using |
| | | HTTP, to include URI | | | | HTTP, to include URI |
| | | Signing logging fields | | | | Signing Logging fields |
+----------------------+-----------+---------------------------+ +----------------------+-----------+---------------------------+
Table 2 Table 2
[RFC Editor: Please replace RFCthis with the published RFC number for
this document.]
6.2.1. CDNI Logging Record Version 2 for HTTP 6.2.1. CDNI Logging Record Version 2 for HTTP
The "cdni_http_request_v2" record-type supports all of the fields The "cdni_http_request_v2" record-type supports all of the fields
supported by the "cdni_http_request_v1" record-type [RFC7937] plus supported by the "cdni_http_request_v1" record-type [RFC7937] plus
the two additional fields "s-uri-signing" and "s-uri-signing-deny- the two additional fields "s-uri-signing" and "s-uri-signing-deny-
reason", registered by this document in Section 6.3. The name, reason", registered by this document in Section 6.3. The name,
format, field value, and occurence information for the two new fields format, field value, and occurrence information for the two new
can be found in Section 4.5 of this document. fields can be found in Section 4.5 of this document.
6.3. CDNI Logging Field Names 6.3. CDNI Logging Field Names
This document requests the registration of the following CDNI Logging IANA has registered the following CDNI Logging fields under the IANA
fields under the IANA "CDNI Logging Field Names" registry: "CDNI Logging Field Names" registry:
+===========================+===========+ +===========================+===========+
| Field Name | Reference | | Field Name | Reference |
+===========================+===========+ +===========================+===========+
| s-uri-signing | RFCthis | | s-uri-signing | RFC 9246 |
+---------------------------+-----------+ +---------------------------+-----------+
| s-uri-signing-deny-reason | RFCthis | | s-uri-signing-deny-reason | RFC 9246 |
+---------------------------+-----------+ +---------------------------+-----------+
Table 3 Table 3
[RFC Editor: Please replace RFCthis with the published RFC number for
this document.]
6.4. CDNI URI Signing Verification Code 6.4. CDNI URI Signing Verification Code
The IANA is requested to create a new "CDNI URI Signing Verification IANA has created a new "CDNI URI Signing Verification Code"
Code" subregistry, in the "Content Delivery Networks Interconnection subregistry in the "Content Delivery Networks Interconnection (CDNI)
(CDNI) Parameters" registry. The "CDNI URI Signing Verification Parameters" registry. The "CDNI URI Signing Verification Code"
Code" namespace defines the valid values associated with the s-uri- namespace defines the valid values associated with the s-uri-signing
signing CDNI Logging Field. The CDNI URI Signing Verification Code CDNI Logging field. The CDNI URI Signing Verification Code is a
is a 3DIGIT value as defined in Section 4.5. Additions to the CDNI 3DIGIT value as defined in Section 4.5. Additions to the CDNI URI
URI Signing Verification Code namespace will conform to the Signing Verification Code namespace will conform to the
"Specification Required" policy as defined in [RFC8126]. Updates to "Specification Required" policy as defined in [RFC8126]. Updates to
this subregistry are expected to be infrequent. this subregistry are expected to be infrequent.
+=======+===========+=====================================+ +=======+===========+=====================================+
| Value | Reference | Description | | Value | Reference | Description |
+=======+===========+=====================================+ +=======+===========+=====================================+
| 000 | RFCthis | No signed JWT verification | | 000 | RFC 9246 | No signed JWT verification |
| | | performed | | | | performed |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 200 | RFCthis | Signed JWT verification performed | | 200 | RFC 9246 | Signed JWT verification performed |
| | | and verified | | | | and verified |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 400 | RFCthis | Signed JWT verification performed | | 400 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of incorrect | | | | and rejected because of incorrect |
| | | signature | | | | signature |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 401 | RFCthis | Signed JWT verification performed | | 401 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of Issuer | | | | and rejected because of Issuer |
| | | enforcement | | | | enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 402 | RFCthis | Signed JWT verification performed | | 402 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of Subject | | | | and rejected because of Subject |
| | | enforcement | | | | enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 403 | RFCthis | Signed JWT verification performed | | 403 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of Audience | | | | and rejected because of Audience |
| | | enforcement | | | | enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 404 | RFCthis | Signed JWT verification performed | | 404 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of Expiration | | | | and rejected because of Expiration |
| | | Time enforcement | | | | Time enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 405 | RFCthis | Signed JWT verification performed | | 405 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of Not Before | | | | and rejected because of Not Before |
| | | enforcement | | | | enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 406 | RFCthis | Signed JWT verification performed | | 406 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because only one of | | | | and rejected because only one of |
| | | CDNI Signed Token Transport or CDNI | | | | CDNI Signed Token Transport or CDNI |
| | | Expiration Time Setting present. | | | | Expiration Time Setting present |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 407 | RFCthis | Signed JWT verification performed | | 407 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of JWT ID | | | | and rejected because of JWT ID |
| | | enforcement | | | | enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 408 | RFCthis | Signed JWT verification performed | | 408 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of Version | | | | and rejected because of Version |
| | | enforcement | | | | enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 409 | RFCthis | Signed JWT verification performed | | 409 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of Critical | | | | and rejected because of Critical |
| | | Extension enforcement | | | | Extension enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 410 | RFCthis | Signed JWT verification performed | | 410 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of Client IP | | | | and rejected because of Client IP |
| | | enforcement | | | | enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 411 | RFCthis | Signed JWT verification performed | | 411 | RFC 9246 | Signed JWT verification performed |
| | | and rejected because of URI | | | | and rejected because of URI |
| | | Container enforcement | | | | Container enforcement |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
| 500 | RFCthis | Unable to perform signed JWT | | 500 | RFC 9246 | Unable to perform signed JWT |
| | | verification because of malformed | | | | verification because of malformed |
| | | URI | | | | URI |
+-------+-----------+-------------------------------------+ +-------+-----------+-------------------------------------+
Table 4 Table 4
[RFC Editor: Please replace RFCthis with the published RFC number for
this document.]
6.5. CDNI URI Signing Signed Token Transport 6.5. CDNI URI Signing Signed Token Transport
The IANA is requested to create a new "CDNI URI Signing Signed Token IANA has created a new "CDNI URI Signing Signed Token Transport"
Transport" subregistry in the "Content Delivery Networks subregistry in the "Content Delivery Networks Interconnection (CDNI)
Interconnection (CDNI) Parameters" registry. The "CDNI URI Signing Parameters" registry. The "CDNI URI Signing Signed Token Transport"
Signed Token Transport" namespace defines the valid values that may namespace defines the valid values that may be in the Signed Token
be in the Signed Token Transport (cdnistt) JWT claim. Additions to Transport (cdnistt) JWT claim. Additions to the Signed Token
the Signed Token Transport namespace conform to the "Specification Transport namespace conform to the "Specification Required" policy as
Required" policy as defined in [RFC8126]. Updates to this defined in [RFC8126]. Updates to this subregistry are expected to be
subregistry are expected to be infrequent. infrequent.
The following table defines the initial Enforcement Information The following table defines the initial Enforcement Information
Elements: Elements:
+=======+=============================================+=========+ +=======+=============================================+==========+
| Value | Description | RFC | | Value | Description | RFC |
+=======+=============================================+=========+ +=======+=============================================+==========+
| 0 | Designates token transport is not enabled | RFCthis | | 0 | Designates token transport is not enabled | RFC 9246 |
+-------+---------------------------------------------+---------+ +-------+---------------------------------------------+----------+
| 1 | Designates token transport via cookie | RFCthis | | 1 | Designates token transport via cookie | RFC 9246 |
+-------+---------------------------------------------+---------+ +-------+---------------------------------------------+----------+
| 2 | Designates token transport via query string | RFCthis | | 2 | Designates token transport via query string | RFC 9246 |
+-------+---------------------------------------------+---------+ +-------+---------------------------------------------+----------+
Table 5
[RFC Editor: Please replace RFCthis with the published RFC number for Table 5
this document.]
6.6. JSON Web Token Claims Registration 6.6. JSON Web Token Claims Registration
This specification registers the following Claims in the IANA "JSON This specification registers the following claims in the IANA "JSON
Web Token Claims" registry [IANA.JWT.Claims] established by Web Token Claims" registry [IANA.JWT.Claims] established by
[RFC7519]. [RFC7519].
6.6.1. Registry Contents 6.6.1. Registry Contents
* Claim Name: cdniv Claim Name: cdniv
* Claim Description: CDNI Claim Set Version Claim Description: CDNI Claim Set Version
* Change Controller: IESG Change Controller: IESG
* Specification Document(s): Section 2.1.8 of [[ this specification Specification Document(s): Section 2.1.8 of RFC 9246
]]
* Claim Name: cdnicrit Claim Name: cdnicrit
* Claim Description: CDNI Critical Claims Set Claim Description: CDNI Critical Claims Set
* Change Controller: IESG Change Controller: IESG
* Specification Document(s): Section 2.1.9 of [[ this specification Specification Document(s): Section 2.1.9 of RFC 9246
]]
* Claim Name: cdniip Claim Name: cdniip
* Claim Description: CDNI IP Address Claim Description: CDNI IP Address
* Change Controller: IESG Change Controller: IESG
* Specification Document(s): Section 2.1.10 of [[ this specification Specification Document(s): Section 2.1.10 of RFC 9246
]]
* Claim Name: cdniuc Claim Name: cdniuc
* Claim Description: CDNI URI Container Claim Description: CDNI URI Container
* Change Controller: IESG Change Controller: IESG
* Specification Document(s): Section 2.1.11 of [[ this specification Specification Document(s): Section 2.1.11 of RFC 9246
]]
* Claim Name: cdniets Claim Name: cdniets
* Claim Description: CDNI Expiration Time Setting for Signed Token Claim Description: CDNI Expiration Time Setting for Signed Token
Renewal Renewal
* Change Controller: IESG Change Controller: IESG
* Specification Document(s): Section 2.1.12 of [[ this specification Specification Document(s): Section 2.1.12 of RFC 9246
]]
* Claim Name: cdnistt Claim Name: cdnistt
* Claim Description: CDNI Signed Token Transport Method for Signed Claim Description: CDNI Signed Token Transport Method for Signed
Token Renewal Token Renewal
* Change Controller: IESG Change Controller: IESG
* Specification Document(s): Section 2.1.13 of [[ this specification Specification Document(s): Section 2.1.13 of RFC 9246
]]
* Claim Name: cdnistd Claim Name: cdnistd
* Claim Description: CDNI Signed Token Depth Claim Description: CDNI Signed Token Depth
* Change Controller: IESG Change Controller: IESG
* Specification Document(s): Section 2.1.14 of [[ this specification Specification Document(s): Section 2.1.14 of RFC 9246
]]
6.7. Expert Review Guidance 6.7. Expert Review Guidance
Generally speaking, we should determine the registration has a Generally speaking, we should determine the registration has a
rational justification and does not duplicate a previous rational justification and does not duplicate a previous
registration. Early assignment should be permissible as long as registration. Early assignment should be permissible as long as
there is a reasonable expectation that the specification will become there is a reasonable expectation that the specification will become
formalized. Expert Reviewers should be empowered to make formalized. Expert Reviewers should be empowered to make
determinations, but generally speaking they should allow new claims determinations, but generally speaking they should allow new claims
that do not otherwise introduce conflicts with implementation or that do not otherwise introduce conflicts with implementation or
things that may lead to confusion. They should also follow the things that may lead to confusion. They should also follow the
guidelines of [RFC8126] Section 5 when sensible. guidelines of Section 5 of [RFC8126] when sensible.
7. Security Considerations 7. Security Considerations
This document describes the concept of URI Signing and how it can be This document describes the concept of URI Signing and how it can be
used to provide access authorization in the case of CDNI. The used to provide access authorization in the case of CDNI. The
primary goal of URI Signing is to make sure that only authorized UAs primary goal of URI Signing is to make sure that only authorized UAs
are able to access the content, with a CSP being able to authorize are able to access the content, with a CSP being able to authorize
every individual request. It should be noted that URI Signing is not every individual request. It should be noted that URI Signing is not
a content protection scheme; if a CSP wants to protect the content a content protection scheme; if a CSP wants to protect the content
itself, other mechanisms, such as DRM, are more appropriate. itself, other mechanisms, such as DRM, are more appropriate.
CDNI URI Signing Signed Tokens leverage JSON Web Tokens and thus CDNI URI Signing Signed Tokens leverage JSON Web Tokens and thus,
guidelines in [RFC8725] are applicable for all JWT interactions. guidelines in [RFC8725] are applicable for all JWT interactions.
In general, it holds that the level of protection against In general, it holds that the level of protection against
illegitimate access can be increased by including more claims in the illegitimate access can be increased by including more claims in the
signed JWT. The current version of this document includes claims for signed JWT. The current version of this document includes claims for
enforcing Issuer, Client IP Address, Not Before time, and Expiration enforcing Issuer, Client IP Address, Not Before time, and Expiration
Time, however this list can be extended with other, more complex, Time; however, this list can be extended with other more complex
attributes that are able to provide some form of protection against attributes that are able to provide some form of protection against
some of the vulnerabilities highlighted below. some of the vulnerabilities highlighted below.
That said, there are a number of aspects that limit the level of That said, there are a number of aspects that limit the level of
security offered by URI Signing and that anybody implementing URI security offered by URI Signing and that anybody implementing URI
Signing should be aware of. Signing should be aware of.
* Replay attacks: A (valid) Signed URI may be used to perform replay Replay attacks: A (valid) Signed URI may be used to perform replay
attacks. The vulnerability to replay attacks can be reduced by attacks. The vulnerability to replay attacks can be reduced by
picking a relatively short window between the Not Before time and picking a relatively short window between the Not Before time and
Expiration Time attributes, although this is limited by the fact Expiration Time attributes, although this is limited by the fact
that any HTTP-based request needs a window of at least a couple of that any HTTP-based request needs a window of at least a couple of
seconds to prevent sudden network issues from denying legitimate seconds to prevent sudden network issues from denying legitimate
UAs access to the content. One may also reduce exposure to replay UAs access to the content. One may also reduce exposure to replay
attacks by including a unique one-time access ID via the JWT ID attacks by including a unique one-time access ID via the JWT ID
attribute (jti claim). Whenever the dCDN receives a request with attribute (jti claim). Whenever the dCDN receives a request with
a given unique ID, it adds that ID to the list of 'used' IDs. In a given unique ID, it adds that ID to the list of 'used' IDs. In
the case an illegitimate UA tries to use the same URI through a the case an illegitimate UA tries to use the same URI through a
replay attack, the dCDN can deny the request based on the already- replay attack, the dCDN can deny the request based on the already
used access ID. This list should be kept bounded. A reasonable used access ID. This list should be kept bounded. A reasonable
approach would be to expire the entries based on the exp claim approach would be to expire the entries based on the exp claim
value. If no exp claim is present then a simple LRU could be value. If no exp claim is present, then a simple Least Recently
used, however this would allow values to eventually be reused. Used (LRU) cache could be used; however, this would allow values
to eventually be reused.
* Illegitimate clients behind a NAT: In cases where there are Illegitimate clients behind a NAT: In cases where there are multiple
multiple users behind the same NAT, all users will have the same users behind the same NAT, all users will have the same IP address
IP address from the point of view of the dCDN. This results in from the point of view of the dCDN. This results in the dCDN not
the dCDN not being able to distinguish between different users being able to distinguish between different users based on Client
based on Client IP Address which can lead to illegitimate users IP Address, which can lead to illegitimate users being able to
being able to access the content. One way to reduce exposure to access the content. One way to reduce exposure to this kind of
this kind of attack is to not only check for Client IP but also attack is to not only check for Client IP but also for other
for other attributes, e.g., attributes that can be found in HTTP attributes, e.g., attributes that can be found in HTTP headers.
headers. However, this may be easily circumvented by a However, this may be easily circumvented by a sophisticated
sophisticated attacker. attacker.
A shared key distribured between CSP and uCDN is more likely to be A shared key distributed between CSP and uCDN is more likely to be
compromised. Since this key can be used to legitimately sign a URL compromised. Since this key can be used to legitimately sign a URL
for content access authorization, it is important to know the for content access authorization, it is important to know the
implications of a compromised shared key. While using a shared key implications of a compromised shared key. While using a shared key
scheme can be convenient, this architecture is NOT RECOMMENDED due to scheme can be convenient, this architecture is NOT RECOMMENDED due to
the risks associated. It is included for legacy feature parity and the risks associated. It is included for legacy feature parity and
is highly discouraged in new implementations. is highly discouraged in new implementations.
If a shared key usable for signing is compromised, an attacker can If a shared key usable for signing is compromised, an attacker can
use it to perform a denial-of-service attack by forcing the CDN to use it to perform a denial-of-service attack by forcing the CDN to
evaluate prohibitively expensive regular expressions embedded in a evaluate prohibitively expensive regular expressions embedded in a
skipping to change at page 35, line 20 skipping to change at line 1566
The URI Container (cdniuc) claim can be given a wildcard value. The URI Container (cdniuc) claim can be given a wildcard value.
This, combined with the fact that it is the only mandatory claim, This, combined with the fact that it is the only mandatory claim,
means you can effectively make a skeleton key. Doing this does not means you can effectively make a skeleton key. Doing this does not
sufficiently limit the scope of the JWT and is NOT RECOMMENDED. The sufficiently limit the scope of the JWT and is NOT RECOMMENDED. The
only way to prevent such a key from being used after it is only way to prevent such a key from being used after it is
distributed is to revoke the signing key so it no longer validates. distributed is to revoke the signing key so it no longer validates.
8. Privacy 8. Privacy
The privacy protection concerns described in CDNI Logging Interface The privacy protection concerns described in "Content Distribution
[RFC7937] apply when the client's IP address (cdniip) or Subject Network Interconnection (CDNI) Logging Interface" [RFC7937] apply
(sub) is embedded in the Signed URI. For this reason, the mechanism when the client's IP address (cdniip) or Subject (sub) is embedded in
described in Section 2 encrypts the Client IP or Subject before the Signed URI. For this reason, the mechanism described in
including it in the URI Signing Package (and thus the URL itself). Section 2 encrypts the Client IP or Subject before including it in
the URI Signing Package (and thus the URL itself).
9. Acknowledgements
The authors would like to thank the following people for their
contributions in reviewing this document and providing feedback:
Scott Leibrand, Kevin Ma, Ben Niven-Jenkins, Thierry Magnien, Dan
York, Bhaskar Bhupalam, Matt Caulfield, Samuel Rajakumar, Iuniana
Oprescu, Leif Hedstrom, Gancho Tenev, Brian Campbell, and Chris
Lemmons.
10. Contributors
In addition, the authors would also like to make special mentions for
certain people who contributed significant sections to this document.
* Matt Caulfield provided content for the CDNI Metadata Interface
section.
* Emmanuel Thomas provided content for HTTP Adaptive Streaming.
* Matt Miller provided consultation on JWT usage as well as code to
generate working JWT examples.
11. References 9. References
11.1. Normative References 9.1. Normative References
[POSIX.1] "The Open Group Base Specifications Issue 7", IEEE [POSIX.1] The Open Group, "IEEE Standard for Information Technology
Std 1003.1 2018 Edition, 31 January 2018, -- Portable Operating System Interface (POSIX(TM)) Base
<http://pubs.opengroup.org/onlinepubs/9699919799/>. Specifications, Issue 7", (Revision of IEEE Std
1003.1-2008), IEEE Std 1003.1-2017, January 2018,
<https://pubs.opengroup.org/onlinepubs/9699919799/>.
[RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791,
DOI 10.17487/RFC0791, September 1981, DOI 10.17487/RFC0791, September 1981,
<https://www.rfc-editor.org/info/rfc791>. <https://www.rfc-editor.org/info/rfc791>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/info/rfc2119>.
skipping to change at page 37, line 43 skipping to change at line 1664
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>. May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
Interchange Format", STD 90, RFC 8259, Interchange Format", STD 90, RFC 8259,
DOI 10.17487/RFC8259, December 2017, DOI 10.17487/RFC8259, December 2017,
<https://www.rfc-editor.org/info/rfc8259>. <https://www.rfc-editor.org/info/rfc8259>.
11.2. Informative References 9.2. Informative References
[IANA.JWT.Claims] [IANA.JWT.Claims]
IANA, "JSON Web Token Claims", IANA, "JSON Web Token (JWT)",
<http://www.iana.org/assignments/jwt>. <https://www.iana.org/assignments/jwt>.
[MPEG-DASH] [MPEG-DASH]
ISO, "Information technology -- Dynamic adaptive streaming ISO, "Information technology -- Dynamic adaptive streaming
over HTTP (DASH) -- Part 1: Media presentation description over HTTP (DASH) -- Part 1: Media presentation description
and segment format", ISO/IEC 23009-1:2014, Edition 2, May and segment formats", ISO/IEC 23009-1:2019, Edition 4,
2014, <http://www.iso.org/standard/65274.html>. December 2019, <https://www.iso.org/standard/79329.html>.
[RFC6983] van Brandenburg, R., van Deventer, O., Le Faucheur, F., [RFC6983] van Brandenburg, R., van Deventer, O., Le Faucheur, F.,
and K. Leung, "Models for HTTP-Adaptive-Streaming-Aware and K. Leung, "Models for HTTP-Adaptive-Streaming-Aware
Content Distribution Network Interconnection (CDNI)", Content Distribution Network Interconnection (CDNI)",
RFC 6983, DOI 10.17487/RFC6983, July 2013, RFC 6983, DOI 10.17487/RFC6983, July 2013,
<https://www.rfc-editor.org/info/rfc6983>. <https://www.rfc-editor.org/info/rfc6983>.
[RFC7336] Peterson, L., Davie, B., and R. van Brandenburg, Ed., [RFC7336] Peterson, L., Davie, B., and R. van Brandenburg, Ed.,
"Framework for Content Distribution Network "Framework for Content Distribution Network
Interconnection (CDNI)", RFC 7336, DOI 10.17487/RFC7336, Interconnection (CDNI)", RFC 7336, DOI 10.17487/RFC7336,
skipping to change at page 39, line 8 skipping to change at line 1720
<https://www.rfc-editor.org/info/rfc8216>. <https://www.rfc-editor.org/info/rfc8216>.
[RFC8725] Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token Best [RFC8725] Sheffer, Y., Hardt, D., and M. Jones, "JSON Web Token Best
Current Practices", BCP 225, RFC 8725, Current Practices", BCP 225, RFC 8725,
DOI 10.17487/RFC8725, February 2020, DOI 10.17487/RFC8725, February 2020,
<https://www.rfc-editor.org/info/rfc8725>. <https://www.rfc-editor.org/info/rfc8725>.
Appendix A. Signed URI Package Example Appendix A. Signed URI Package Example
This section contains three examples of token usage: a simple example This section contains three examples of token usage: a simple example
with only the required claim present, a complex example which with only the required claim present, a complex example that
demonstrates the full JWT claims set, including an encrypted Client demonstrates the full JWT claims set, including an encrypted Client
IP Address (cdniip), and one that uses a Signed Token Renewal. IP Address (cdniip), and one that uses a Signed Token Renewal.
Note: All of the examples have whitespace added to improve formatting Note: All of the examples have empty space added to improve
and readability, but are not present in the generated content. formatting and readability, but are not present in the generated
content.
All examples use the following JWK Set [RFC7517]: All examples use the following JWK Set [RFC7517]:
{ "keys": [ { "keys": [
{ {
"kty": "EC", "kty": "EC",
"kid": "P5UpOv0eMq1wcxLf7WxIg09JdSYGYFDOWkldueaImf0", "kid": "P5UpOv0eMq1wcxLf7WxIg09JdSYGYFDOWkldueaImf0",
"use": "sig", "use": "sig",
"alg": "ES256", "alg": "ES256",
"crv": "P-256", "crv": "P-256",
skipping to change at page 39, line 47 skipping to change at line 1760
{ {
"kty": "oct", "kty": "oct",
"kid": "f-WbjxBC3dPuI3d24kP2hfvos7Qz688UTi6aB0hN998", "kid": "f-WbjxBC3dPuI3d24kP2hfvos7Qz688UTi6aB0hN998",
"use": "enc", "use": "enc",
"alg": "A128GCM", "alg": "A128GCM",
"k": "4uFxxV7fhNmrtiah2d1fFg" "k": "4uFxxV7fhNmrtiah2d1fFg"
} }
]} ]}
Note: They are the public signing key, the private signing key, and Note: They are the public signing key, the private signing key, and
the shared secret enctyption key, respectively. The public and the shared secret encryption key, respectively. The public and
private signing keys have the same fingerprint and only vary by the private signing keys have the same fingerprint and only vary by the
'd' parameter that is missing from the public signing key. 'd' parameter that is missing from the public signing key.
A.1. Simple Example A.1. Simple Example
This example is a simple common usage example containing a minimal This example is a simple common usage example containing a minimal
subset of claims that the authors find most useful. subset of claims that the authors find most useful.
The JWT Claim Set before signing: The JWT Claim Set before signing:
Note: "sha-256;2tderfWPa86Ku7YnzW51YUp7dGUjBS_3SW3ELx4hmWY" is the Note: "sha-256;2tderfWPa86Ku7YnzW51YUp7dGUjBS_3SW3ELx4hmWY" is the
URL Segment form ([RFC6920] Section 5) of "http://cdni.example/foo/ URL Segment form (Section 5 of [RFC6920]) of
bar". "http://cdni.example/foo/bar".
{ {
"exp": 1646867369, "exp": 1646867369,
"iss": "uCDN Inc", "iss": "uCDN Inc",
"cdniuc": "hash:sha-256;2tderfWPa86Ku7YnzW51YUp7dGUjBS_3SW3ELx4hmWY" "cdniuc":
} "hash:sha-256;2tderfWPa86Ku7YnzW51YUp7dGUjBS_3SW3ELx4hmWY"
}
The signed JWT: The signed JWT:
eyJhbGciOiJFUzI1NiIsImtpZCI6IlA1VXBPdjBlTXExd2N4TGY3V3hJZzA5SmRTWU eyJhbGciOiJFUzI1NiIsImtpZCI6IlA1VXBPdjBlTXExd2N4TGY3V3hJZzA5SmRTWU
dZRkRPV2tsZHVlYUltZjAifQ.eyJleHAiOjE2NDY4NjczNjksImlzcyI6InVDRE4gS dZRkRPV2tsZHVlYUltZjAifQ.eyJleHAiOjE2NDY4NjczNjksImlzcyI6InVDRE4gS
W5jIiwiY2RuaXVjIjoiaGFzaDpzaGEtMjU2OzJ0ZGVyZldQYTg2S3U3WW56VzUxWVV W5jIiwiY2RuaXVjIjoiaGFzaDpzaGEtMjU2OzJ0ZGVyZldQYTg2S3U3WW56VzUxWVV
wN2RHVWpCU18zU1czRUx4NGhtV1kifQ.TaNlJM3D96i_9J9XvlICO6FUIDFTqt3E2Y wN2RHVWpCU18zU1czRUx4NGhtV1kifQ.TaNlJM3D96i_9J9XvlICO6FUIDFTqt3E2Y
JkEUOLfcH0b89wYRKTbJ9Yj6h_GRgSoZoQO0cps3yUPcWGK3smCw JkEUOLfcH0b89wYRKTbJ9Yj6h_GRgSoZoQO0cps3yUPcWGK3smCw
A.2. Complex Example A.2. Complex Example
This example uses all fields except for those dealing with Signed This example uses all fields except for those dealing with Signed
Token Renewal, including Client IP Address (cdniip) and Subject (sub) Token Renewal, including Client IP Address (cdniip) and Subject
which are encrpyted. This significantly increases the size of the (sub), which are encrypted. This significantly increases the size of
signed JWT token. the signed JWT token.
JWE for Client IP Address (cdniip) of [2001:db8::1/32]: JWE for Client IP Address (cdniip) of [2001:db8::1/32]:
eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiZGlyIiwia2lkIjoiZi1XYmp4QkMzZFB1ST eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiZGlyIiwia2lkIjoiZi1XYmp4QkMzZFB1ST
NkMjRrUDJoZnZvczdRejY4OFVUaTZhQjBoTjk5OCJ9..aUDDFEQBIc3nWjOb.bGXWT NkMjRrUDJoZnZvczdRejY4OFVUaTZhQjBoTjk5OCJ9..aUDDFEQBIc3nWjOb.bGXWT
HPkntmPCKn0pPPNEQ.iyTttnFybO2YBLqwl_YSjA HPkntmPCKn0pPPNEQ.iyTttnFybO2YBLqwl_YSjA
JWE for Subject (sub) of "UserToken": JWE for Subject (sub) of "UserToken":
eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiZGlyIiwia2lkIjoiZi1XYmp4QkMzZFB1ST eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiZGlyIiwia2lkIjoiZi1XYmp4QkMzZFB1ST
skipping to change at page 42, line 4 skipping to change at line 1858
The JWT Claim Set before signing: The JWT Claim Set before signing:
{ {
"cdniets": 30, "cdniets": 30,
"cdnistt": 1, "cdnistt": 1,
"cdnistd": 2, "cdnistd": 2,
"exp": 1646867369, "exp": 1646867369,
"cdniuc": "regex:http://cdni\\.example/foo/bar/[0-9]{3}\\.ts" "cdniuc": "regex:http://cdni\\.example/foo/bar/[0-9]{3}\\.ts"
} }
The signed JWT: The signed JWT:
eyJhbGciOiJFUzI1NiIsImtpZCI6IlA1VXBPdjBlTXExd2N4TGY3V3hJZzA5SmRTWU eyJhbGciOiJFUzI1NiIsImtpZCI6IlA1VXBPdjBlTXExd2N4TGY3V3hJZzA5SmRTWU
dZRkRPV2tsZHVlYUltZjAifQ.eyJjZG5pZXRzIjozMCwiY2RuaXN0dCI6MSwiY2Rua dZRkRPV2tsZHVlYUltZjAifQ.eyJjZG5pZXRzIjozMCwiY2RuaXN0dCI6MSwiY2Rua
XN0ZCI6MiwiZXhwIjoxNjQ2ODY3MzY5LCJjZG5pdWMiOiJyZWdleDpodHRwOi8vY2R XN0ZCI6MiwiZXhwIjoxNjQ2ODY3MzY5LCJjZG5pdWMiOiJyZWdleDpodHRwOi8vY2R
uaVxcLmV4YW1wbGUvZm9vL2Jhci9bMC05XXszfVxcLnRzIn0.tlPvoKw3BCClw4Lx9 uaVxcLmV4YW1wbGUvZm9vL2Jhci9bMC05XXszfVxcLnRzIn0.tlPvoKw3BCClw4Lx9
PQu7MK6b2IN55ZoCPSaxovGK0zS53Wpb1MbJBow7G8LiGR39h6-2Iq7PWUSr3MdTIz PQu7MK6b2IN55ZoCPSaxovGK0zS53Wpb1MbJBow7G8LiGR39h6-2Iq7PWUSr3MdTIz
HYw HYw
Once the server verifies the signed JWT it will return a new signed Once the server verifies the signed JWT it will return a new signed
JWT with an updated expiry time (exp) as shown below. Note the JWT with an updated Expiry Time (exp) as shown below. Note the
expiry time is increased by the expiration time setting (cdniets) Expiry Time is increased by the expiration time setting (cdniets)
value. value.
The JWT Claim Set before signing: The JWT Claim Set before signing:
{ {
"cdniets": 30, "cdniets": 30,
"cdnistt": 1, "cdnistt": 1,
"cdnistd": 2, "cdnistd": 2,
"exp": 1646867399, "exp": 1646867399,
"cdniuc": "regex:http://cdni\\.example/foo/bar/[0-9]{3}\\.ts" "cdniuc": "regex:http://cdni\\.example/foo/bar/[0-9]{3}\\.ts"
skipping to change at page 42, line 37 skipping to change at line 1892
The signed JWT: The signed JWT:
eyJhbGciOiJFUzI1NiIsImtpZCI6IlA1VXBPdjBlTXExd2N4TGY3V3hJZzA5SmRTWU eyJhbGciOiJFUzI1NiIsImtpZCI6IlA1VXBPdjBlTXExd2N4TGY3V3hJZzA5SmRTWU
dZRkRPV2tsZHVlYUltZjAifQ.eyJjZG5pZXRzIjozMCwiY2RuaXN0dCI6MSwiY2Rua dZRkRPV2tsZHVlYUltZjAifQ.eyJjZG5pZXRzIjozMCwiY2RuaXN0dCI6MSwiY2Rua
XN0ZCI6MiwiZXhwIjoxNjQ2ODY3Mzk5LCJjZG5pdWMiOiJyZWdleDpodHRwOi8vY2R XN0ZCI6MiwiZXhwIjoxNjQ2ODY3Mzk5LCJjZG5pdWMiOiJyZWdleDpodHRwOi8vY2R
uaVxcLmV4YW1wbGUvZm9vL2Jhci9bMC05XXszfVxcLnRzIn0.ivY5d_fKGd-OHTpUs uaVxcLmV4YW1wbGUvZm9vL2Jhci9bMC05XXszfVxcLnRzIn0.ivY5d_fKGd-OHTpUs
8uJUrnHvt-rduzu5H4zM7167pUUAghub53FqDQ5G16jRYX2sY73mA_uLpYDdb-CPts 8uJUrnHvt-rduzu5H4zM7167pUUAghub53FqDQ5G16jRYX2sY73mA_uLpYDdb-CPts
8FA 8FA
Acknowledgements
The authors would like to thank the following people for their
contributions in reviewing this document and providing feedback:
Scott Leibrand, Kevin Ma, Ben Niven-Jenkins, Thierry Magnien, Dan
York, Bhaskar Bhupalam, Matt Caulfield, Samuel Rajakumar, Iuniana
Oprescu, Leif Hedstrom, Gancho Tenev, Brian Campbell, and Chris
Lemmons.
Contributors
In addition, the authors would also like to make special mentions for
certain people who contributed significant sections to this document.
* Matt Caulfield provided content for Section 4.4, "CDNI Metadata
Interface".
* Emmanuel Thomas provided content for HTTP Adaptive Streaming.
* Matt Miller provided consultation on JWT usage as well as code to
generate working JWT examples.
Authors' Addresses Authors' Addresses
Ray van Brandenburg Ray van Brandenburg
Tiledmedia Tiledmedia
Anna van Buerenplein 1 Anna van Buerenplein 1
Den Haag 2595DA Den Haag
Netherlands
Phone: +31 88 866 7000 Phone: +31 88 866 7000
Email: ray@tiledmedia.com Email: ray@tiledmedia.com
Kent Leung Kent Leung
Email: mail4kentl@gmail.com Email: mail4kentl@gmail.com
Phil Sorber Phil Sorber
Apple, Inc. Apple, Inc.
1800 Wazee Street
Suite 410 Suite 410
1800 Wazee Street
Denver, CO 80202 Denver, CO 80202
United States United States
Email: sorber@apple.com Email: sorber@apple.com
 End of changes. 191 change blocks. 
487 lines changed or deleted 479 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/