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/ |