-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathrfc9246.xml
More file actions
2177 lines (2028 loc) · 108 KB
/
rfc9246.xml
File metadata and controls
2177 lines (2028 loc) · 108 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
<!ENTITY nbsp " ">
<!ENTITY zwsp "​">
<!ENTITY nbhy "‑">
<!ENTITY wj "⁠">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" category="std" consensus="true" docName="draft-ietf-cdni-uri-signing-26" number="9246" ipr="trust200902" obsoletes="" updates="" xml:lang="en" tocInclude="true" tocDepth="4" symRefs="true" sortRefs="true" version="3">
<front>
<title abbrev="CDNI URI Signing">URI Signing for Content Delivery Network Interconnection
(CDNI)</title>
<seriesInfo name="RFC" value="9246"/>
<author fullname="Ray van Brandenburg" initials="R" surname="van Brandenburg">
<organization>Tiledmedia</organization>
<address>
<postal>
<street>Anna van Buerenplein 1</street>
<city>Den Haag</city>
<region/>
<code>2595DA</code>
<country>Netherlands</country>
</postal>
<phone>+31 88 866 7000</phone>
<email>ray@tiledmedia.com</email>
</address>
</author>
<author fullname="Kent Leung" initials="K" surname="Leung">
<address>
<email>mail4kentl@gmail.com</email>
</address>
</author>
<author fullname="Phil Sorber" initials="P" surname="Sorber">
<organization>Apple, Inc.</organization>
<address>
<postal>
<street>1800 Wazee Street</street>
<extaddr>Suite 410</extaddr>
<city>Denver</city>
<region>CO</region>
<code>80202</code>
<country>United States</country>
</postal>
<email>sorber@apple.com</email>
</address>
</author>
<date year="2022" month="May" />
<area>art</area>
<workgroup>cdni</workgroup>
<!-- [rfced] Please insert any keywords (beyond those that appear in the
title) for use on https://www.rfc-editor.org/search. -->
<keyword>example</keyword>
<abstract>
<t>This document describes how the concept of URI Signing supports the
content access control requirements of Content Delivery Network Interconnection (CDNI) and proposes a URI Signing
method as a JSON Web Token (JWT) profile.</t>
<t>The proposed URI Signing method specifies the information needed to
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
mechanism described can be used both in CDNI and single Content Delivery Network (CDN)
scenarios.</t>
</abstract>
</front>
<middle>
<section numbered="true" toc="default">
<name>Introduction</name>
<t>This document describes the concept of URI Signing and how it can be
used to provide access authorization in the case of redirection 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
authorized UAs 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 a content protection scheme; if a CSP wants to
protect the content itself, other mechanisms, such as Digital Rights Management (DRM), are more
appropriate. In addition to access control, URI Signing also has
benefits in reducing the impact of denial-of-service attacks.</t>
<t>The overall problem space for CDN Interconnection (CDNI) is described
in the CDNI Problem Statement <xref target="RFC6707" format="default"/>
specification. This document, along with the <xref target="RFC7337"
format="default">Content Distribution Network Interconnection (CDNI) Requirements</xref> document and the <xref
target="RFC7336" format="default">Framework for Content Distribution Network Interconnection (CDNI)</xref>, describes the
need for interconnected CDNs to be able to implement an access control
mechanism that enforces a CSP's distribution policies.</t>
<t>Specifically, the <xref target="RFC7336" format="default">CDNI Framework</xref>
states:</t>
<ul empty="true" spacing="normal">
<li>The CSP may also trust the CDN operator to perform actions such as
delegating traffic to additional downstream CDNs, and to enforce per-request authorization performed by the CSP using
techniques such as URI Signing.</li>
</ul>
<t>In particular, the following requirement is listed in the <xref target="RFC7337" format="default">CDNI Requirements</xref>:</t>
<ul empty="true" spacing="normal">
<li>
<blockquote><dl><dt>MI-16</dt><dd>{HIGH} The CDNI Metadata interface shall allow signaling of
authorization checks and validation that are to be performed
by the Surrogate before delivery. For example, this could
potentially include the need to validate information (e.g.,
Expiry time, Client IP address) required for access
authorization.</dd>
</dl>
</blockquote>
</li>
</ul>
<t>This document defines a method of signing URIs that allows Surrogates in
interconnected CDNs to enforce a per-request authorization initiated by
the CSP. Splitting the role of initiating per-request authorization by
the CSP and the role of verifying this authorization by the CDN allows
any arbitrary distribution policy to be enforced across CDNs without the
need of CDNs to have any awareness of the specific CSP distribution
policies.</t>
<t>The method is implemented using signed JSON Web Tokens (JWTs) <xref target="RFC7519" format="default"/>.</t>
<section numbered="true" toc="default">
<name>Terminology</name>
<t>
The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
when, and only when, they appear in all capitals, as shown here.
</t>
<t>This document uses the terminology defined in the <xref target="RFC6707" format="default">CDNI Problem Statement</xref>.</t>
<t>This document also uses the terminology of the <xref target="RFC7519" format="default">JSON Web Token (JWT)</xref>.</t>
<t>In addition, the following terms are used throughout this
document:</t>
<dl>
<dt>Signed URI:
</dt>
<dd>A URI for which a signed JWT is provided.
</dd>
<dt>Target CDN URI:
</dt>
<dd>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).
</dd>
<dt>Redirection URI:
</dt>
<dd>A URI created by the uCDN to redirect a UA towards the dCDN. The Redirection URI can be signed by the uCDN and verified by the dCDN. In a cascaded CDNI scenario, there can be more than one Redirection URI.
</dd>
<dt>Signed Token Renewal:
</dt>
<dd>A series of signed JWTs that are used for 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 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 resource in the
set. When generating a new signed JWT in Signed Token Renewal,
parameters are carried over from one signed JWT to the next.
</dd>
</dl>
</section>
<section anchor="background" numbered="true" toc="default">
<name>Background and Overview on URI Signing</name>
<t>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 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 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 pattern matching the URI). To prevent the UA from altering the claims,
the JWT <bcp14>MUST</bcp14> be signed.</t>
<t><xref target="fig_single_cdn" format="default"/> presents an overview of the URI Signing
mechanism in the case of a CSP with a single CDN. When the UA browses
for content on CSP's website (1), it receives HTML web pages with
embedded content URIs. Upon requesting these URIs, the CSP redirects
to a CDN, creating a Target CDN URI (2) (alternatively, the Target
CDN URI itself is embedded in the HTML). The Target CDN URI is the
Signed URI, which may include the IP address of the UA and/or a time
window. The signed URI always contains a signed JWT generated by the
CSP using a shared secret or private key. Once the UA receives the
response with the Signed URI, it sends a new HTTP request using the
Signed URI to the CDN (3). Upon receiving the request, the CDN
authenticates the Signed URI by verifying the signed JWT.
If applicable, the CDN checks whether the time window is still valid
in the Signed URI and the pattern matches the URI of the request.
After these claims are verified, the CDN delivers the content (4).</t>
<t>Note: While using a symmetric shared key is supported, it is <bcp14>NOT RECOMMENDED</bcp14>.
See the <xref target="security" format="default">Security Considerations</xref> about the
limitations of shared keys.</t>
<figure anchor="fig_single_cdn">
<name>URI Signing in a CDN Environment</name>
<artwork name="" type="" align="left" alt=""><![CDATA[
--------
/ \
| CSP |< * * * * * * * * * * *
\ / Trust *
-------- relationship *
^ | *
| | *
1. Browse | | 2. Signed *
for | | URI *
content | | *
| v v
+------+ 3. Signed URI --------
| User |----------------->/ \
| Agent| | CDN |
| |<-----------------\ /
+------+ 4. Content --------
Delivery
]]></artwork>
</figure>
</section>
<section numbered="true" toc="default">
<name>CDNI URI Signing Overview</name>
<t>In a CDNI environment, as shown in <xref target="fig_cdni_env" format="default"/> below, URI Signing operates the same way in the
initial steps 1 and 2, but the later steps involve multiple CDNs
delivering the content. The main 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 DNS request,
depending on whether HTTP-based or DNS-based request 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
the uCDN) or a DNS reply, respectively (4). Once the UA
receives the response, it sends the Redirection URI/Target CDN URI to
the dCDN (5). The received URI is verified by the
dCDN before delivering the content (6).</t>
<t>Note: The CDNI call flows are covered in <xref target="operation" format="default">URI Signing Message Flow</xref>.</t>
<figure anchor="fig_cdni_env">
<name>URI Signing in a CDNI Environment</name>
<artwork name="" type="" align="left" alt=""><![CDATA[
+-------------------------+
|Request Redirection Modes|
+-------------------------+
| a) HTTP |
| b) DNS |
+-------------------------+
--------
/ \< * * * * * * * * * * * * * *
| CSP |< * * * * * * * * * * * *
\ / Trust * *
-------- relationship * *
^ | * *
| | 2. Signed * *
1. Browse | | URI in * *
for | | HTML * *
content | | * *
| v 3.a)Signed URI v *
+------+ b)DNS request -------- * Trust
| User |----------------->/ \ * relationship
| Agent| | uCDN | * (optional)
| |<-----------------\ / *
+------+ 4.a)Redirection URI------- *
^ | b)DNS Reply ^ *
| | * *
| | Trust relationship * *
| | * *
6. Content | | 5.a)Redirection URI * *
delivery | | b)Signed URI(after v v
| | DNS exchange) --------
| +---------------------->/ \ [May be
| | dCDN | cascaded
+--------------------------\ / CDNs]
--------
]]></artwork>
</figure>
<t>The trust relationships between CSP, uCDN, and
dCDN have direct implications for URI Signing. In the case shown in
<xref target="fig_cdni_env" format="default"/>, the CSP has a trust relationship with the
uCDN. The delivery of the content may be delegated to a
dCDN, which has a relationship with the uCDN but may
have no relationship with the CSP.</t>
<t>In CDNI, there are two methods for request routing: DNS-based and
HTTP-based. For DNS-based request routing, the Signed URI (i.e., the Target
CDN URI) provided by the CSP reaches the CDN directly. In
the case where the dCDN does not have a trust relationship
with the CSP, this means that either an asymmetric public/private key
method needs to be used for computing the signed JWT (because the CSP and
dCDN are not able to exchange symmetric shared secret keys). Shared keys <bcp14>MUST NOT</bcp14>
be redistributed.</t>
<t>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 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 new signed JWT, the relationship between the
dCDN and CSP is not relevant. Because a
relationship between uCDN and dCDN always exists,
either asymmetric public/private keys or symmetric shared secret keys
can be used for URI Signing with HTTP-based request routing. Note that the signed Redirection URI <bcp14>MUST</bcp14>
maintain HTTPS as the scheme if it was present in the original, and it <bcp14>MAY</bcp14> be upgraded from "http:" to "https:".</t>
<t>Two types of keys can be used for URI Signing: asymmetric keys and
symmetric shared keys. Asymmetric keys are based on a public/private 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
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 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 allows trust to
be placed in the assertions made using that key (either the
public or the symmetric key). There are very different requirements
(outside the scope of this document) for distributing asymmetric keys
and symmetric keys. Key distribution for symmetric keys requires
confidentiality to prevent third parties from getting access to the key,
since they could then generate valid Signed URIs for unauthorized
requests. Key distribution for asymmetric keys does not require
confidentiality since public keys can typically be distributed openly
(because they cannot be used to sign URIs) and the corresponding private keys are kept
secret by the URI signer.</t>
<t>Note: While using a symmetric shared key is supported, it is <bcp14>NOT RECOMMENDED</bcp14>.
See the <xref target="security" format="default">Security Considerations</xref> about the
limitations of shared keys.</t>
</section>
<section numbered="true" toc="default">
<name>URI Signing in a Non-CDNI Context</name>
<t>While the URI Signing method defined in this document was primarily
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 Signing method that precludes it from being
used in a non-CDNI context. As such, the described mechanism could be
used in a single-CDN scenario such as shown in <xref target="fig_single_cdn" format="default"/>
in <xref target="background" format="default"/> for example
to allow a CSP that uses different CDNs to only have to implement a
single URI Signing mechanism.</t>
</section>
</section>
<section anchor="jwt_profile" numbered="true" toc="default">
<name>JWT Format and Processing Requirements</name>
<t>The concept behind URI Signing is based on embedding a signed <xref target="RFC7519" format="default">JSON Web Token (JWT)</xref>
in an <xref target="RFC7230" format="default">HTTP or HTTPS URI</xref> (see <xref target="RFC7230" sectionFormat="of" section="2.7"/>). The signed JWT contains a number of
claims that can be verified to ensure the UA has legitimate access to the content.</t>
<t>This document specifies the following attribute for embedding a signed JWT in a Target CDN URI or Redirection URI:</t>
<dl>
<dt>URI Signing Package (URISigningPackage):
</dt>
<dd>The URI attribute that encapsulates all the URI Signing claims in
a signed JWT encoded format. This attribute is exposed in the Signed
URI as a path-style parameter or a form-style parameter.
</dd>
</dl>
<t>The parameter name of the URI Signing Package Attribute is
defined in the <xref target="metadata" format="default">CDNI Metadata</xref>. If the CDNI Metadata interface
is not used, or does not include a parameter name for the URI Signing
Package Attribute, the parameter name can be set by configuration (out of
scope of this document).</t>
<t>The URI Signing Package will be found by parsing any path-style parameters and
form-style parameters looking for a key name matching the URI Signing Package Attribute.
Both parameter styles <bcp14>MUST</bcp14> be supported to allow flexibility of operation.
The first matching parameter <bcp14>SHOULD</bcp14> be taken to provide the signed JWT, though providing
more than one matching key is undefined behavior. Path-style parameters generated in the
form indicated by <xref target="RFC6570" sectionFormat="of" section="3.2.7" format="default"/> and
Form-style parameters generated in the form indicated by Sections <xref target="RFC6570" section="3.2.8" sectionFormat="bare"/> and <xref target="RFC6570" sectionFormat="bare" section="3.2.9"/> of
<xref target="RFC6570" format="default"/> <bcp14>MUST</bcp14> be supported.</t>
<t>The following is an example where the URI Signing Package Attribute name is "token" and the signed JWT is "SIGNEDJWT":</t>
<sourcecode type=""><![CDATA[http://example.com/media/path?come=data&token=SIGNEDJWT&other=data]]></sourcecode>
<!-- [rfced] Please let us know if a "type" attribute may be added to the
sourcecode elements in this document. The allowed types can be found
here: https://www.rfc-editor.org/materials/sourcecode-types.txt
Note that it is acceptable to leave the type attribute empty.
-->
<section anchor="jwt_claims" numbered="true" toc="default">
<name>JWT Claims</name>
<t>This section identifies the set of claims that can be
used to enforce the CSP distribution policy. New claims can be introduced in the future to extend the
distribution policy capabilities.</t>
<t>In order to provide distribution policy flexibility,
the exact subset of claims used in a given signed JWT is a runtime decision.
Claim requirements are defined in the <xref target="metadata" format="default">CDNI Metadata</xref>.
If the CDNI Metadata interface is not used, or
does not include claim requirements, the claim requirements
can be set by configuration (out of scope of this document).</t>
<t>The following claims (where the "JSON Web Token Claims" registry
claim name is specified in parentheses below) are used to enforce the
distribution policies. All of the listed claims are mandatory
to implement in a URI Signing implementation but are not necessarily
mandatory to use in a given signed JWT. (The "optional" and
"mandatory" identifiers in square brackets refer to whether or
not a given claim <bcp14>MUST</bcp14> be present in a URI Signing JWT.)</t>
<t>Note: The time on the entities that generate and
verify the signed URI <bcp14>MUST</bcp14> be in sync. In the CDNI case, this
means that CSP, uCDN, and dCDN servers need to be
time synchronized. It is <bcp14>RECOMMENDED</bcp14> to use
<xref target="RFC5905" format="default">NTP</xref> for time synchronization.</t>
<t>Note: See the <xref target="security" format="default">Security
Considerations</xref> on the limitations of using an
expiration time and Client IP address for distribution policy
enforcement.</t>
<section anchor="iss_claim" numbered="true" toc="default">
<name>Issuer (iss) Claim</name>
<t>Issuer (iss) [optional] - The semantics in
<xref target="RFC7519" sectionFormat="of" section="4.1.1" format="default"/> <bcp14>MUST</bcp14> be followed.
If this claim is used, it <bcp14>MUST</bcp14> be used to identify the
issuer (signer) of the JWT. In particular, the recipient will 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 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 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 used to sign the JWT, the CDN <bcp14>MUST</bcp14> reject the request. If the
received signed JWT contains an Issuer claim, then any
JWT subsequently generated for CDNI redirection <bcp14>MUST</bcp14> also contain an Issuer
claim, and the Issuer value <bcp14>MUST</bcp14> be updated to identify the
redirecting CDN. If the received signed JWT does not
contain an Issuer claim, an Issuer claim <bcp14>MAY</bcp14> be added to
a signed JWT generated for CDNI redirection.</t>
</section>
<section anchor="sub_claim" numbered="true" toc="default">
<name>Subject (sub) Claim</name>
<t>Subject (sub) [optional] - The semantics in <xref target="RFC7519" sectionFormat="of" section="4.1.2" format="default"/> <bcp14>MUST</bcp14> be followed.
If this claim is used, it <bcp14>MUST</bcp14> be a JSON Web Encryption (<xref target="RFC7516" format="default">JWE</xref>)
Object in compact serialization form, because it contains
personally identifiable information. This claim contains
information about the Subject (for example, a user or an agent)
that <bcp14>MAY</bcp14> be used to verify the signed JWT.
If the received signed JWT contains a Subject claim, then any
JWT subsequently generated for CDNI redirection <bcp14>MUST</bcp14> also
contain a Subject claim, and the Subject value <bcp14>MUST</bcp14> be the same
as in the received signed JWT. A signed JWT generated for CDNI
redirection <bcp14>MUST NOT</bcp14> add a Subject claim if no Subject claim
existed in the received signed JWT.</t>
</section>
<section anchor="aud_claim" numbered="true" toc="default">
<name>Audience (aud) Claim</name>
<t>Audience (aud) [optional] - The semantics in <xref target="RFC7519"
sectionFormat="of" section="4.1.3" format="default"/> <bcp14>MUST</bcp14> be followed.
This claim is used to ensure that the CDN verifying the JWT is an intended recipient
of the request. The claim <bcp14>MUST</bcp14>
contain an identity belonging to the chain of entities involved in
processing the request (e.g., identifying the CSP or any CDN in the chain)
that the recipient is configured to use for the processing of this request.
A CDN <bcp14>MAY</bcp14> modify the claim as long it can generate a valid signature.</t>
</section>
<section anchor="exp_claim" numbered="true" toc="default">
<name>Expiry Time (exp) Claim</name>
<t>Expiry Time (exp) [optional] - The semantics in <xref
target="RFC7519" sectionFormat="of" section="4.1.4"
format="default"/> <bcp14>MUST</bcp14> be followed,
though URI Signing implementations <bcp14>MUST NOT</bcp14> allow for
any time-synchronization "leeway". If this claim is used and the
CDN verifying the signed JWT does not support Expiry Time
verification, or if the Expiry Time in the signed JWT corresponds to
a time equal to or earlier than the time of the content request, the
CDN <bcp14>MUST</bcp14> reject the request. If the received signed
JWT contains an Expiry Time claim, then any JWT subsequently
generated for CDNI redirection <bcp14>MUST</bcp14> also contain an
Expiry Time claim, and the Expiry Time value <bcp14>MUST</bcp14> be
the same as in the received signed JWT. A signed JWT generated for
CDNI redirection <bcp14>MUST NOT</bcp14> add an Expiry Time claim if
no Expiry Time claim existed in the received signed JWT.</t>
</section>
<section anchor="nbf_claim" numbered="true" toc="default">
<name>Not Before (nbf) Claim</name>
<t>Not Before (nbf) [optional] - The semantics in <xref target="RFC7519"
sectionFormat="of" section="4.1.5" format="default"/> <bcp14>MUST</bcp14> be followed,
though URI Signing implementations <bcp14>MUST NOT</bcp14> allow for any time-synchronization "leeway".
If this claim is used and the CDN verifying the signed JWT does not support
Not Before 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 CDN <bcp14>MUST</bcp14> reject the
request.
If the received signed JWT contains a Not Before time claim, then any
JWT subsequently generated for CDNI redirection <bcp14>MUST</bcp14> also
contain a Not Before time claim, and the Not Before time value <bcp14>MUST</bcp14> be
the same as in the received signed JWT. A signed JWT
generated for CDNI redirection <bcp14>MUST NOT</bcp14> add a Not Before time
claim if no Not Before time claim existed in the received
signed JWT.</t>
</section>
<section anchor="iat_claim" numbered="true" toc="default">
<name>Issued At (iat) Claim</name>
<t>Issued At (iat) [optional] - The semantics in <xref target="RFC7519"
sectionFormat="of" section="4.1.6" format="default"/> <bcp14>MUST</bcp14> be followed.
If the received signed JWT contains an Issued At claim, then any
JWT subsequently generated for CDNI redirection <bcp14>MUST</bcp14> also contain an Issued At
claim, and the Issued At value <bcp14>MUST</bcp14> be updated to identify the
time the new JWT was generated. If the received signed
JWT does not contain an Issued At claim, an Issued At
claim <bcp14>MAY</bcp14> be added to a signed JWT generated for CDNI redirection.</t>
</section>
<section anchor="jti_claim" numbered="true" toc="default">
<name>JWT ID (jti) Claim</name>
<t>JWT ID (jti) [optional] - The semantics in <xref target="RFC7519"
sectionFormat="of" section="4.1.7" format="default"/> <bcp14>MUST</bcp14> 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
that 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 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 <bcp14>MUST</bcp14> reject the request.
If the received signed JWT contains a JWT ID claim, then any
JWT subsequently generated for CDNI redirection <bcp14>MUST</bcp14> also
contain a JWT ID claim, and the value <bcp14>MUST</bcp14> be the
same as in the received signed JWT.
If the received signed JWT does not contain a
JWT ID claim, a JWT ID claim <bcp14>MUST NOT</bcp14> be added to a signed JWT
generated for CDNI redirection. Sizing of the JWT ID is application
dependent given the desired security constraints.</t>
</section>
<section anchor="cdniv_claim" numbered="true" toc="default">
<name>CDNI Claim Set Version (cdniv) Claim</name>
<t>CDNI Claim Set Version (cdniv) [optional] - The CDNI Claim Set 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 is intended to allow changes in and facilitate
upgrades across specifications. The type is a JSON integer and the value <bcp14>MUST</bcp14> be set to "1"
for this version of the specification. In the absence of this claim, the value is assumed
to be "1". For future versions, this claim will be mandatory. Implementations <bcp14>MUST</bcp14> reject
signed JWTs with unsupported CDNI Claim Set versions.</t>
</section>
<section anchor="cdnicrit_claim" numbered="true" toc="default">
<name>CDNI Critical Claims Set (cdnicrit) Claim</name>
<t>CDNI Critical Claims Set (cdnicrit) [optional] - The CDNI Critical Claims Set (cdnicrit) claim
indicates that extensions to this specification are being used that
<bcp14>MUST</bcp14> be understood and processed. 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 not understood
and supported by the recipient, then the Signed JWT <bcp14>MUST</bcp14> be rejected. Producers
<bcp14>MUST NOT</bcp14> include claim names defined by this specification, duplicate names, or names that do not
occur as claim names within the Signed JWT in the cdnicrit
list. Producers <bcp14>MUST NOT</bcp14> use the empty list "" as the cdnicrit
value. Recipients <bcp14>MAY</bcp14> consider the Signed JWT to be invalid if the cdnicrit
list contains any claim names defined by this
specification or if any other constraints
on its use are violated. This claim <bcp14>MUST</bcp14> be understood and processed by all implementations.</t>
</section>
<section anchor="cdniip_claim" numbered="true" toc="default">
<name>Client IP Address (cdniip) Claim</name>
<t>Client IP Address (cdniip) [optional] - The Client IP Address (cdniip) claim holds an IP address or IP prefix for
which the Signed URI is valid. This is represented in CIDR
notation with dotted decimal format for <xref target="RFC0791" format="default">IPv4 addresses</xref> or canonical text
representation for <xref target="RFC5952" format="default">IPv6 addresses</xref>.
The request <bcp14>MUST</bcp14> be rejected if sourced from a client outside the
specified IP range. Since the Client IP is considered
personally identifiable information, this field
<bcp14>MUST</bcp14> be a JSON Web Encryption (<xref target="RFC7516" format="default">JWE</xref>)
Object in compact serialization form. If the CDN verifying the
signed JWT does not support Client IP verification, or if the
Client IP in the signed JWT does not match the source IP
address in the content request, the CDN <bcp14>MUST</bcp14>
reject the request. The type of this claim is a JSON string that
contains the JWE.
If the received signed JWT contains a Client IP claim, then any
JWT subsequently generated for CDNI redirection <bcp14>MUST</bcp14> also
contain a Client IP claim, and the Client IP value <bcp14>MUST</bcp14> be
the same as in the received signed JWT. A signed JWT
generated for CDNI redirection <bcp14>MUST NOT</bcp14> add a Client IP
claim if no Client IP claim existed in the received
signed JWT.</t>
<t>It should be noted that use of this claim can cause issues, for example,
in situations with dual-stack IPv4 and IPv6 networks, MPTCP, QUIC, and
mobile clients switching from Wi-Fi to Cellular networks where the client's
source address can change, even between address families. This claim exists
mainly for legacy feature parity 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 internal preview of an asset where the end consumer understands
that they must be originated from the same IP for the entirety of the session.
Using this claim at large is <bcp14>NOT RECOMMENDED</bcp14>.</t>
</section>
<section anchor="cdniuc_claim" numbered="true" toc="default">
<name>CDNI URI Container (cdniuc) Claim</name>
<t>URI Container (cdniuc) [mandatory] - The URI Container (cdniuc)
holds the URI representation before a URI Signing Package is
added. This representation can take one of several forms detailed in
<xref target="uri_container_forms" format="default"/>. If the URI Container used in the signed
JWT does not match the URI of the content request, the CDN verifying the
signed JWT <bcp14>MUST</bcp14> reject the request. When comparing the URI, the percent encoded
form as defined in <xref target="RFC3986" sectionFormat="of" section="2.1" format="default"/> <bcp14>MUST</bcp14> be used. When
redirecting a URI, the CDN generating the new signed JWT <bcp14>MAY</bcp14> change the URI
Container to comport with the URI being used in the redirection.</t>
</section>
<section anchor="cdniets_claim" numbered="true" toc="default">
<name>CDNI Expiration Time Setting (cdniets) Claim</name>
<t>CDNI Expiration Time Setting (cdniets) [optional] - The CDNI Expiration
Time Setting (cdniets) claim provides a means for setting the value
of the Expiry Time (exp) claim when generating a subsequent 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 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 (cdniets) <bcp14>SHOULD NOT</bcp14> be used when not using Signed Token Renewal
and <bcp14>MUST</bcp14> be present when using Signed Token Renewal.</t>
</section>
<section anchor="cdnistt_claim" numbered="true" toc="default">
<name>CDNI Signed Token Transport (cdnistt) Claim</name>
<t>CDNI Signed Token Transport (cdnistt) [optional] - The CDNI Signed Token Transport (cdnistt) claim
provides a means of signaling the 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 type is a JSON integer.
Values for this claim are defined in <xref target="sec.IANA.cdnistt" format="default"/>. If using
this claim, you <bcp14>MUST</bcp14> also specify a CDNI Expiration Time Setting (cdniets) as noted above.</t>
</section>
<section anchor="cdnistd_claim" numbered="true" toc="default">
<name>CDNI Signed Token Depth (cdnistd) Claim</name>
<t>CDNI Signed Token Depth (cdnistd) [optional] - The CDNI Signed Token Depth (cdnistd) claim is used to
associate a subsequent signed JWT, generated as the result of a CDNI Signed Token Transport claim,
with a specific URI subset. Its type is a JSON integer. Signed JWTs <bcp14>MUST NOT</bcp14> use a negative
value for the CDNI Signed Token Depth claim.</t>
<t>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 Cookie Path as described in <xref target="RFC6265" sectionFormat="of" section="4.1.2.4" format="default"/>),
the CDNI Signed Token Depth value is the number of path segments that should be
considered significant for this association. A CDNI Signed Token Depth of zero means that the
client <bcp14>SHOULD</bcp14> be directed to return the token with requests for any path. If the CDNI Signed
Token Depth is greater than zero, then the CDN <bcp14>SHOULD</bcp14> send the client a token to return for
future requests wherein the first CDNI Signed Token Depth segments of the path match the first
CDNI Signed Token Depth segments of the signed URI path. This matching <bcp14>MUST</bcp14> use the URI with the
token removed, as specified in <xref target="uri_container_forms" format="default"/>.</t>
<t>If the URI path to match contains fewer segments than the CDNI Signed Token Depth claim, a signed JWT
<bcp14>MUST NOT</bcp14> be generated for the 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. If the received signed JWT
contains a CDNI Signed Token Depth claim, then any JWT subsequently generated for CDNI
redirection or Signed Token Transport <bcp14>MUST</bcp14> also contain a CDNI Signed Token Depth claim, and the
value <bcp14>MUST</bcp14> be the same as in the received signed JWT.</t>
</section>
<section anchor="uri_container_forms" numbered="true" toc="default">
<name>URI Container Forms</name>
<t>The URI Container (cdniuc) claim takes one of the following forms: 'hash:' or 'regex:'. More forms may be added in the future to extend the capabilities.</t>
<t>Before comparing a URI with contents of this container, the following steps <bcp14>MUST</bcp14> be performed:
</t>
<ul spacing="normal">
<li>Prior to verification, remove the signed JWT from the
URI. This removal is only for the purpose of determining if the
URI matches; all other purposes will use the original URI. If the
signed JWT is terminated by anything other than a sub-delimiter
(as defined in <xref target="RFC3986" section="2.2"
sectionFormat="of" format="default"/>), everything from the
reserved character (as defined in <xref target="RFC3986"
section="2.2"/>) that precedes the URI Signing Package Attribute to the last character of the signed
JWT will be removed, inclusive. Otherwise, everything from the first character of the
URI Signing Package Attribute to the sub-delimiter that terminates the signed
JWT will be removed, inclusive.</li>
<li>Normalize the URI according to <xref target="RFC7230" sectionFormat="of" section="2.7.3" format="default"/> and Sections
<xref target="RFC3986" section="6.2.2" sectionFormat="bare"/> and <xref target="RFC3986" section="6.2.3" sectionFormat="bare"/> of
<xref target="RFC3986" format="default"/>. This applies to both generation
and verification of the signed JWT.</li>
</ul>
<section anchor="uri_container_forms_hash" numbered="true" toc="default">
<name>URI Hash Container (hash:)</name>
<t>Prefixed with 'hash:', this string is a URL Segment form (<xref target="RFC6920" section="5" sectionFormat="of" format="default"/>) of the URI.</t>
</section>
<section anchor="uri_container_forms_regex" numbered="true" toc="default">
<name>URI Regular Expression Container (regex:)</name>
<t>Prefixed with 'regex:', this string is any regular expression compatible with POSIX (Section 9 of <xref
target="POSIX.1" format="default"/>) Extended Regular
Expression used to match against the
requested URI. These regular expressions <bcp14>MUST</bcp14> be
evaluated in the POSIX locale (Section 7.2 of <xref target="POSIX.1"
format="default"/>).
</t>
<t>Note: Because '\' has special meaning in JSON <xref target="RFC8259" format="default"/> as the escape character within JSON strings, the regular expression character '\' <bcp14>MUST</bcp14> be escaped as '\\'.</t>
<t>An example of a 'regex:' is the following:</t>
<!-- [rfced] The following line in Section 2.1.15.2 exceeds the maximum
69-character width (for sourcecode) by one character. Is it possible to place
a line break in this line? Also, please let us know if you would like text
to be added, e.g.,
"An example of a 'regex:' is the following (with a line break added for display
purposes only):"
Original:
[^:]*\\://[^/]*/folder/content/quality_[^/]*/segment.{3}\\.mp4(\\?.*)?
-->
<sourcecode><![CDATA[
[^:]*\\://[^/]*/folder/content/quality_[^/]*/segment.{3}\\.mp4(\\?.*)?
]]></sourcecode>
<t>Note: Due to computational complexity of executing arbitrary regular expressions, it is <bcp14>RECOMMENDED</bcp14> to only execute after verifying the JWT to ensure its authenticity.</t>
</section>
</section>
</section>
<section anchor="jwt_header" numbered="true" toc="default">
<name>JWT Header</name>
<t>The header of the JWT <bcp14>MAY</bcp14> be passed via the CDNI Metadata interface instead of
being included in the URISigningPackage. The header value <bcp14>MUST</bcp14> be transmitted in
the serialized encoded form and prepended to the JWT payload and signature passed in
the URISigningPackage prior to verification. This reduces the size of the signed JWT
token.</t>
</section>
</section>
<section anchor="uri_signing_token_renewal" numbered="true" toc="default">
<name>URI Signing Token Renewal</name>
<section anchor="token_renewal_intro" numbered="true" toc="default">
<name>Overview</name>
<t>For content that is delivered via HTTP in a segmented fashion,
such as <xref target="MPEG-DASH" format="default">MPEG-DASH</xref> or <xref target="RFC8216" format="default"> HTTP Live Streaming (HLS)</xref>,
special provisions need to be made in order to ensure URI Signing can be
applied. In general, segmented protocols work by breaking large objects
(e.g., videos) into a sequence of small independent segments. Such segments
are then referenced by a separate manifest file, which either includes
a list of URLs to the segments or specifies an algorithm through which
a User Agent can construct the URLs to the segments. Requests for segments
therefore originate from 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 a vulnerability to malicious User Agents sharing the
manifest file and deep linking to the segments.</t>
<t>One method for dealing with this vulnerability would be to include, in
the manifest itself, Signed URIs that point to the individual segments.
There exist a number of issues with that approach. First, 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 the exact segmentation protocol
used. Secondly, it could also require the expiration time of the
Signed URIs to be valid for an 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 contain a segmented video stream of more than 30 minutes in length,
Signed URIs would require to be valid for at least 30 minutes, thereby reducing
their effectiveness and that of the URI Signing mechanism in general.
For a more detailed analysis of how segmented protocols such as HTTP Adaptive Streaming protocols affect CDNI,
see <xref target="RFC6983" format="default">Models for HTTP-Adaptive-Streaming-Aware Content Distribution Network Interconnection (CDNI)</xref>.</t>
<t>The method described in this section allows CDNs to use URI Signing
for segmented content without
having to include the Signed URIs in the manifest files themselves.</t>
</section>
<section anchor="uri_signing_mechanism" numbered="true" toc="default">
<name>Signed Token Renewal Mechanism</name>
<t>In order to allow for effective access control of segmented content, the
URI Signing mechanism defined in this section is based on a method
through which subsequent segment requests can be linked 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 request. More specifically,
whenever a UA successfully retrieves a segment, it receives, in the
HTTP 2xx Successful message, a signed 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 is generated, the model is not
broken, and the User Agent can successfully retrieve additional segments.
Given the fact that with segmented protocols it is usually not possible to
determine a priori which segment will be requested next (i.e., to allow for
seeking within the content and for switching to a different representation),
the Signed Token Renewal uses the
URI Regular Expression Container scoping mechanisms in the URI Container
(cdniuc) claim to allow a signed JWT to be valid for more than one URL.</t>
<t>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 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 this document.
However, in order to also support legacy UAs that do not include any
specific provisions for the handling of signed JWTs, <xref target="communicating_token" format="default"/>
defines a mechanism using HTTP Cookies <xref target="RFC6265" format="default"/> that allows such UAs to support
the concept of renewing signed JWTs without requiring any additional UA support.</t>
<section numbered="true" toc="default">
<name>Required Claims</name>
<t>The <xref target="cdnistt_claim" format="default">cdnistt claim</xref> and <xref target="cdniets_claim" format="default">cdniets claim</xref>
<bcp14>MUST</bcp14> both be present for Signed Token Renewal. cdnistt <bcp14>MAY</bcp14> be set to
a value of '0' to mean no Signed Token Renewal, but there still <bcp14>MUST</bcp14> be a corresponding cdniets that verifies as
a JSON number. However, if use of Signed Token Renewal is not desired, it is <bcp14>RECOMMENDED</bcp14> to simply omit both.</t>
</section>
</section>
<section anchor="communicating_token" numbered="true" toc="default">
<name>Communicating a Signed JWTs in Signed Token Renewal</name>
<!--[rfced] Should the 's' be removed in this section title?
In other words, was singular or plural intended?
Current:
3.3. Communicating a Signed JWTs in Signed Token Renewal
Perhaps (singular):
3.3. Communicating a Signed JWT in Signed Token Renewal
Or (plural):
3.3. Communicating Signed JWTs in Signed Token Renewal
-->
<t>This section assumes the value of the CDNI Signed Token Transport (cdnistt) claim
has been set to 1.</t>
<t>When using the Signed Token Renewal mechanism, the signed JWT is
transported to the UA via a 'URISigningPackage' cookie added to the
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
redirected to a different server.</t>
<section numbered="true" toc="default">
<name>Support for Cross-Domain Redirection</name>
<t>For security purposes, the use of cross-domain cookies is not supported
in some application environments. As a result, the Cookie-based
method for transport of the Signed Token described in <xref target="communicating_token" format="default"/>
might break if used in combination with an HTTP 3xx Redirection
response where the target URL is in a different domain. In such
scenarios, Signed Token Renewal of a signed JWT <bcp14>SHOULD</bcp14> be communicated
via the query string instead, in a similar fashion to how regular
signed JWTs (outside of Signed Token Renewal) are communicated. Note
the value of the CDNI Signed Token Transport (cdnistt) claim
<bcp14>MUST</bcp14> be set to 2.</t>
<t>Note that the process described herein only works in cases where both the manifest
file and segments constituting the segmented content are delivered from
the same domain. In other words, any redirection between different domains needs to be
carried out while retrieving the manifest file.</t>
</section>
</section>
</section>
<section anchor="cdni_interfaces" numbered="true" toc="default">
<name>Relationship with CDNI Interfaces</name>
<t>Some of the CDNI Interfaces need enhancements to support URI Signing.
A dCDN that supports URI Signing needs to be
able to advertise this capability to the uCDN. The uCDN
needs to select a dCDN based on such capability when the CSP
requires access control to enforce its distribution policy via URI
Signing. Also, the uCDN needs to be able to distribute via the
CDNI Metadata interface the information necessary to allow the
dCDN to verify a Signed URI. Events that pertain to URI
Signing (e.g., request denial or delivery after an access authorization decision has been made)
need to be included in the logs communicated through the CDNI Logging
interface.</t>
<section anchor="control" numbered="true" toc="default">
<name>CDNI Control Interface</name>
<t>URI Signing has no impact on this interface.</t>
</section>
<section anchor="advertisement" numbered="true" toc="default">
<name>CDNI Footprint & Capabilities Advertisement Interface</name>
<t>The CDNI Request Routing: Footprint and Capabilities
Semantics document <xref target="RFC8008" format="default"/> defines support for
advertising CDNI Metadata capabilities via CDNI Payload
Type. The CDNI Payload Type registered in <xref target="sec.IANA.payload" format="default"/>
can be used for capability advertisement.</t>
</section>
<section anchor="redirection" numbered="true" toc="default">
<name>CDNI Request Routing Redirection Interface</name>
<t>The <xref target="RFC7975" format="default">CDNI Request Routing
Redirection Interface</xref> describes the recursive request
redirection method. For URI Signing, the uCDN signs the URI
provided by the dCDN. URI Signing therefore has no impact
on this interface.</t>
</section>
<section anchor="metadata" numbered="true" toc="default">
<name>CDNI Metadata Interface</name>
<t>The <xref target="RFC8006" format="default">CDNI Metadata
Interface</xref> describes the CDNI Metadata distribution needed to
enable content acquisition and delivery. For URI Signing, a new
CDNI Metadata object is specified.</t>
<t>The UriSigning Metadata object contains information to enable URI
Signing and verification by a dCDN. The UriSigning properties are
defined below.</t>
<ul empty="true" spacing="normal">
<li>
<t>Property: enforce</t>
<ul empty="true" spacing="normal">
<li>
<dl>
<dt>Description:
</dt>
<dd>URI Signing enforcement flag. Specifically, this flag indicates if the access to content is subject to URI Signing. URI Signing requires the dCDN to ensure that the URI is signed and verified before delivering content. Otherwise, the dCDN does not perform verification, regardless of whether or not the URI is signed.
</dd>
<dt>Type:
</dt>
<dd>Boolean
</dd>
<dt>Mandatory-to-Specify:
</dt>
<dd>No. The default is true.
</dd>
</dl>
</li>
</ul>
</li>
<li>
<t>Property: issuers</t>
<ul empty="true" spacing="normal">
<li>
<dl>
<dt>Description:
</dt>
<dd>A list of valid Issuers against which
the Issuer claim in the signed JWT may be cross-referenced.
</dd>
<dt>Type:
</dt>
<dd>Array of Strings
</dd>
<dt>Mandatory-to-Specify:
</dt>
<dd>No. The default is an empty list. An empty list means that any Issuer in
the trusted key store of issuers is acceptable.
</dd>
</dl>
</li>
</ul>
</li>
<li>
<t>Property: package-attribute</t>
<ul empty="true" spacing="normal">
<li>
<dl>
<dt>Description:
</dt>
<dd>The attribute name to use for the URI Signing
Package.
</dd>
<dt>
Type:
</dt>
<dd>String</dd>
<dt>Mandatory-to-Specify:</dt>
<dd>No. The default is
"URISigningPackage".</dd>
</dl>
</li>
</ul>
</li>
<li>
<t>Property: jwt-header</t>
<ul empty="true" spacing="normal">
<li>
<dl>
<dt>Description:
</dt>
<dd>The header part of JWT that is used for verifying a signed
JWT when the JWT token in the URI Signing Package does not
contain a header part.
</dd>
<dt>Type:
</dt>
<dd>String
</dd>
<dt>Mandatory-to-Specify:
</dt>
<dd>No. By default, the header is assumed to be included
in the JWT token.
</dd>
</dl>
</li>
</ul>
</li>
</ul>
<t>The following is an example of a URI Signing metadata payload with all default values:</t>
<sourcecode><![CDATA[
{
"generic-metadata-type": "MI.UriSigning"
"generic-metadata-value": {}
}
]]></sourcecode>
<t>The following is an example of a URI Signing metadata payload with explicit values:</t>
<sourcecode><![CDATA[
{
"generic-metadata-type": "MI.UriSigning"
"generic-metadata-value":
{
"enforce": true,
"issuers": ["csp", "ucdn1", "ucdn2"],
"package-attribute": "usp",
"jwt-header":
{
"alg": "ES256",
"kid": "P5UpOv0eMq1wcxLf7WxIg09JdSYGYFDOWkldueaImf0"
}
}
}
]]></sourcecode>
</section>
<section anchor="logging" numbered="true" toc="default">
<name>CDNI Logging Interface</name>
<t>For URI Signing, the dCDN reports that enforcement of the
access control was applied to the request for content delivery. When
the request is denied due to enforcement of URI Signing, the reason is
logged.</t>
<t>The following CDNI Logging field for URI Signing <bcp14>SHOULD</bcp14> be
supported in the HTTP Request Logging Record as specified in "<xref target="RFC7937" format="title"/>" <xref target="RFC7937"/>
using the new "cdni_http_request_v2" record-type registered in
<xref target="sec.IANA.record_type.cdni_http_request_v2" format="default"/>.</t>
<ul spacing="normal">
<li>
<t>s-uri-signing (mandatory): </t>
<dl>
<dt>Format:
</dt>
<dd>3DIGIT
</dd>
<dt>Field value:
</dt>
<dd>this characterizes the URI Signing verification performed by
the Surrogate on the request. The allowed values are registered
in <xref target="sec.IANA.field.s-uri-signing.values"