| rfc9213.original.xml | rfc9213.xml | |||
|---|---|---|---|---|
| <?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE rfc [ | <!DOCTYPE rfc [ | |||
| <!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
| <!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
| <!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
| <!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
| ]> | ]> | |||
| <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | |||
| <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.24 --> | -ietf-httpbis-targeted-cache-control-04" number="9213" submissionType="IETF" cat | |||
| <?rfc tocindent="yes"?> | egory="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" ob | |||
| <?rfc strict="yes"?> | soletes="" updates="" xml:lang="en" version="3"> | |||
| <?rfc compact="yes"?> | ||||
| <?rfc comments="yes"?> | ||||
| <?rfc inline="yes"?> | ||||
| <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | ||||
| -ietf-httpbis-targeted-cache-control-04" category="std" consensus="true" tocIncl | ||||
| ude="true" sortRefs="true" symRefs="true" obsoletes="" updates="" submissionType | ||||
| ="IETF" xml:lang="en" version="3"> | ||||
| <!-- xml2rfc v2v3 conversion 3.12.0 --> | ||||
| <front> | <front> | |||
| <title>Targeted HTTP Cache Control</title> | <title abbrev="Targeted HTTP Cache Control">Targeted HTTP Cache Control</tit | |||
| <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-targeted-cache-c | le> | |||
| ontrol-04"/> | <seriesInfo name="RFC" value="9213"/> | |||
| <author initials="S." surname="Ludin" fullname="Stephen Ludin"> | <author initials="S." surname="Ludin" fullname="Stephen Ludin"> | |||
| <organization>Akamai</organization> | <organization>Akamai</organization> | |||
| <address> | <address> | |||
| <email>sludin@ludin.org</email> | <email>sludin@ludin.org</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="M." surname="Nottingham" fullname="Mark Nottingham"> | <author initials="M." surname="Nottingham" fullname="Mark Nottingham"> | |||
| <organization>Fastly</organization> | <organization>Fastly</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| skipping to change at line 43 ¶ | skipping to change at line 35 ¶ | |||
| <email>mnot@mnot.net</email> | <email>mnot@mnot.net</email> | |||
| <uri>https://www.mnot.net/</uri> | <uri>https://www.mnot.net/</uri> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="Y." surname="Wu" fullname="Yuchen Wu"> | <author initials="Y." surname="Wu" fullname="Yuchen Wu"> | |||
| <organization>Cloudflare</organization> | <organization>Cloudflare</organization> | |||
| <address> | <address> | |||
| <email>me@yuchenwu.net</email> | <email>me@yuchenwu.net</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date/> | <date year="2022" month="June" /> | |||
| <area>Applications and Real-Time</area> | <area>Applications and Real-Time</area> | |||
| <workgroup>HTTP</workgroup> | <workgroup>HTTP</workgroup> | |||
| <keyword>CDN</keyword> | <keyword>CDN</keyword> | |||
| <keyword>Content Delivery Network</keyword> | <keyword>Content Delivery Network</keyword> | |||
| <keyword>Caching</keyword> | <keyword>Caching</keyword> | |||
| <abstract> | <abstract> | |||
| <t>This specification defines a convention for HTTP response header fields | ||||
| that allow cache directives to be targeted at specific caches or classes of cac | <t> | |||
| hes. It also defines one such header field, targeted at Content Delivery Network | This specification defines a convention for HTTP response header fields that all | |||
| (CDN) caches.</t> | ow cache directives to be targeted at specific caches or classes of caches. It a | |||
| lso defines one such header field, the CDN-Cache-Control response header field, | ||||
| which is targeted at content delivery network (CDN) caches. | ||||
| </t> | ||||
| </abstract> | </abstract> | |||
| <note removeInRFC="true"> | ||||
| <name>About This Document</name> | ||||
| <t> | ||||
| Status information for this document may be found at <eref target="https | ||||
| ://datatracker.ietf.org/doc/draft-ietf-httpbis-targeted-cache-control/"/>. | ||||
| </t> | ||||
| <t> | ||||
| Discussion of this document takes place on the | ||||
| HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.or | ||||
| g"/>), | ||||
| which is archived at <eref target="https://lists.w3.org/Archives/Public/ | ||||
| ietf-http-wg/"/>. | ||||
| Working Group information can be found at <eref target="https://httpwg.o | ||||
| rg/"/>. | ||||
| </t> | ||||
| <t>Source for this draft and an issue tracker can be found at | ||||
| <eref target="https://github.com/httpwg/http-extensions/labels/targeted- | ||||
| cc"/>.</t> | ||||
| </note> | ||||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="introduction" numbered="true" toc="default"> | <section anchor="introduction" numbered="true" toc="default"> | |||
| <name>Introduction</name> | <name>Introduction</name> | |||
| <t>Modern deployments of HTTP often use multiple layers of caching. For ex | <t>Modern deployments of HTTP often use multiple layers of caching. For ex | |||
| ample, a website might use a cache on the origin server itself; it might deploy | ample, a website might use a cache on the origin server itself; it might deploy | |||
| a caching layer in the same network as the origin server, it might use one or mo | a caching layer in the same network as the origin server, it might use one or mo | |||
| re Content Delivery Networks (CDNs) that are distributed throughout the Internet | re CDNs that are distributed throughout the Internet, and it might benefit from | |||
| , and it might benefit from browser caching as well.</t> | browser caching as well.</t> | |||
| <t>Because it is often desirable to control these different classes of cac | ||||
| hes separately, some means of targeting cache directives at them is necessary. F | <t>Because it is often desirable to control these different classes of cac | |||
| or example, if a publisher has a mechanism to invalidate the contents of a cache | hes separately, some means of targeting cache directives at them is necessary. F | |||
| that it has a relationship with (such as a CDN cache), they might be more comfo | or example, if a publisher has a mechanism to invalidate the contents of a cache | |||
| rtable assigning a more generous caching policy to it, while still wanting to re | that it has a relationship with (such as a CDN cache), they might be more comfo | |||
| strict the behavior of other caches.</t> | rtable assigning a more generous caching policy to it while still wanting to res | |||
| <t>The HTTP Cache-Control response header field (defined in <xref section= | trict the behavior of other caches.</t> | |||
| "5.2" sectionFormat="of" target="HTTP-CACHING" format="default"/>) is widely use | <t>The HTTP Cache-Control response header field (defined in <xref section= | |||
| d to direct caching behavior. However, it is relatively undifferentiated; while | "5.2" sectionFormat="of" target="HTTP-CACHING" format="default"/>) is widely use | |||
| some cache directives (e.g., s-maxage) are targeted at a specific class of cache | d to direct caching behavior. However, it is relatively undifferentiated; while | |||
| s (for s-maxage, shared caches), targeting is not consistently available across | some cache directives (e.g., s-maxage) are targeted at a specific class of cache | |||
| all existing cache directives (e.g., stale-while-revalidate). This is problemati | s (for s-maxage, shared caches), targeting is not consistently available across | |||
| c, especially as the number of caching extensions grows, along with the number o | all existing cache directives (e.g., stale-while-revalidate). This is problemati | |||
| f potential targets.</t> | c especially as the number of caching extensions grows along with the number of | |||
| potential targets.</t> | ||||
| <t>Some implementations have defined ad hoc control mechanisms to overcome this issue, but their interoperability is low. <xref target="targeted" format=" default"/> defines a standard framework for targeted cache control using HTTP re sponse headers, and <xref target="cdn-cache-control" format="default"/> defines one such header: the CDN-Cache-Control response header field.</t> | <t>Some implementations have defined ad hoc control mechanisms to overcome this issue, but their interoperability is low. <xref target="targeted" format=" default"/> defines a standard framework for targeted cache control using HTTP re sponse headers, and <xref target="cdn-cache-control" format="default"/> defines one such header: the CDN-Cache-Control response header field.</t> | |||
| <section anchor="notational-conventions" numbered="true" toc="default"> | <section anchor="notational-conventions" numbered="true" toc="default"> | |||
| <name>Notational Conventions</name> | <name>Notational Conventions</name> | |||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", " | <t> | |||
| SHOULD", "SHOULD NOT", | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
| "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| be interpreted as | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
| described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8 | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| 174" format="default"/> when, and only when, they appear in all capitals, as | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
| shown here.</t> | 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> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="targeted" numbered="true" toc="default"> | <section anchor="targeted" numbered="true" toc="default"> | |||
| <name>Targeted Cache-Control Header Fields</name> | <name>Targeted Cache-Control Header Fields</name> | |||
| <t>A Targeted Cache-Control Header Field (hereafter, "targeted field") is an HTTP response header field that has the same semantics as the Cache-Control r esponse header field (<xref section="5.2" sectionFormat="comma" target="HTTP-CAC HING" format="default"/>). However, it has a distinct field name that indicates the target for its cache directives.</t> | <t>A Targeted Cache-Control Header Field (hereafter "targeted field") is a n HTTP response header field that has the same semantics as the Cache-Control re sponse header field (<xref section="5.2" sectionFormat="comma" target="HTTP-CACH ING" format="default"/>). However, it has a distinct field name that indicates t he target for its cache directives.</t> | |||
| <t>For example:</t> | <t>For example:</t> | |||
| <sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
| CDN-Cache-Control: max-age=60 | CDN-Cache-Control: max-age=60 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t>is a targeted field that applies to Content Delivery Networks (CDNs), a s defined in <xref target="cdn-cache-control" format="default"/>.</t> | <t>is a targeted field that applies to CDNs, as defined in <xref target="c dn-cache-control" format="default"/>.</t> | |||
| <section anchor="syntax" numbered="true" toc="default"> | <section anchor="syntax" numbered="true" toc="default"> | |||
| <name>Syntax</name> | <name>Syntax</name> | |||
| <t>Targeted fields are Dictionary Structured Fields (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS" format="default"/>). Each member of the dictionary is an HTTP cache response directive (<xref section="5.2.2" sec tionFormat="of" target="HTTP-CACHING" format="default"/>) including extension re sponse directives (as per <xref section="5.2.3" sectionFormat="of" target="HTTP- CACHING" format="default"/>). Note that while targeted fields often have the sam e syntax as Cache-Control fields, differences in error handling mean that using a Cache-Control parser rather than a Structured Fields parser can introduce inte roperability issues.</t> | <t>Targeted fields are Dictionary Structured Fields (<xref section="3.2" sectionFormat="of" target="RFC8941" format="default"/>). Each member of the Dic tionary is an HTTP cache response directive (<xref section="5.2.2" sectionFormat ="of" target="HTTP-CACHING" format="default"/>) including extension response dir ectives (as per <xref section="5.2.3" sectionFormat="of" target="HTTP-CACHING" f ormat="default"/>). Note that while targeted fields often have the same syntax a s Cache-Control fields, differences in error handling mean that using a Cache-Co ntrol parser rather than a Structured Fields parser can introduce interoperabili ty issues.</t> | |||
| <t>Because cache directives are not defined in terms of structured data types, it is necessary to map their values into the appropriate types. <xref sec tion="5.2" sectionFormat="of" target="HTTP-CACHING" format="default"/> defines c ache directive values to be either absent, a quoted-string, or a token.</t> | <t>Because cache directives are not defined in terms of structured data types, it is necessary to map their values into the appropriate types. <xref sec tion="5.2" sectionFormat="of" target="HTTP-CACHING" format="default"/> defines c ache directive values to be either absent, a quoted-string, or a token.</t> | |||
| <t>This means that cache directives that have no value will be mapped to | <t>This means that cache directives that have no value will be mapped to | |||
| a Boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS" | a Boolean (<xref section="3.3.6" sectionFormat="of" target="RFC8941" format="de | |||
| format="default"/>). When the value is a quoted-string, it will be mapped to a S | fault"/>). When the value is a quoted-string, it will be mapped to a String (<xr | |||
| tring (<xref section="3.3.3" sectionFormat="of" target="STRUCTURED-FIELDS" forma | ef section="3.3.3" sectionFormat="of" target="RFC8941" format="default"/>), and | |||
| t="default"/>), and when it is a token, it will map to a Token (<xref section="3 | when it is a token, it will map to a Token (<xref section="3.3.4" sectionFormat= | |||
| .3.4" sectionFormat="of" target="STRUCTURED-FIELDS" format="default"/>), an Inte | "of" target="RFC8941" format="default"/>), an Integer (<xref section="3.3.1" sec | |||
| ger (<xref section="3.3.1" sectionFormat="of" target="STRUCTURED-FIELDS" format= | tionFormat="of" target="RFC8941" format="default"/>), or a Decimal (<xref sectio | |||
| "default"/>) or a Decimal (<xref section="3.3.2" sectionFormat="of" target="STRU | n="3.3.2" sectionFormat="of" target="RFC8941" format="default"/>), depending on | |||
| CTURED-FIELDS" format="default"/>), depending on the content of the value.</t> | the content of the value.</t> | |||
| <t>For example, the max-age directive (<xref section="5.2.2.1" sectionFo | <t>For example, the max-age directive (<xref section="5.2.2.1" sectionFo | |||
| rmat="of" target="HTTP-CACHING" format="default"/>) has an integer value; no-sto | rmat="of" target="HTTP-CACHING" format="default"/>) has an integer value; no-sto | |||
| re (<xref section="5.2.2.5" sectionFormat="of" target="HTTP-CACHING" format="def | re (<xref section="5.2.2.5" sectionFormat="of" target="HTTP-CACHING" format="def | |||
| ault"/>) always has a boolean true value, and no-cache (<xref section="5.2.2.4" | ault"/>) always has a Boolean true value, and no-cache (<xref section="5.2.2.4" | |||
| sectionFormat="of" target="HTTP-CACHING" format="default"/>) has a value that ca | sectionFormat="of" target="HTTP-CACHING" format="default"/>) has a value that ca | |||
| n either be boolean true or a string containing a comma-delimited list of field | n be either Boolean true or a string containing a comma-delimited list of field | |||
| names.</t> | names.</t> | |||
| <t>Implementations MUST NOT generate values that violate these inferred | <t>Implementations <bcp14>MUST NOT</bcp14> generate values that violate | |||
| constraints on the cache directive's value. In particular, string values whose f | these inferred constraints on the cache directive's value. In particular, string | |||
| irst character is not alphabetic or "*" MUST be generated as structured Strings, | values whose first character is not alphabetic or "*" <bcp14>MUST</bcp14> be ge | |||
| so they are not mistaken for other types.</t> | nerated as Strings so that they are not mistaken for other types.</t> | |||
| <t>Implementations SHOULD NOT consume values that violate these inferred | <t>Implementations <bcp14>SHOULD NOT</bcp14> consume values that violate | |||
| constraints. For example, a consuming implementation that coerces a max-age wit | these inferred constraints. For example, a consuming implementation that coerce | |||
| h a decimal value into an integer would behave differently than other implementa | s a max-age with a decimal value into an integer would behave differently than o | |||
| tions, potentially causing interoperability issues.</t> | ther implementations, potentially causing interoperability issues.</t> | |||
| <t>Parameters received on cache directives are to be ignored, unless oth er handling is explicitly specified.</t> | <t>Parameters received on cache directives are to be ignored, unless oth er handling is explicitly specified.</t> | |||
| <t>If a targeted field in a given response is empty, or a parsing error | ||||
| is encountered, that field MUST be ignored by the cache (i.e., it behaves as if | <t>If a targeted field in a given response is empty, or a parsing error i | |||
| the field were not present, likely falling back to other cache-control mechanism | s encountered, that field <bcp14>MUST</bcp14> be ignored by the cache (i.e., it | |||
| s present).</t> | behaves as if the field were not present, likely falling back to other cache-con | |||
| trol mechanisms present).</t> | ||||
| </section> | </section> | |||
| <section anchor="cache-behavior" numbered="true" toc="default"> | <section anchor="cache-behavior" numbered="true" toc="default"> | |||
| <name>Cache Behavior</name> | <name>Cache Behavior</name> | |||
| <t>A cache that implements this specification maintains a <em>target lis | ||||
| t</em> - an ordered list of the targeted field names that it uses for caching po | <t>A cache that implements this specification maintains a target list. A | |||
| licy, with the order reflecting priority from most applicable to least. The targ | target list is an ordered list of the targeted field names that it uses for cach | |||
| et list might be fixed, user-configurable, or generated per request, depending u | ing policy, with the order reflecting priority from most applicable to least. Th | |||
| pon the implementation.</t> | e target list might be fixed, user configurable, or generated per request, depen | |||
| ding upon the implementation.</t> | ||||
| <t>For example, a CDN cache might support both CDN-Cache-Control and a h eader specific to that CDN, ExampleCDN-Cache-Control, with the latter overriding the former. Its target list would be:</t> | <t>For example, a CDN cache might support both CDN-Cache-Control and a h eader specific to that CDN, ExampleCDN-Cache-Control, with the latter overriding the former. Its target list would be:</t> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| <artwork align="left" ><![CDATA[ | ||||
| [ExampleCDN-Cache-Control, CDN-Cache-Control] | [ExampleCDN-Cache-Control, CDN-Cache-Control] | |||
| ]]></artwork> | ]]></artwork> | |||
| <t>When a cache that implements this specification receives a response w | <t>When a cache that implements this specification receives a response w | |||
| ith one or more of the header field names on its target list, the cache MUST sel | ith one or more of the header field names on its target list, the cache <bcp14>M | |||
| ect the first (in target list order) field with a valid, non-empty value and use | UST</bcp14> select the first (in target-list order) field with a valid, non-empt | |||
| its value to determine the caching policy for the response, and MUST ignore the | y value and use its value to determine the caching policy for the response, and | |||
| Cache-Control and Expires header fields in that response, unless no valid, non- | it <bcp14>MUST</bcp14> ignore the Cache-Control and Expires header fields in tha | |||
| empty value is available from the listed header fields.</t> | t response, unless no valid, non-empty value is available from the listed header | |||
| <t>Note that this occurs on a response-by-response basis; if no member o | fields.</t> | |||
| f the cache's target list is present, valid and non-empty, a cache falls back to | <t>Note that this occurs on a response-by-response basis; if no member o | |||
| other cache control mechanisms as required by HTTP <xref target="HTTP-CACHING" | f the cache's target list is present, valid, and non-empty, a cache falls back t | |||
| format="default"/>.</t> | o other cache control mechanisms as required by HTTP <xref target="HTTP-CACHING" | |||
| <t>Targeted fields that are not on a cache's target list MUST NOT change | format="default"/>.</t> | |||
| that cache's behaviour, and MUST be passed through.</t> | <t>Targeted fields that are not on a cache's target list <bcp14>MUST NOT | |||
| <t>Caches that use a targeted field MUST implement the semantics of the | </bcp14> change that cache's behavior and <bcp14>MUST</bcp14> be passed through. | |||
| following cache directives:</t> | </t> | |||
| <t>Caches that use a targeted field <bcp14>MUST</bcp14> implement the se | ||||
| mantics of the following cache directives:</t> | ||||
| <ul spacing="normal"> | <ul spacing="normal"> | |||
| <li>max-age</li> | <li>max-age</li> | |||
| <li>must-revalidate</li> | <li>must-revalidate</li> | |||
| <li>no-store</li> | <li>no-store</li> | |||
| <li>no-cache</li> | <li>no-cache</li> | |||
| <li>private</li> | <li>private</li> | |||
| </ul> | </ul> | |||
| <t>Furthermore, they SHOULD implement other cache directives (including | <t>Furthermore, they <bcp14>SHOULD</bcp14> implement other cache directi | |||
| extension cache directives) that they support in the Cache-Control response head | ves (including extension cache directives) that they support in the Cache-Contro | |||
| er field.</t> | l response header field.</t> | |||
| <t>The semantics and precedence of cache directives in a targeted field | <t>The semantics and precedence of cache directives in a targeted field | |||
| are the same as those in Cache-Control. In particular, no-store and no-cache mak | are the same as those in Cache-Control. In particular, no-store and no-cache mak | |||
| e max-age inoperative, and unrecognised extension directives are ignored.</t> | e max-age inoperative, and unrecognized extension directives are ignored.</t> | |||
| </section> | </section> | |||
| <section anchor="interaction-with-http-freshness" numbered="true" toc="def ault"> | <section anchor="interaction-with-http-freshness" numbered="true" toc="def ault"> | |||
| <name>Interaction with HTTP Freshness</name> | <name>Interaction with HTTP Freshness</name> | |||
| <t>HTTP caching has a single, end-to-end freshness model defined in <xre f section="4.2" sectionFormat="of" target="HTTP-CACHING" format="default"/>. Whe n additional freshness mechanisms are only available to some caches along a requ est path (for example, using targeted fields), their interactions need to be car efully considered. In particular, a targeted cache might have longer freshness l ifetimes available to it than other caches, causing it to serve responses that a ppear to be prematurely (or even immediately) stale to those other caches, negat ively impacting cache efficiency.</t> | <t>HTTP caching has a single, end-to-end freshness model defined in <xre f section="4.2" sectionFormat="of" target="HTTP-CACHING" format="default"/>. Whe n additional freshness mechanisms are only available to some caches along a requ est path (for example, using targeted fields), their interactions need to be car efully considered. In particular, a targeted cache might have longer freshness l ifetimes available to it than other caches, causing it to serve responses that a ppear to be prematurely (or even immediately) stale to those other caches, negat ively impacting cache efficiency.</t> | |||
| <t>For example, a response stored by a CDN cache might be served with th e following headers:</t> | <t>For example, a response stored by a CDN cache might be served with th e following headers:</t> | |||
| <sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
| Age: 1800 | Age: 1800 | |||
| Cache-Control: max-age=600 | Cache-Control: max-age=600 | |||
| CDN-Cache-Control: max-age=3600 | CDN-Cache-Control: max-age=3600 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t>From the CDN's perspective, this response is still fresh after being cached for 30 minutes, while from other caches' standpoint, this response is alr eady stale. See <xref target="AGE-PENALTY" format="default"/> for more discussio n.</t> | <t>From the CDN's perspective, this response is still fresh after being cached for 30 minutes, while from the standpoint of other caches, this response is already stale. See <xref target="AGE-PENALTY" format="default"/> for more dis cussion.</t> | |||
| <t>When the targeted cache has a strong coherence mechanism (e.g., the o rigin server has the ability to proactively invalidate cached responses), it is often desirable to mitigate these effects. Some techniques seen in deployments i nclude:</t> | <t>When the targeted cache has a strong coherence mechanism (e.g., the o rigin server has the ability to proactively invalidate cached responses), it is often desirable to mitigate these effects. Some techniques seen in deployments i nclude:</t> | |||
| <ul spacing="normal"> | <ul spacing="normal"> | |||
| <li>Removing the Age header field</li> | <li>Removing the Age header field</li> | |||
| <li>Updating the Date header field value to the current time</li> | <li>Updating the Date header field value to the current time</li> | |||
| <li>Updating the Expires header field value to the current time, plus any Cache-Control: max-age value</li> | <li>Updating the Expires header field value to the current time, plus any Cache-Control: max-age value</li> | |||
| </ul> | </ul> | |||
| <t>This specification does not place any specific requirements on implem entations to mitigate these effects, but definitions of targeted fields can do s o.</t> | <t>This specification does not place any specific requirements on implem entations to mitigate these effects, but definitions of targeted fields can do s o.</t> | |||
| </section> | </section> | |||
| <section anchor="defining-targeted-fields" numbered="true" toc="default"> | <section anchor="defining-targeted-fields" numbered="true" toc="default"> | |||
| <name>Defining Targeted Fields</name> | <name>Defining Targeted Fields</name> | |||
| <t>A targeted field for a particular class of cache can be defined by re | <t>A targeted field for a particular class of cache can be defined by re | |||
| questing registration in the Hypertext Transfer Protocol (HTTP) Field Name Regis | questing registration in the "Hypertext Transfer Protocol (HTTP) Field Name Regi | |||
| try (<eref target="https://www.iana.org/assignments/http-fields/"/>).</t> | stry" (<eref target="https://www.iana.org/assignments/http-fields/" brackets="an | |||
| <t>Registration requests can use this document as the specification docu | gle"/>).</t> | |||
| ment, in which case the Comments field should clearly define the class of caches | <t>Registration requests can use this document as the specification docu | |||
| that the targeted field applies to. Alternatively, if other documentation for t | ment; in which case, the Comments field should clearly define the class of cache | |||
| he field has been created, it can be used as the specification document.</t> | s that the targeted field applies to. Alternatively, if other documentation for | |||
| <t>By convention, targeted fields have the suffix "-Cache-Control": e.g. | the field has been created, it can be used as the specification document.</t> | |||
| , "ExampleCDN-Cache-Control". However, this suffix MUST NOT be used on its own t | <t>By convention, targeted fields have the suffix "-Cache-Control", e.g. | |||
| o identify targeted fields; it is only a convention.</t> | , "ExampleCDN-Cache-Control". However, this suffix <bcp14>MUST NOT</bcp14> be us | |||
| ed on its own to identify targeted fields; it is only a convention.</t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="cdn-cache-control" numbered="true" toc="default"> | <section anchor="cdn-cache-control" numbered="true" toc="default"> | |||
| <name>The CDN-Cache-Control Targeted Field</name> | <name>The CDN-Cache-Control Targeted Field</name> | |||
| <t>The CDN-Cache-Control response header field is a targeted field (<xref | <t>The CDN-Cache-Control response header field is a targeted field (<xref | |||
| target="targeted" format="default"/>) that allows origin servers to control the | target="targeted" format="default"/>) that allows origin servers to control the | |||
| behaviour of CDN caches interposed between them and clients, separately from oth | behavior of CDN caches interposed between them and clients separately from other | |||
| er caches that might handle the response.</t> | caches that might handle the response.</t> | |||
| <t>It applies to caches that are part of a distributed network that operat | <t>It applies to caches that are part of a distributed network that operat | |||
| e on behalf of an origin server (commonly called a Content Delivery Network or C | e on behalf of an origin server (commonly called a CDN).</t> | |||
| DN).</t> | <t>CDN caches that use CDN-Cache-Control will typically forward this heade | |||
| <t>CDN caches that use CDN-Cache-Control will typically forward this heade | r so that downstream CDN caches can use it as well. However, they <bcp14>MAY</bc | |||
| r so that downstream CDN caches can use it as well. However, they MAY remove it | p14> remove it when this is undesirable (for example, when configured to do so b | |||
| when this is undesirable (for example, when configured to do so because it is kn | ecause it is known not to be used downstream).</t> | |||
| own not to be used downstream).</t> | ||||
| <section anchor="examples" numbered="true" toc="default"> | <section anchor="examples" numbered="true" toc="default"> | |||
| <name>Examples</name> | <name>Examples</name> | |||
| <t>For example, the following header fields would instruct a CDN cache ( i.e., a cache with a target list of <tt>[CDN-Cache-Control]</tt>) to consider th e response fresh for 600 seconds, other shared caches to consider the response f resh for 120 seconds, and any remaining caches to consider the response fresh fo r 60 seconds:</t> | <t>For example, the following header fields would instruct a CDN cache ( i.e., a cache with a target list of <tt>[CDN-Cache-Control]</tt>) to consider th e response fresh for 600 seconds, other shared caches to consider the response f resh for 120 seconds, and any remaining caches to consider the response fresh fo r 60 seconds:</t> | |||
| <sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
| Cache-Control: max-age=60, s-maxage=120 | Cache-Control: max-age=60, s-maxage=120 | |||
| CDN-Cache-Control: max-age=600 | CDN-Cache-Control: max-age=600 | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t>These header fields would instruct a CDN cache to consider the respon se fresh for 600 seconds, while all other caches would be prevented from storing it:</t> | <t>These header fields would instruct a CDN cache to consider the respon se fresh for 600 seconds, while all other caches would be prevented from storing it:</t> | |||
| <sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
| CDN-Cache-Control: max-age=600 | CDN-Cache-Control: max-age=600 | |||
| skipping to change at line 173 ¶ | skipping to change at line 166 ¶ | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t>Because CDN-Cache-Control is not present, this header field would pre vent all caches from storing the response:</t> | <t>Because CDN-Cache-Control is not present, this header field would pre vent all caches from storing the response:</t> | |||
| <sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
| Cache-Control: no-store | Cache-Control: no-store | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t>Whereas these would prevent all caches except for CDN caches from sto ring the response:</t> | <t>Whereas these would prevent all caches except for CDN caches from sto ring the response:</t> | |||
| <sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
| Cache-Control: no-store | Cache-Control: no-store | |||
| CDN-Cache-Control: none | CDN-Cache-Control: none | |||
| ]]></sourcecode> | ]]></sourcecode> | |||
| <t>(note that 'none' is not a registered cache directive; it is here to avoid sending a header field with an empty value, which would be ignored)</t> | <t>(Note that 'none' is not a registered cache directive; it is here to avoid sending a header field with an empty value, which would be ignored.)</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="iana-considerations" numbered="true" toc="default"> | <section anchor="iana-considerations" numbered="true" toc="default"> | |||
| <name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
| <t>Please register the following entry in the Hypertext Transfer Protocol | <t>IANA has registered the following entry in the "Hypertext Transfer Prot | |||
| (HTTP) Field Name Registry | ocol (HTTP) Field Name Registry" defined by <xref target="HTTP" format="default" | |||
| defined by <xref target="HTTP" format="default"/>:</t> | />:</t> | |||
| <ul spacing="normal"> | <dl spacing="compact"> | |||
| <li>Field Name: CDN-Cache-Control</li> | <dt>Field Name:</dt> | |||
| <li>Status: permanent</li> | <dd>CDN-Cache-Control</dd> | |||
| <li>Specification Document: [this document]</li> | <dt>Status:</dt> | |||
| <li>Comments: Cache directives targeted at Content Delivery Networks</li | <dd>permanent</dd> | |||
| > | <dt>Specification Document:</dt> | |||
| </ul> | <dd>RFC 9213</dd> | |||
| <dt>Comments:</dt> | ||||
| <dd>Cache directives targeted at content delivery networks</dd> | ||||
| </dl> | ||||
| </section> | </section> | |||
| <section anchor="security-considerations" numbered="true" toc="default"> | <section anchor="security-considerations" numbered="true" toc="default"> | |||
| <name>Security Considerations</name> | <name>Security Considerations</name> | |||
| <t>The security considerations of HTTP caching <xref target="HTTP-CACHING" format="default"/> apply.</t> | <t>The security considerations of HTTP caching <xref target="HTTP-CACHING" format="default"/> apply.</t> | |||
| <t>The ability to carry multiple caching policies on a response can result in confusion about how a response will be cached in different systems, potentia lly resulting in unintentional reuse of responses with sensitive information. Fo r this reason, care must be exercised.</t> | <t>The ability to carry multiple caching policies on a response can result in confusion about how a response will be cached in different systems, potentia lly resulting in unintentional reuse of responses with sensitive information. Fo r this reason, care must be exercised.</t> | |||
| </section> | </section> | |||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <displayreference target="RFC8941" to="STRUCTURED-FIELDS"/> | ||||
| <references> | <references> | |||
| <name>References</name> | <name>References</name> | |||
| <references> | <references> | |||
| <name>Normative References</name> | <name>Normative References</name> | |||
| <reference anchor="RFC2119"> | ||||
| <front> | ||||
| <title>Key words for use in RFCs to Indicate Requirement Levels</tit | ||||
| le> | ||||
| <author fullname="S. Bradner" initials="S." surname="Bradner"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month="March" year="1997"/> | ||||
| <abstract> | ||||
| <t>In many standards track documents several words are used to sig | ||||
| nify the requirements in the specification. These words are often capitalized. | ||||
| This document defines these words as they should be interpreted in IETF document | ||||
| s. This document specifies an Internet Best Current Practices for the Internet | ||||
| Community, and requests discussion and suggestions for improvements.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="2119"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
| </reference> | ||||
| <reference anchor="HTTP"> | ||||
| <front> | ||||
| <title>HTTP Semantics</title> | ||||
| <author fullname="Roy T. Fielding"> | ||||
| <organization>Adobe</organization> | ||||
| </author> | ||||
| <author fullname="Mark Nottingham"> | ||||
| <organization>Fastly</organization> | ||||
| </author> | ||||
| <author fullname="Julian Reschke"> | ||||
| <organization>greenbytes GmbH</organization> | ||||
| </author> | ||||
| <date day="12" month="September" year="2021"/> | ||||
| <abstract> | ||||
| <t> The Hypertext Transfer Protocol (HTTP) is a stateless applic | ||||
| ation- | ||||
| level protocol for distributed, collaborative, hypertext information | ||||
| systems. This document describes the overall architecture of HTTP, | ||||
| establishes common terminology, and defines aspects of the protocol | ||||
| that are shared by all versions. In this definition are core | ||||
| protocol elements, extensibility mechanisms, and the "http" and | ||||
| "https" Uniform Resource Identifier (URI) schemes. | ||||
| This document updates RFC 3864 and obsoletes RFC 2818, RFC 7231, RFC | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119. | |||
| 7232, RFC 7233, RFC 7235, RFC 7538, RFC 7615, RFC 7694, and portions | xml"/> | |||
| of RFC 7230. | ||||
| </t> | <reference anchor='HTTP' target="https://www.rfc-editor.org/info/rfc9110"> | |||
| </abstract> | <front> | |||
| </front> | <title>HTTP Semantics</title> | |||
| <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-semantics- | <author initials='R' surname='Fielding' fullname='Roy Fielding' role="editor"> | |||
| 19"/> | <organization /> | |||
| </reference> | </author> | |||
| <reference anchor="HTTP-CACHING"> | <author initials='M' surname='Nottingham' fullname='Mark Nottingham' role="edito | |||
| <front> | r"> | |||
| <title>HTTP Caching</title> | <organization /> | |||
| <author fullname="Roy T. Fielding"> | </author> | |||
| <organization>Adobe</organization> | <author initials='J' surname='Reschke' fullname='Julian Reschke' role="editor"> | |||
| </author> | <organization /> | |||
| <author fullname="Mark Nottingham"> | </author> | |||
| <organization>Fastly</organization> | <date year='2022' month='June' /> | |||
| </author> | </front> | |||
| <author fullname="Julian Reschke"> | <seriesInfo name='STD' value='97'/> | |||
| <organization>greenbytes GmbH</organization> | <seriesInfo name='RFC' value='9110'/> | |||
| </author> | <seriesInfo name='DOI' value='10.17487/RFC9110'/> | |||
| <date day="12" month="September" year="2021"/> | </reference> | |||
| <abstract> | ||||
| <t> The Hypertext Transfer Protocol (HTTP) is a stateless applic | ||||
| ation- | ||||
| level protocol for distributed, collaborative, hypertext information | ||||
| systems. This document defines HTTP caches and the associated header | ||||
| fields that control cache behavior or indicate cacheable response | ||||
| messages. | ||||
| This document obsoletes RFC 7234. | <reference anchor='HTTP-CACHING' target="https://www.rfc-editor.org/info/rfc9111 | |||
| "> | ||||
| <front> | ||||
| <title>HTTP Caching</title> | ||||
| <author initials='R' surname='Fielding' fullname='Roy T. Fielding' role="editor" | ||||
| > | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='M' surname='Nottingham' fullname='Mark Nottingham' role="edito | ||||
| r"> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='J' surname='Reschke' fullname='Julian Reschke' role="editor"> | ||||
| <organization /> | ||||
| </author> | ||||
| <date year='2022' month='June' /> | ||||
| </front> | ||||
| <seriesInfo name='STD' value='98'/> | ||||
| <seriesInfo name='RFC' value='9111'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC9111'/> | ||||
| </reference> | ||||
| </t> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8941. | |||
| </abstract> | xml"/> | |||
| </front> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174. | |||
| <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-cache-19"/ | xml"/> | |||
| > | ||||
| </reference> | </references> | |||
| <reference anchor="STRUCTURED-FIELDS"> | ||||
| <front> | ||||
| <title>Structured Field Values for HTTP</title> | ||||
| <author fullname="M. Nottingham" initials="M." surname="Nottingham"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author fullname="P-H. Kamp" initials="P-H." surname="Kamp"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month="February" year="2021"/> | ||||
| <abstract> | ||||
| <t>This document describes a set of data types and associated algo | ||||
| rithms that are intended to make it easier and safer to define and handle HTTP h | ||||
| eader and trailer fields, known as "Structured Fields", "Structured Headers", or | ||||
| "Structured Trailers". It is intended for use by specifications of new HTTP fie | ||||
| lds that wish to use a common syntax that is more restrictive than traditional H | ||||
| TTP field values.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8941"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8941"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8174"> | ||||
| <front> | ||||
| <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | ||||
| tle> | ||||
| <author fullname="B. Leiba" initials="B." surname="Leiba"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month="May" year="2017"/> | ||||
| <abstract> | ||||
| <t>RFC 2119 specifies common key words that may be used in protoco | ||||
| l specifications. This document aims to reduce the ambiguity by clarifying tha | ||||
| t only UPPERCASE usage of the key words have the defined special meanings.</t> | ||||
| </abstract> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="8174"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
| </reference> | ||||
| </references> | ||||
| <references> | <references> | |||
| <name>Informative References</name> | <name>Informative References</name> | |||
| <reference anchor="AGE-PENALTY" target="https://dl.acm.org/doi/10.5555/1 251440.1251447"> | <reference anchor="AGE-PENALTY" target="https://dl.acm.org/doi/10.5555/1 251440.1251447"> | |||
| <front> | <front> | |||
| <title>The age penalty and its effect on cache performance</title> | <title>The age penalty and its effect on cache performance</title> | |||
| <author initials="E." surname="Cohen" fullname="Edith Cohen"> | <author initials="E." surname="Cohen" fullname="Edith Cohen"> | |||
| <organization>AT&T Labs - Research</organization> | <organization>AT&T Labs - Research</organization> | |||
| </author> | </author> | |||
| <author initials="H." surname="Kaplan" fullname="Haim Kaplan"> | <author initials="H." surname="Kaplan" fullname="Haim Kaplan"> | |||
| <organization>School of Computer Science, Tel-Aviv University</org anization> | <organization>School of Computer Science, Tel-Aviv University</org anization> | |||
| </author> | </author> | |||
| <date year="2001" month="March"/> | <date year="2001" month="March"/> | |||
| </front> | </front> | |||
| </reference> | </reference> | |||
| </references> | </references> | |||
| </references> | </references> | |||
| </back> | ||||
| <!-- ##markdown-source: | ||||
| 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 | ||||
| bk0ZUZ9r6u+zU882CP4Xm4ttLhA1AAA= | ||||
| </back> | ||||
| </rfc> | </rfc> | |||
| End of changes. 32 change blocks. | ||||
| 390 lines changed or deleted | 201 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/ | ||||