NetworkHTTP Working Group P. McManus Internet-Draft Mozilla Intended status: Standards TrackJanuary 12,March 13, 2017 Expires:July 16,September 14, 2017 HTTP Immutable Responsesdraft-ietf-httpbis-immutable-00draft-ietf-httpbis-immutable-01 Abstract The immutable HTTP response Cache-Control extension allows servers to identify resources that will not be updated during their freshness lifetime. This assures that a client never needs to revalidate a cached fresh resource to be certain it has not been modified. Note to Readers Discussion of this draft takes place on the HTTP working group mailing list (ietf-http-wg@w3.org), which is archived at https://lists.w3.org/Archives/Public/ietf-http-wg/ . Working Group information can be found at http://httpwg.github.io/ ; source code and issues list for this draft can be found at https://github.com/httpwg/http-extensions/labels/immutable . Status of This Memo This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet- Drafts is at http://datatracker.ietf.org/drafts/current/. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress." This Internet-Draft will expire onJuly 16,September 14, 2017. Copyright Notice Copyright (c) 2017 IETF Trust and the persons identified as the document authors. All rights reserved. This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License. 1. IntroductionThe HTTPHTTP's freshness lifetime mechanism [RFC7234]caching attribute specifies thatallows a clientmayto safely reuse a stored response to satisfy future requestsoverfor aspecificspecified period of time.It does not specifyHowever, it is still possible that the resource will benot bemodified during that period. For instance, a front page newspaper photo with a freshness lifetime of one hour would mean that no usershouldwould see a cached photo more than one hour old. However, the photo could be updated at any time resulting in different users seeing different photos depending on the contents of their caches for up to one hour. This is compliant with the caching mechanism defined in [RFC7234]. Users that need to confirm there have been no updates to theircurrentcachedresourcesresponses typicallyinvokeuse the reload (or refresh) mechanism inthetheir useragent.agents. This in turn generates a conditional request [RFC7232] and either a new representation or, if unmodified, a 304 (Not Modified) response[RFC7231][RFC7232] is returned. A user agent thatmanagesunderstands HTML and fetches its dependent sub-resourcesmaymight issue hundreds of conditional requests to refresh all portions of a commonHTMLpage [REQPERPAGE].Through the use of the versioned URL design patternHowever some content providers never create more than one variant of asub-resource.sub-resource, because they use "versioned" URLs. When these resources need an update they are simply published under a new URL, typically embeddinga variantan identifier unique to that version of the resource in the path, and references to the sub-resource are updated with the new path information. For example,https://www.example.com/101016/main.css"https://www.example.com/101016/main.css" might be updated and republished ashttps://www.example.com/102026/main.css and the html"https://www.example.com/102026/main.css", with any links that references itisbeing changed at the same time. This design pattern allows a very large freshness lifetime to beapplied toused for the sub-resource without guessing when it will be updated in the future. Unfortunately, theuser-agent isuser agent does notaware of theknow when this versioned URL designpattern. User driven refresh eventspattern is used. As a result, user-driven refreshes still translate into wasted conditional requests for each sub-resource as each will return 304 responses. Theimmutable"immutable" HTTP response Cache-Control extension allows servers to identifyresourcesresponses that will not be updated during their freshnesslifetime.lifetimes. This effectivelyinstructs the clientinforms clients that any conditional request fora previously served variant ofthatresource mayresponse can be safely skipped without worrying that it has been updated. 2. The immutable Cache-Control extension When present in an HTTP response, theimmutable"immutable" Cache-Control extension indicates that the origin serverMUST NOTwill not update the representation of that resource during the freshness lifetime of the response. Clients SHOULD NOT issue a conditional request during the response's freshness lifetime (e.g. upon a reload) unless explicitly overridden by the user (e.g. a force reload). The immutable extension only applies during the freshness lifetime of the stored response. Stale responses SHOULD be revalidated as they normally would be in the absence of immutable. The immutable extension takes noarguments and ifarguments. If any arguments arepresentpresent, they have nomeaning.meaning, and MUST be ignored. Multiple instances of the immutable extension are equivalent to one instance. The presence of an immutable Cache-Control extension in a request has no effect. 2.1. About Intermediaries An immutable response has the same semantic meaningforwhe received by proxy clients as it doesforwhen received by User-Agent basedclients and they therefore MAY also presumeclients. Therefore proxies SHOULD skip conditionally revalidating fresh responses containing the immutable extension unless there is aconditional revalidation forsignal from the client that aresponse marked immutable would return 304.validation is necessary (e.g. a no-cache Cache-Control request directive). A proxyclient whothat uses immutable toanticipatebypass a304 responseconditional revalidation may choose whether to reply with a 304 or 200 to its requestingclient.client based on the request headers the proxy received. 2.2. Example Cache-Control: max-age=31536000, immutable 3. Security Considerations The immutable mechanism acts as form of soft pinning and, as with all pinning mechanisms, creates a vector for amplification of cache corruption incidents. These incidents include cache poisoning attacks. Three mechanisms are suggested for mitigation of this risk: o ClientsshouldSHOULD ignore immutableforfrom resources that are not part of an authenticated context such as HTTPS. Authenticated resources are less vulnerable to cache poisoning. o User-Agents often provide two different refreshmechanismss:mechanisms: reload and some form of force-reload. The latter is used to rectify interrupted loads and other corruption. These reloads, typically indicated through no-cache request attributes,shouldSHOULD ignore immutable as well. o ClientsshouldSHOULD ignore immutable for resources that do not provide a strong indication that the stored response size is the correct response size such as responses delimited by connection close. 4. IANA Considerations [RFC7234] sections 7.1 and 7.1.2 require registration of the immutable extension in the "Hypertext Transfer Protocol (HTTP) Cache Directive Registry" with IETF Review. o Cache-Directive: immutable o Pointer to specification text: [this document] 5. Acknowledgments Thank you to Ben Maurer for partnership in developing and testing this idea. Thank you to Amos Jeffries for help with proxyinteractions.interactions and to Mark Nottingham for help with the documentation. 6. References 6.1. Normative References [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content", RFC 7231, DOI 10.17487/RFC7231, June 2014, <http://www.rfc-editor.org/info/rfc7231>. [RFC7232] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests", RFC 7232, DOI 10.17487/RFC7232, June 2014, <http://www.rfc-editor.org/info/rfc7232>. [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): Caching", RFC 7234, DOI 10.17487/RFC7234, June 2014, <http://www.rfc-editor.org/info/rfc7234>. 6.2. Informative References [REQPERPAGE] "HTTP Archive", n.d., <http://httparchive.org/interesting.php#reqTotal>. Author's Address Patrick McManus Mozilla Email: pmcmanus@mozilla.com