draft-ietf-httpbis-rfc6265bis-07.txt   draft-ietf-httpbis-rfc6265bis-08.txt 
HTTP M. West, Ed. HTTP L. Chen, Ed.
Internet-Draft Google, Inc Internet-Draft Google LLC
Obsoletes: 6265 (if approved) J. Wilander, Ed. Obsoletes: 6265 (if approved) S. Englehardt, Ed.
Intended status: Standards Track Apple, Inc Intended status: Standards Track Mozilla
Expires: 10 June 2021 7 December 2020 Expires: 4 December 2021 M. West, Ed.
Google LLC
J. Wilander, Ed.
Apple, Inc
2 June 2021
Cookies: HTTP State Management Mechanism Cookies: HTTP State Management Mechanism
draft-ietf-httpbis-rfc6265bis-07 draft-ietf-httpbis-rfc6265bis-08
Abstract Abstract
This document defines the HTTP Cookie and Set-Cookie header fields. This document defines the HTTP Cookie and Set-Cookie header fields.
These header fields can be used by HTTP servers to store state These header fields can be used by HTTP servers to store state
(called cookies) at HTTP user agents, letting the servers maintain a (called cookies) at HTTP user agents, letting the servers maintain a
stateful session over the mostly stateless HTTP protocol. Although stateful session over the mostly stateless HTTP protocol. Although
cookies have many historical infelicities that degrade their security cookies have many historical infelicities that degrade their security
and privacy, the Cookie and Set-Cookie header fields are widely used and privacy, the Cookie and Set-Cookie header fields are widely used
on the Internet. This document obsoletes RFC 6265. on the Internet. This document obsoletes RFC 6265.
skipping to change at page 2, line 4 skipping to change at page 2, line 9
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 10 June 2021.
This Internet-Draft will expire on 4 December 2021.
Copyright Notice Copyright Notice
Copyright (c) 2020 IETF Trust and the persons identified as the Copyright (c) 2021 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document. license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights Please review these documents carefully, as they describe your rights
and restrictions with respect to this document. Code Components and restrictions with respect to this document. Code Components
extracted from this document must include Simplified BSD License text extracted from this document must include Simplified BSD License text
as described in Section 4.e of the Trust Legal Provisions and are as described in Section 4.e of the Trust Legal Provisions and are
provided without warranty as described in the Simplified BSD License. provided without warranty as described in the Simplified BSD License.
skipping to change at page 2, line 40 skipping to change at page 2, line 46
than English. than English.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 5 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1. Conformance Criteria . . . . . . . . . . . . . . . . . . 5 2.1. Conformance Criteria . . . . . . . . . . . . . . . . . . 5
2.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5 2.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5
2.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6 2.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6
3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1. Examples . . . . . . . . . . . . . . . . . . . . . . . . 7 3.1. Examples . . . . . . . . . . . . . . . . . . . . . . . . 8
4. Server Requirements . . . . . . . . . . . . . . . . . . . . . 9 4. Server Requirements . . . . . . . . . . . . . . . . . . . . . 9
4.1. Set-Cookie . . . . . . . . . . . . . . . . . . . . . . . 9 4.1. Set-Cookie . . . . . . . . . . . . . . . . . . . . . . . 9
4.1.1. Syntax . . . . . . . . . . . . . . . . . . . . . . . 9 4.1.1. Syntax . . . . . . . . . . . . . . . . . . . . . . . 9
4.1.2. Semantics (Non-Normative) . . . . . . . . . . . . . . 11 4.1.2. Semantics (Non-Normative) . . . . . . . . . . . . . . 11
4.1.3. Cookie Name Prefixes . . . . . . . . . . . . . . . . 14 4.1.3. Cookie Name Prefixes . . . . . . . . . . . . . . . . 14
4.2. Cookie . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.2. Cookie . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2.1. Syntax . . . . . . . . . . . . . . . . . . . . . . . 16 4.2.1. Syntax . . . . . . . . . . . . . . . . . . . . . . . 16
4.2.2. Semantics . . . . . . . . . . . . . . . . . . . . . . 16 4.2.2. Semantics . . . . . . . . . . . . . . . . . . . . . . 16
5. User Agent Requirements . . . . . . . . . . . . . . . . . . . 16 5. User Agent Requirements . . . . . . . . . . . . . . . . . . . 16
5.1. Subcomponent Algorithms . . . . . . . . . . . . . . . . . 17 5.1. Subcomponent Algorithms . . . . . . . . . . . . . . . . . 17
5.1.1. Dates . . . . . . . . . . . . . . . . . . . . . . . . 17 5.1.1. Dates . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.2. Canonicalized Host Names . . . . . . . . . . . . . . 18 5.1.2. Canonicalized Host Names . . . . . . . . . . . . . . 18
5.1.3. Domain Matching . . . . . . . . . . . . . . . . . . . 19 5.1.3. Domain Matching . . . . . . . . . . . . . . . . . . . 19
5.1.4. Paths and Path-Match . . . . . . . . . . . . . . . . 19 5.1.4. Paths and Path-Match . . . . . . . . . . . . . . . . 19
5.2. "Same-site" and "cross-site" Requests . . . . . . . . . . 20 5.2. "Same-site" and "cross-site" Requests . . . . . . . . . . 20
5.2.1. Document-based requests . . . . . . . . . . . . . . . 21 5.2.1. Document-based requests . . . . . . . . . . . . . . . 21
5.2.2. Worker-based requests . . . . . . . . . . . . . . . . 22 5.2.2. Worker-based requests . . . . . . . . . . . . . . . . 22
5.3. The Set-Cookie Header . . . . . . . . . . . . . . . . . . 23 5.3. Ignoring Set-Cookie Header Fields . . . . . . . . . . . . 23
5.3.1. The Expires Attribute . . . . . . . . . . . . . . . . 25 5.4. The Set-Cookie Header Field . . . . . . . . . . . . . . . 23
5.3.2. The Max-Age Attribute . . . . . . . . . . . . . . . . 25 5.4.1. The Expires Attribute . . . . . . . . . . . . . . . . 26
5.3.3. The Domain Attribute . . . . . . . . . . . . . . . . 26 5.4.2. The Max-Age Attribute . . . . . . . . . . . . . . . . 26
5.3.4. The Path Attribute . . . . . . . . . . . . . . . . . 26 5.4.3. The Domain Attribute . . . . . . . . . . . . . . . . 26
5.3.5. The Secure Attribute . . . . . . . . . . . . . . . . 27 5.4.4. The Path Attribute . . . . . . . . . . . . . . . . . 27
5.3.6. The HttpOnly Attribute . . . . . . . . . . . . . . . 27 5.4.5. The Secure Attribute . . . . . . . . . . . . . . . . 27
5.3.7. The SameSite Attribute . . . . . . . . . . . . . . . 27 5.4.6. The HttpOnly Attribute . . . . . . . . . . . . . . . 27
5.4. Storage Model . . . . . . . . . . . . . . . . . . . . . . 28 5.4.7. The SameSite Attribute . . . . . . . . . . . . . . . 28
5.5. The Cookie Header . . . . . . . . . . . . . . . . . . . . 33 5.5. Storage Model . . . . . . . . . . . . . . . . . . . . . . 30
6. Implementation Considerations . . . . . . . . . . . . . . . . 36 5.6. Retrieval Model . . . . . . . . . . . . . . . . . . . . . 35
6.1. Limits . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.6.1. The Cookie Header Field . . . . . . . . . . . . . . . 35
6.2. Application Programming Interfaces . . . . . . . . . . . 36 5.6.2. Non-HTTP APIs . . . . . . . . . . . . . . . . . . . . 35
6.3. IDNA Dependency and Migration . . . . . . . . . . . . . . 36 5.6.3. Retrieval Algorithm . . . . . . . . . . . . . . . . . 36
7. Privacy Considerations . . . . . . . . . . . . . . . . . . . 37 6. Implementation Considerations . . . . . . . . . . . . . . . . 38
7.1. Third-Party Cookies . . . . . . . . . . . . . . . . . . . 37 6.1. Limits . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.2. User Controls . . . . . . . . . . . . . . . . . . . . . . 38 6.2. Application Programming Interfaces . . . . . . . . . . . 38
7.3. Expiration Dates . . . . . . . . . . . . . . . . . . . . 38 6.3. IDNA Dependency and Migration . . . . . . . . . . . . . . 38
8. Security Considerations . . . . . . . . . . . . . . . . . . . 38 7. Privacy Considerations . . . . . . . . . . . . . . . . . . . 39
8.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 38 7.1. Third-Party Cookies . . . . . . . . . . . . . . . . . . . 39
8.2. Ambient Authority . . . . . . . . . . . . . . . . . . . . 39 7.2. Cookie policy . . . . . . . . . . . . . . . . . . . . . . 40
8.3. Clear Text . . . . . . . . . . . . . . . . . . . . . . . 39 7.3. User Controls . . . . . . . . . . . . . . . . . . . . . . 40
8.4. Session Identifiers . . . . . . . . . . . . . . . . . . . 40 7.4. Expiration Dates . . . . . . . . . . . . . . . . . . . . 40
8.5. Weak Confidentiality . . . . . . . . . . . . . . . . . . 41 8. Security Considerations . . . . . . . . . . . . . . . . . . . 41
8.6. Weak Integrity . . . . . . . . . . . . . . . . . . . . . 41 8.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 41
8.7. Reliance on DNS . . . . . . . . . . . . . . . . . . . . . 42 8.2. Ambient Authority . . . . . . . . . . . . . . . . . . . . 41
8.8. SameSite Cookies . . . . . . . . . . . . . . . . . . . . 42 8.3. Clear Text . . . . . . . . . . . . . . . . . . . . . . . 42
8.8.1. Defense in depth . . . . . . . . . . . . . . . . . . 43 8.4. Session Identifiers . . . . . . . . . . . . . . . . . . . 42
8.8.2. Top-level Navigations . . . . . . . . . . . . . . . . 43 8.5. Weak Confidentiality . . . . . . . . . . . . . . . . . . 43
8.8.3. Mashups and Widgets . . . . . . . . . . . . . . . . . 44 8.6. Weak Integrity . . . . . . . . . . . . . . . . . . . . . 44
8.8.4. Server-controlled . . . . . . . . . . . . . . . . . . 44 8.7. Reliance on DNS . . . . . . . . . . . . . . . . . . . . . 44
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 44 8.8. SameSite Cookies . . . . . . . . . . . . . . . . . . . . 45
9.1. Cookie . . . . . . . . . . . . . . . . . . . . . . . . . 44 8.8.1. Defense in depth . . . . . . . . . . . . . . . . . . 45
9.2. Set-Cookie . . . . . . . . . . . . . . . . . . . . . . . 44 8.8.2. Top-level Navigations . . . . . . . . . . . . . . . . 45
9.3. Cookie Attribute Registry . . . . . . . . . . . . . . . . 45 8.8.3. Mashups and Widgets . . . . . . . . . . . . . . . . . 46
9.3.1. Procedure . . . . . . . . . . . . . . . . . . . . . . 45 8.8.4. Server-controlled . . . . . . . . . . . . . . . . . . 46
9.3.2. Registration . . . . . . . . . . . . . . . . . . . . 45 8.8.5. Reload navigations . . . . . . . . . . . . . . . . . 46
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 46 8.8.6. Top-level requests with "unsafe" methods . . . . . . 47
10.1. Normative References . . . . . . . . . . . . . . . . . . 46 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47
10.2. Informative References . . . . . . . . . . . . . . . . . 48 9.1. Cookie . . . . . . . . . . . . . . . . . . . . . . . . . 48
Appendix A. Changes . . . . . . . . . . . . . . . . . . . . . . 49 9.2. Set-Cookie . . . . . . . . . . . . . . . . . . . . . . . 48
A.1. draft-ietf-httpbis-rfc6265bis-00 . . . . . . . . . . . . 49 9.3. Cookie Attribute Registry . . . . . . . . . . . . . . . . 48
A.2. draft-ietf-httpbis-rfc6265bis-01 . . . . . . . . . . . . 50 9.3.1. Procedure . . . . . . . . . . . . . . . . . . . . . . 48
A.3. draft-ietf-httpbis-rfc6265bis-02 . . . . . . . . . . . . 50 9.3.2. Registration . . . . . . . . . . . . . . . . . . . . 49
A.4. draft-ietf-httpbis-rfc6265bis-03 . . . . . . . . . . . . 51 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 49
A.5. draft-ietf-httpbis-rfc6265bis-04 . . . . . . . . . . . . 51 10.1. Normative References . . . . . . . . . . . . . . . . . . 49
A.6. draft-ietf-httpbis-rfc6265bis-05 . . . . . . . . . . . . 52 10.2. Informative References . . . . . . . . . . . . . . . . . 51
A.7. draft-ietf-httpbis-rfc6265bis-06 . . . . . . . . . . . . 52 Appendix A. Changes . . . . . . . . . . . . . . . . . . . . . . 53
A.8. draft-ietf-httpbis-rfc6265bis-07 . . . . . . . . . . . . 52 A.1. draft-ietf-httpbis-rfc6265bis-00 . . . . . . . . . . . . 53
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 53 A.2. draft-ietf-httpbis-rfc6265bis-01 . . . . . . . . . . . . 53
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 53 A.3. draft-ietf-httpbis-rfc6265bis-02 . . . . . . . . . . . . 54
A.4. draft-ietf-httpbis-rfc6265bis-03 . . . . . . . . . . . . 54
A.5. draft-ietf-httpbis-rfc6265bis-04 . . . . . . . . . . . . 55
A.6. draft-ietf-httpbis-rfc6265bis-05 . . . . . . . . . . . . 55
A.7. draft-ietf-httpbis-rfc6265bis-06 . . . . . . . . . . . . 55
A.8. draft-ietf-httpbis-rfc6265bis-07 . . . . . . . . . . . . 56
A.9. draft-ietf-httpbis-rfc6265bis-08 . . . . . . . . . . . . 56
Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . 57
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 57
1. Introduction 1. Introduction
This document defines the HTTP Cookie and Set-Cookie header fields. This document defines the HTTP Cookie and Set-Cookie header fields.
Using the Set-Cookie header field, an HTTP server can pass name/value Using the Set-Cookie header field, an HTTP server can pass name/value
pairs and associated metadata (called cookies) to a user agent. When pairs and associated metadata (called cookies) to a user agent. When
the user agent makes subsequent requests to the server, the user the user agent makes subsequent requests to the server, the user
agent uses the metadata and other information to determine whether to agent uses the metadata and other information to determine whether to
return the name/value pairs in the Cookie header. return the name/value pairs in the Cookie header field.
Although simple on their surface, cookies have a number of Although simple on their surface, cookies have a number of
complexities. For example, the server indicates a scope for each complexities. For example, the server indicates a scope for each
cookie when sending it to the user agent. The scope indicates the cookie when sending it to the user agent. The scope indicates the
maximum amount of time in which the user agent should return the maximum amount of time in which the user agent should return the
cookie, the servers to which the user agent should return the cookie, cookie, the servers to which the user agent should return the cookie,
and the URI schemes for which the cookie is applicable. and the URI schemes for which the cookie is applicable.
For historical reasons, cookies contain a number of security and For historical reasons, cookies contain a number of security and
privacy infelicities. For example, a server can indicate that a privacy infelicities. For example, a server can indicate that a
skipping to change at page 5, line 5 skipping to change at page 5, line 17
To maximize interoperability with user agents, servers SHOULD limit To maximize interoperability with user agents, servers SHOULD limit
themselves to the well-behaved profile defined in Section 4 when themselves to the well-behaved profile defined in Section 4 when
generating cookies. generating cookies.
User agents MUST implement the more liberal processing rules defined User agents MUST implement the more liberal processing rules defined
in Section 5, in order to maximize interoperability with existing in Section 5, in order to maximize interoperability with existing
servers that do not conform to the well-behaved profile defined in servers that do not conform to the well-behaved profile defined in
Section 4. Section 4.
This document specifies the syntax and semantics of these headers as This document specifies the syntax and semantics of these header
they are actually used on the Internet. In particular, this document fields as they are actually used on the Internet. In particular,
does not create new syntax or semantics beyond those in use today. this document does not create new syntax or semantics beyond those in
The recommendations for cookie generation provided in Section 4 use today. The recommendations for cookie generation provided in
represent a preferred subset of current server behavior, and even the Section 4 represent a preferred subset of current server behavior,
more liberal cookie processing algorithm provided in Section 5 does and even the more liberal cookie processing algorithm provided in
not recommend all of the syntactic and semantic variations in use Section 5 does not recommend all of the syntactic and semantic
today. Where some existing software differs from the recommended variations in use today. Where some existing software differs from
protocol in significant ways, the document contains a note explaining the recommended protocol in significant ways, the document contains a
the difference. note explaining the difference.
This document obsoletes [RFC6265]. This document obsoletes [RFC6265].
2. Conventions 2. Conventions
2.1. Conformance Criteria 2.1. Conformance Criteria
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in [RFC2119]. document are to be interpreted as described in [RFC2119].
skipping to change at page 5, line 51 skipping to change at page 6, line 14
The following core rules are included by reference, as defined in The following core rules are included by reference, as defined in
[RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
(CR LF), CTLs (controls), DIGIT (decimal 0-9), DQUOTE (double quote), (CR LF), CTLs (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), NUL (null octet), HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), NUL (null octet),
OCTET (any 8-bit sequence of data except NUL), SP (space), HTAB OCTET (any 8-bit sequence of data except NUL), SP (space), HTAB
(horizontal tab), CHAR (any [USASCII] character), VCHAR (any visible (horizontal tab), CHAR (any [USASCII] character), VCHAR (any visible
[USASCII] character), and WSP (whitespace). [USASCII] character), and WSP (whitespace).
The OWS (optional whitespace) and BWS (bad whitespace) rules are The OWS (optional whitespace) and BWS (bad whitespace) rules are
defined in Section 3.2.3 of [RFC7230]. defined in Section 5.6.3 of [HTTPSEM].
2.3. Terminology 2.3. Terminology
The terms "user agent", "client", "server", "proxy", and "origin The terms "user agent", "client", "server", "proxy", and "origin
server" have the same meaning as in the HTTP/1.1 specification server" have the same meaning as in the HTTP/1.1 specification
([RFC7230], Section 2). ([HTTPSEM], Section 3).
The request-host is the name of the host, as known by the user agent, The request-host is the name of the host, as known by the user agent,
to which the user agent is sending an HTTP request or from which it to which the user agent is sending an HTTP request or from which it
is receiving an HTTP response (i.e., the name of the host to which it is receiving an HTTP response (i.e., the name of the host to which it
sent the corresponding HTTP request). sent the corresponding HTTP request).
The term request-uri refers to "request-target" as defined in The term request-uri refers to "target URI" as defined in Section 7.1
Section 5.3 of [RFC7230]. of [HTTPSEM].
Two sequences of octets are said to case-insensitively match each Two sequences of octets are said to case-insensitively match each
other if and only if they are equivalent under the i;ascii-casemap other if and only if they are equivalent under the i;ascii-casemap
collation defined in [RFC4790]. collation defined in [RFC4790].
The term string means a sequence of non-NUL octets. The term string means a sequence of non-NUL octets.
The terms "active document", "ancestor browsing context", "browsing The terms "active document", "ancestor browsing context", "browsing
context", "dedicated worker", "Document", "WorkerGlobalScope", context", "dedicated worker", "Document", "nested browsing context",
"sandboxed origin browsing context flag", "parent browsing context", "opaque origin", "parent browsing context", "sandboxed origin
"shared worker", "the worker's Documents", "nested browsing context", browsing context flag", "shared worker", "the worker's Documents",
and "top-level browsing context" are defined in [HTML]. "top-level browsing context", and "WorkerGlobalScope" are defined in
[HTML].
"Service Workers" are defined in the Service Workers specification "Service Workers" are defined in the Service Workers specification
[SERVICE-WORKERS]. [SERVICE-WORKERS].
The term "origin", the mechanism of deriving an origin from a URI, The term "origin", the mechanism of deriving an origin from a URI,
and the "the same" matching algorithm for origins are defined in and the "the same" matching algorithm for origins are defined in
[RFC6454]. [RFC6454].
"Safe" HTTP methods include "GET", "HEAD", "OPTIONS", and "TRACE", as "Safe" HTTP methods include "GET", "HEAD", "OPTIONS", and "TRACE", as
defined in Section 4.2.1 of [RFC7231]. defined in Section 9.2.1 of [HTTPSEM].
A domain's "public suffix" is the portion of a domain that is A domain's "public suffix" is the portion of a domain that is
controlled by a public registry, such as "com", "co.uk", and controlled by a public registry, such as "com", "co.uk", and
"pvt.k12.wy.us". A domain's "registrable domain" is the domain's "pvt.k12.wy.us". A domain's "registrable domain" is the domain's
public suffix plus the label to its left. That is, for public suffix plus the label to its left. That is, for
"https://www.site.example", the public suffix is "example", and the "https://www.site.example", the public suffix is "example", and the
registrable domain is "site.example". Whenever possible, user agents registrable domain is "site.example". Whenever possible, user agents
SHOULD use an up-to-date public suffix list, such as the one SHOULD use an up-to-date public suffix list, such as the one
maintained by the Mozilla project at [PSL]. maintained by the Mozilla project at [PSL].
The term "request", as well as a request's "client", "current url", The term "request", as well as a request's "client", "current url",
"method", and "target browsing context", are defined in [FETCH]. "method", "target browsing context", and "url list", are defined in
[FETCH].
The term "non-HTTP APIs" refers to non-HTTP mechanisms used to set
and retrieve cookies, such as a web browser API that exposes cookies
to scripts.
3. Overview 3. Overview
This section outlines a way for an origin server to send state This section outlines a way for an origin server to send state
information to a user agent and for the user agent to return the information to a user agent and for the user agent to return the
state information to the origin server. state information to the origin server.
To store state, the origin server includes a Set-Cookie header in an To store state, the origin server includes a Set-Cookie header field
HTTP response. In subsequent requests, the user agent returns a in an HTTP response. In subsequent requests, the user agent returns
Cookie request header to the origin server. The Cookie header a Cookie request header field to the origin server. The Cookie
contains cookies the user agent received in previous Set-Cookie header field contains cookies the user agent received in previous
headers. The origin server is free to ignore the Cookie header or Set-Cookie header fields. The origin server is free to ignore the
use its contents for an application-defined purpose. Cookie header field or use its contents for an application-defined
purpose.
Origin servers MAY send a Set-Cookie response header with any Origin servers MAY send a Set-Cookie response header field with any
response. User agents MAY ignore Set-Cookie headers contained in response. An origin server can include multiple Set-Cookie header
responses with 100-level status codes but MUST process Set-Cookie fields in a single response. The presence of a Cookie or a Set-
headers contained in other responses (including responses with 400- Cookie header field does not preclude HTTP caches from storing and
and 500-level status codes). An origin server can include multiple reusing a response.
Set-Cookie header fields in a single response. The presence of a
Cookie or a Set-Cookie header field does not preclude HTTP caches
from storing and reusing a response.
Origin servers SHOULD NOT fold multiple Set-Cookie header fields into Origin servers SHOULD NOT fold multiple Set-Cookie header fields into
a single header field. The usual mechanism for folding HTTP headers a single header field. The usual mechanism for folding HTTP headers
fields (i.e., as defined in Section 3.2.2 of [RFC7230]) might change fields (i.e., as defined in Section 5.3 of [HTTPSEM]) might change
the semantics of the Set-Cookie header field because the %x2C (",") the semantics of the Set-Cookie header field because the %x2C (",")
character is used by Set-Cookie in a way that conflicts with such character is used by Set-Cookie in a way that conflicts with such
folding. folding.
User agents MAY ignore Set-Cookie header fieldss based on response
status codes or the user agent's cookie policy (see Section 5.3).
3.1. Examples 3.1. Examples
Using the Set-Cookie header, a server can send the user agent a short Using the Set-Cookie header field, a server can send the user agent a
string in an HTTP response that the user agent will return in future short string in an HTTP response that the user agent will return in
HTTP requests that are within the scope of the cookie. For example, future HTTP requests that are within the scope of the cookie. For
the server can send the user agent a "session identifier" named SID example, the server can send the user agent a "session identifier"
with the value 31d4d96e407aad42. The user agent then returns the named SID with the value 31d4d96e407aad42. The user agent then
session identifier in subsequent requests. returns the session identifier in subsequent requests.
== Server -> User Agent == == Server -> User Agent ==
Set-Cookie: SID=31d4d96e407aad42 Set-Cookie: SID=31d4d96e407aad42
== User Agent -> Server == == User Agent -> Server ==
Cookie: SID=31d4d96e407aad42 Cookie: SID=31d4d96e407aad42
The server can alter the default scope of the cookie using the Path The server can alter the default scope of the cookie using the Path
and Domain attributes. For example, the server can instruct the user and Domain attributes. For example, the server can instruct the user
agent to return the cookie to every path and every subdomain of agent to return the cookie to every path and every subdomain of
site.example. site.example.
== Server -> User Agent == == Server -> User Agent ==
Set-Cookie: SID=31d4d96e407aad42; Path=/; Domain=site.example Set-Cookie: SID=31d4d96e407aad42; Path=/; Domain=site.example
== User Agent -> Server == == User Agent -> Server ==
skipping to change at page 8, line 32 skipping to change at page 9, line 4
the more sensitive session identifier (see Section 4.1.2). the more sensitive session identifier (see Section 4.1.2).
== Server -> User Agent == == Server -> User Agent ==
Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly
Set-Cookie: lang=en-US; Path=/; Domain=site.example Set-Cookie: lang=en-US; Path=/; Domain=site.example
== User Agent -> Server == == User Agent -> Server ==
Cookie: SID=31d4d96e407aad42; lang=en-US Cookie: SID=31d4d96e407aad42; lang=en-US
Notice that the Cookie header field above contains two cookies, one
Notice that the Cookie header above contains two cookies, one named named SID and one named lang. If the server wishes the user agent to
SID and one named lang. If the server wishes the user agent to
persist the cookie over multiple "sessions" (e.g., user agent persist the cookie over multiple "sessions" (e.g., user agent
restarts), the server can specify an expiration date in the Expires restarts), the server can specify an expiration date in the Expires
attribute. Note that the user agent might delete the cookie before attribute. Note that the user agent might delete the cookie before
the expiration date if the user agent's cookie store exceeds its the expiration date if the user agent's cookie store exceeds its
quota or if the user manually deletes the server's cookie. quota or if the user manually deletes the server's cookie.
== Server -> User Agent == == Server -> User Agent ==
Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT
skipping to change at page 9, line 4 skipping to change at page 9, line 19
the expiration date if the user agent's cookie store exceeds its the expiration date if the user agent's cookie store exceeds its
quota or if the user manually deletes the server's cookie. quota or if the user manually deletes the server's cookie.
== Server -> User Agent == == Server -> User Agent ==
Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT
== User Agent -> Server == == User Agent -> Server ==
Cookie: SID=31d4d96e407aad42; lang=en-US Cookie: SID=31d4d96e407aad42; lang=en-US
Finally, to remove a cookie, the server returns a Set-Cookie header Finally, to remove a cookie, the server returns a Set-Cookie header
with an expiration date in the past. The server will be successful field with an expiration date in the past. The server will be
in removing the cookie only if the Path and the Domain attribute in successful in removing the cookie only if the Path and the Domain
the Set-Cookie header match the values used when the cookie was attribute in the Set-Cookie header field match the values used when
created. the cookie was created.
== Server -> User Agent == == Server -> User Agent ==
Set-Cookie: lang=; Expires=Sun, 06 Nov 1994 08:49:37 GMT Set-Cookie: lang=; Expires=Sun, 06 Nov 1994 08:49:37 GMT
== User Agent -> Server == == User Agent -> Server ==
Cookie: SID=31d4d96e407aad42 Cookie: SID=31d4d96e407aad42
4. Server Requirements 4. Server Requirements
This section describes the syntax and semantics of a well-behaved This section describes the syntax and semantics of a well-behaved
profile of the Cookie and Set-Cookie headers. profile of the Cookie and Set-Cookie header fields.
4.1. Set-Cookie 4.1. Set-Cookie
The Set-Cookie HTTP response header is used to send cookies from the The Set-Cookie HTTP response header field is used to send cookies
server to the user agent. from the server to the user agent.
4.1.1. Syntax 4.1.1. Syntax
Informally, the Set-Cookie response header contains the header name Informally, the Set-Cookie response header field contains a cookie,
"Set-Cookie" followed by a ":" and a cookie. Each cookie begins with which begins with a name-value-pair, followed by zero or more
a name-value-pair, followed by zero or more attribute-value pairs. attribute-value pairs. Servers SHOULD NOT send Set-Cookie header
Servers SHOULD NOT send Set-Cookie headers that fail to conform to fields that fail to conform to the following grammar:
the following grammar:
set-cookie-header = "Set-Cookie:" SP BWS set-cookie-string set-cookie = set-cookie-string
set-cookie-string = BWS cookie-pair *( BWS ";" OWS cookie-av ) set-cookie-string = BWS cookie-pair *( BWS ";" OWS cookie-av )
cookie-pair = cookie-name BWS "=" BWS cookie-value cookie-pair = cookie-name BWS "=" BWS cookie-value
cookie-name = 1*cookie-octet cookie-name = 1*cookie-octet
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
/ %x80-FF / %x80-FF
; octets excluding CTLs, ; octets excluding CTLs,
; whitespace DQUOTE, comma, semicolon, ; whitespace DQUOTE, comma, semicolon,
; and backslash ; and backslash
cookie-av = expires-av / max-age-av / domain-av / cookie-av = expires-av / max-age-av / domain-av /
path-av / secure-av / httponly-av / path-av / secure-av / httponly-av /
samesite-av / extension-av samesite-av / extension-av
expires-av = "Expires" BWS "=" BWS sane-cookie-date expires-av = "Expires" BWS "=" BWS sane-cookie-date
sane-cookie-date = sane-cookie-date =
<IMF-fixdate, defined in [RFC7231], Section 7.1.1.1> <IMF-fixdate, defined in [HTTPSEM], Section 5.6.7>
max-age-av = "Max-Age" BWS "=" BWS non-zero-digit *DIGIT max-age-av = "Max-Age" BWS "=" BWS non-zero-digit *DIGIT
; In practice, both expires-av and max-age-av ; In practice, both expires-av and max-age-av
; are limited to dates representable by the ; are limited to dates representable by the
; user agent. ; user agent.
non-zero-digit = %x31-39 non-zero-digit = %x31-39
; digits 1 through 9 ; digits 1 through 9
domain-av = "Domain" BWS "=" BWS domain-value domain-av = "Domain" BWS "=" BWS domain-value
domain-value = <subdomain> domain-value = <subdomain>
; defined in [RFC1034], Section 3.5, as ; defined in [RFC1034], Section 3.5, as
; enhanced by [RFC1123], Section 2.1 ; enhanced by [RFC1123], Section 2.1
skipping to change at page 11, line 8 skipping to change at page 11, line 8
The semantics of the cookie-value are not defined by this document. The semantics of the cookie-value are not defined by this document.
To maximize compatibility with user agents, servers that wish to To maximize compatibility with user agents, servers that wish to
store arbitrary data in a cookie-value SHOULD encode that data, for store arbitrary data in a cookie-value SHOULD encode that data, for
example, using Base64 [RFC4648]. example, using Base64 [RFC4648].
Per the grammar above, the cookie-value MAY be wrapped in DQUOTE Per the grammar above, the cookie-value MAY be wrapped in DQUOTE
characters. Note that in this case, the initial and trailing DQUOTE characters. Note that in this case, the initial and trailing DQUOTE
characters are not stripped. They are part of the cookie-value, and characters are not stripped. They are part of the cookie-value, and
will be included in Cookie headers sent to the server. will be included in Cookie header fields sent to the server.
The portions of the set-cookie-string produced by the cookie-av term The portions of the set-cookie-string produced by the cookie-av term
are known as attributes. To maximize compatibility with user agents, are known as attributes. To maximize compatibility with user agents,
servers SHOULD NOT produce two attributes with the same name in the servers SHOULD NOT produce two attributes with the same name in the
same set-cookie-string. (See Section 5.4 for how user agents handle same set-cookie-string. (See Section 5.5 for how user agents handle
this case.) this case.)
Servers SHOULD NOT include more than one Set-Cookie header field in Servers SHOULD NOT include more than one Set-Cookie header field in
the same response with the same cookie-name. (See Section 5.3 for the same response with the same cookie-name. (See Section 5.4 for
how user agents handle this case.) how user agents handle this case.)
If a server sends multiple responses containing Set-Cookie headers If a server sends multiple responses containing Set-Cookie header
concurrently to the user agent (e.g., when communicating with the fields concurrently to the user agent (e.g., when communicating with
user agent over multiple sockets), these responses create a "race the user agent over multiple sockets), these responses create a "race
condition" that can lead to unpredictable behavior. condition" that can lead to unpredictable behavior.
NOTE: Some existing user agents differ in their interpretation of NOTE: Some existing user agents differ in their interpretation of
two-digit years. To avoid compatibility issues, servers SHOULD use two-digit years. To avoid compatibility issues, servers SHOULD use
the rfc1123-date format, which requires a four-digit year. the rfc1123-date format, which requires a four-digit year.
NOTE: Some user agents store and process dates in cookies as 32-bit NOTE: Some user agents store and process dates in cookies as 32-bit
UNIX time_t values. Implementation bugs in the libraries supporting UNIX time_t values. Implementation bugs in the libraries supporting
time_t processing on some systems might cause such user agents to time_t processing on some systems might cause such user agents to
process dates after the year 2038 incorrectly. process dates after the year 2038 incorrectly.
4.1.2. Semantics (Non-Normative) 4.1.2. Semantics (Non-Normative)
This section describes simplified semantics of the Set-Cookie header. This section describes simplified semantics of the Set-Cookie header
These semantics are detailed enough to be useful for understanding field. These semantics are detailed enough to be useful for
the most common uses of cookies by servers. The full semantics are understanding the most common uses of cookies by servers. The full
described in Section 5. semantics are described in Section 5.
When the user agent receives a Set-Cookie header, the user agent When the user agent receives a Set-Cookie header field, the user
stores the cookie together with its attributes. Subsequently, when agent stores the cookie together with its attributes. Subsequently,
the user agent makes an HTTP request, the user agent includes the when the user agent makes an HTTP request, the user agent includes
applicable, non-expired cookies in the Cookie header. the applicable, non-expired cookies in the Cookie header field.
If the user agent receives a new cookie with the same cookie-name, If the user agent receives a new cookie with the same cookie-name,
domain-value, and path-value as a cookie that it has already stored, domain-value, and path-value as a cookie that it has already stored,
the existing cookie is evicted and replaced with the new cookie. the existing cookie is evicted and replaced with the new cookie.
Notice that servers can delete cookies by sending the user agent a Notice that servers can delete cookies by sending the user agent a
new cookie with an Expires attribute with a value in the past. new cookie with an Expires attribute with a value in the past.
Unless the cookie's attributes indicate otherwise, the cookie is Unless the cookie's attributes indicate otherwise, the cookie is
returned only to the origin server (and not, for example, to any returned only to the origin server (and not, for example, to any
subdomains), and it expires at the end of the current session (as subdomains), and it expires at the end of the current session (as
skipping to change at page 12, line 42 skipping to change at page 12, line 42
Age attribute has precedence and controls the expiration date of the Age attribute has precedence and controls the expiration date of the
cookie. If a cookie has neither the Max-Age nor the Expires cookie. If a cookie has neither the Max-Age nor the Expires
attribute, the user agent will retain the cookie until "the current attribute, the user agent will retain the cookie until "the current
session is over" (as defined by the user agent). session is over" (as defined by the user agent).
4.1.2.3. The Domain Attribute 4.1.2.3. The Domain Attribute
The Domain attribute specifies those hosts to which the cookie will The Domain attribute specifies those hosts to which the cookie will
be sent. For example, if the value of the Domain attribute is be sent. For example, if the value of the Domain attribute is
"site.example", the user agent will include the cookie in the Cookie "site.example", the user agent will include the cookie in the Cookie
header when making HTTP requests to site.example, www.site.example, header field when making HTTP requests to site.example,
and www.corp.site.example. (Note that a leading %x2E ("."), if www.site.example, and www.corp.site.example. (Note that a leading
present, is ignored even though that character is not permitted, but %x2E ("."), if present, is ignored even though that character is not
a trailing %x2E ("."), if present, will cause the user agent to permitted, but a trailing %x2E ("."), if present, will cause the user
ignore the attribute.) If the server omits the Domain attribute, the agent to ignore the attribute.) If the server omits the Domain
user agent will return the cookie only to the origin server. attribute, the user agent will return the cookie only to the origin
server.
WARNING: Some existing user agents treat an absent Domain attribute WARNING: Some existing user agents treat an absent Domain attribute
as if the Domain attribute were present and contained the current as if the Domain attribute were present and contained the current
host name. For example, if site.example returns a Set-Cookie header host name. For example, if site.example returns a Set-Cookie header
without a Domain attribute, these user agents will erroneously send field without a Domain attribute, these user agents will erroneously
the cookie to www.site.example as well. send the cookie to www.site.example as well.
The user agent will reject cookies unless the Domain attribute The user agent will reject cookies unless the Domain attribute
specifies a scope for the cookie that would include the origin specifies a scope for the cookie that would include the origin
server. For example, the user agent will accept a cookie with a server. For example, the user agent will accept a cookie with a
Domain attribute of "site.example" or of "foo.site.example" from Domain attribute of "site.example" or of "foo.site.example" from
foo.site.example, but the user agent will not accept a cookie with a foo.site.example, but the user agent will not accept a cookie with a
Domain attribute of "bar.site.example" or of "baz.foo.site.example". Domain attribute of "bar.site.example" or of "baz.foo.site.example".
NOTE: For security reasons, many user agents are configured to reject NOTE: For security reasons, many user agents are configured to reject
Domain attributes that correspond to "public suffixes". For example, Domain attributes that correspond to "public suffixes". For example,
some user agents will reject Domain attributes of "com" or "co.uk". some user agents will reject Domain attributes of "com" or "co.uk".
(See Section 5.4 for more information.) (See Section 5.5 for more information.)
4.1.2.4. The Path Attribute 4.1.2.4. The Path Attribute
The scope of each cookie is limited to a set of paths, controlled by The scope of each cookie is limited to a set of paths, controlled by
the Path attribute. If the server omits the Path attribute, the user the Path attribute. If the server omits the Path attribute, the user
agent will use the "directory" of the request-uri's path component as agent will use the "directory" of the request-uri's path component as
the default value. (See Section 5.1.4 for more details.) the default value. (See Section 5.1.4 for more details.)
The user agent will include the cookie in an HTTP request only if the The user agent will include the cookie in an HTTP request only if the
path portion of the request-uri matches (or is a subdirectory of) the path portion of the request-uri matches (or is a subdirectory of) the
skipping to change at page 14, line 9 skipping to change at page 14, line 9
Although seemingly useful for protecting cookies from active network Although seemingly useful for protecting cookies from active network
attackers, the Secure attribute protects only the cookie's attackers, the Secure attribute protects only the cookie's
confidentiality. An active network attacker can overwrite Secure confidentiality. An active network attacker can overwrite Secure
cookies from an insecure channel, disrupting their integrity (see cookies from an insecure channel, disrupting their integrity (see
Section 8.6 for more details). Section 8.6 for more details).
4.1.2.6. The HttpOnly Attribute 4.1.2.6. The HttpOnly Attribute
The HttpOnly attribute limits the scope of the cookie to HTTP The HttpOnly attribute limits the scope of the cookie to HTTP
requests. In particular, the attribute instructs the user agent to requests. In particular, the attribute instructs the user agent to
omit the cookie when providing access to cookies via "non-HTTP" APIs omit the cookie when providing access to cookies via non-HTTP APIs.
(such as a web browser API that exposes cookies to scripts).
Note that the HttpOnly attribute is independent of the Secure Note that the HttpOnly attribute is independent of the Secure
attribute: a cookie can have both the HttpOnly and the Secure attribute: a cookie can have both the HttpOnly and the Secure
attribute. attribute.
4.1.2.7. The SameSite Attribute 4.1.2.7. The SameSite Attribute
The "SameSite" attribute limits the scope of the cookie such that it The "SameSite" attribute limits the scope of the cookie such that it
will only be attached to requests if those requests are same-site, as will only be attached to requests if those requests are same-site, as
defined by the algorithm in Section 5.2. For example, requests for defined by the algorithm in Section 5.2. For example, requests for
"https://site.example/sekrit-image" will attach same-site cookies if "https://site.example/sekrit-image" will attach same-site cookies if
and only if initiated from a context whose "site for cookies" is an and only if initiated from a context whose "site for cookies" is an
origin with a scheme and registered domain of "https" and origin with a scheme and registered domain of "https" and
"site.example" respectively. "site.example" respectively.
If the "SameSite" attribute's value is "Strict", the cookie will only If the "SameSite" attribute's value is "Strict", the cookie will only
be sent along with "same-site" requests. If the value is "Lax", the be sent along with "same-site" requests. If the value is "Lax", the
cookie will be sent with same-site requests, and with "cross-site" cookie will be sent with same-site requests, and with "cross-site"
top-level navigations, as described in Section 5.3.7.1. If the value top-level navigations, as described in Section 5.4.7.1. If the value
is "None", the cookie will be sent with same-site and cross-site is "None", the cookie will be sent with same-site and cross-site
requests. If the "SameSite" attribute's value is something other requests. If the "SameSite" attribute's value is something other
than these three known keywords, the attribute's value will be than these three known keywords, the attribute's value will be
subject to a default enforcement mode that is equivalent to "Lax". subject to a default enforcement mode that is equivalent to "Lax".
The "SameSite" attribute affects cookie creation as well as delivery. The "SameSite" attribute affects cookie creation as well as delivery.
Cookies which assert "SameSite=Lax" or "SameSite=Strict" cannot be Cookies which assert "SameSite=Lax" or "SameSite=Strict" cannot be
set in responses to cross-site subresource requests, or cross-site set in responses to cross-site subresource requests, or cross-site
nested navigations. They can be set along with any top-level nested navigations. They can be set along with any top-level
navigation, cross-site or otherwise. navigation, cross-site or otherwise.
skipping to change at page 14, line 52 skipping to change at page 14, line 51
Section 8.5 and Section 8.6 of this document spell out some of the Section 8.5 and Section 8.6 of this document spell out some of the
drawbacks of cookies' historical implementation. In particular, it drawbacks of cookies' historical implementation. In particular, it
is impossible for a server to have confidence that a given cookie was is impossible for a server to have confidence that a given cookie was
set with a particular set of attributes. In order to provide such set with a particular set of attributes. In order to provide such
confidence in a backwards-compatible way, two common sets of confidence in a backwards-compatible way, two common sets of
requirements can be inferred from the first few characters of the requirements can be inferred from the first few characters of the
cookie's name. cookie's name.
The normative requirements for the prefixes described below are The normative requirements for the prefixes described below are
detailed in the storage model algorithm defined in Section 5.4. detailed in the storage model algorithm defined in Section 5.5.
4.1.3.1. The "__Secure-" Prefix 4.1.3.1. The "__Secure-" Prefix
If a cookie's name begins with a case-sensitive match for the string If a cookie's name begins with a case-sensitive match for the string
"__Secure-", then the cookie will have been set with a "Secure" "__Secure-", then the cookie will have been set with a "Secure"
attribute. attribute.
For example, the following "Set-Cookie" header would be rejected by a For example, the following "Set-Cookie" header field would be
conformant user agent, as it does not have a "Secure" attribute. rejected by a conformant user agent, as it does not have a "Secure"
attribute.
Set-Cookie: __Secure-SID=12345; Domain=site.example Set-Cookie: __Secure-SID=12345; Domain=site.example
Whereas the following "Set-Cookie" header would be accepted: Whereas the following "Set-Cookie" header field would be accepted:
Set-Cookie: __Secure-SID=12345; Domain=site.example; Secure Set-Cookie: __Secure-SID=12345; Domain=site.example; Secure
4.1.3.2. The "__Host-" Prefix 4.1.3.2. The "__Host-" Prefix
If a cookie's name begins with a case-sensitive match for the string If a cookie's name begins with a case-sensitive match for the string
"__Host-", then the cookie will have been set with a "Secure" "__Host-", then the cookie will have been set with a "Secure"
attribute, a "Path" attribute with a value of "/", and no "Domain" attribute, a "Path" attribute with a value of "/", and no "Domain"
attribute. attribute.
skipping to change at page 16, line 10 skipping to change at page 16, line 10
While the following would be accepted if set from a secure origin While the following would be accepted if set from a secure origin
(e.g. "https://site.example/"), and rejected otherwise: (e.g. "https://site.example/"), and rejected otherwise:
Set-Cookie: __Host-SID=12345; Secure; Path=/ Set-Cookie: __Host-SID=12345; Secure; Path=/
4.2. Cookie 4.2. Cookie
4.2.1. Syntax 4.2.1. Syntax
The user agent sends stored cookies to the origin server in the The user agent sends stored cookies to the origin server in the
Cookie header. If the server conforms to the requirements in Cookie header field. If the server conforms to the requirements in
Section 4.1 (and the user agent conforms to the requirements in Section 4.1 (and the user agent conforms to the requirements in
Section 5), the user agent will send a Cookie header that conforms to Section 5), the user agent will send a Cookie header field that
the following grammar: conforms to the following grammar:
cookie-header = "Cookie:" SP cookie-string cookie = cookie-string
cookie-string = cookie-pair *( ";" SP cookie-pair ) cookie-string = cookie-pair *( ";" SP cookie-pair )
4.2.2. Semantics 4.2.2. Semantics
Each cookie-pair represents a cookie stored by the user agent. The Each cookie-pair represents a cookie stored by the user agent. The
cookie-pair contains the cookie-name and cookie-value the user agent cookie-pair contains the cookie-name and cookie-value the user agent
received in the Set-Cookie header. received in the Set-Cookie header field.
Notice that the cookie attributes are not returned. In particular, Notice that the cookie attributes are not returned. In particular,
the server cannot determine from the Cookie header alone when a the server cannot determine from the Cookie field alone when a cookie
cookie will expire, for which hosts the cookie is valid, for which will expire, for which hosts the cookie is valid, for which paths the
paths the cookie is valid, or whether the cookie was set with the cookie is valid, or whether the cookie was set with the Secure or
Secure or HttpOnly attributes. HttpOnly attributes.
The semantics of individual cookies in the Cookie header are not The semantics of individual cookies in the Cookie header field are
defined by this document. Servers are expected to imbue these not defined by this document. Servers are expected to imbue these
cookies with application-specific semantics. cookies with application-specific semantics.
Although cookies are serialized linearly in the Cookie header, Although cookies are serialized linearly in the Cookie header field,
servers SHOULD NOT rely upon the serialization order. In particular, servers SHOULD NOT rely upon the serialization order. In particular,
if the Cookie header contains two cookies with the same name (e.g., if the Cookie header field contains two cookies with the same name
that were set with different Path or Domain attributes), servers (e.g., that were set with different Path or Domain attributes),
SHOULD NOT rely upon the order in which these cookies appear in the servers SHOULD NOT rely upon the order in which these cookies appear
header. in the header field.
5. User Agent Requirements 5. User Agent Requirements
This section specifies the Cookie and Set-Cookie headers in This section specifies the Cookie and Set-Cookie header fields in
sufficient detail that a user agent implementing these requirements sufficient detail that a user agent implementing these requirements
precisely can interoperate with existing servers (even those that do precisely can interoperate with existing servers (even those that do
not conform to the well-behaved profile described in Section 4). not conform to the well-behaved profile described in Section 4).
A user agent could enforce more restrictions than those specified A user agent could enforce more restrictions than those specified
herein (e.g., for the sake of improved security); however, herein (e.g., restrictions specified by its cookie policy, described
experiments have shown that such strictness reduces the likelihood in Section 7.2). However, such additional restrictions may reduce
that a user agent will be able to interoperate with existing servers. the likelihood that a user agent will be able to interoperate with
existing servers.
5.1. Subcomponent Algorithms 5.1. Subcomponent Algorithms
This section defines some algorithms used by user agents to process This section defines some algorithms used by user agents to process
specific subcomponents of the Cookie and Set-Cookie headers. specific subcomponents of the Cookie and Set-Cookie header fields.
5.1.1. Dates 5.1.1. Dates
The user agent MUST use an algorithm equivalent to the following The user agent MUST use an algorithm equivalent to the following
algorithm to parse a cookie-date. Note that the various boolean algorithm to parse a cookie-date. Note that the various boolean
flags defined as a part of the algorithm (i.e., found-time, found- flags defined as a part of the algorithm (i.e., found-time, found-
day-of-month, found-month, found-year) are initially "not set". day-of-month, found-month, found-year) are initially "not set".
1. Using the grammar below, divide the cookie-date into date-tokens. 1. Using the grammar below, divide the cookie-date into date-tokens.
cookie-date = *delimiter date-token-list *delimiter cookie-date = *delimiter date-token-list *delimiter
date-token-list = date-token *( 1*delimiter date-token ) date-token-list = date-token *( 1*delimiter date-token )
date-token = 1*non-delimiter date-token = 1*non-delimiter
delimiter = %x09 / %x20-2F / %x3B-40 / %x5B-60 / %x7B-7E delimiter = %x09 / %x20-2F / %x3B-40 / %x5B-60 / %x7B-7E
non-delimiter = %x00-08 / %x0A-1F / DIGIT / ":" / ALPHA / %x7F-FF non-delimiter = %x00-08 / %x0A-1F / DIGIT / ":" / ALPHA / %x7F-FF
non-digit = %x00-2F / %x3A-FF non-digit = %x00-2F / %x3A-FF
day-of-month = 1*2DIGIT [ non-digit *OCTET ] day-of-month = 1*2DIGIT [ non-digit *OCTET ]
month = ( "jan" / "feb" / "mar" / "apr" / month = ( "jan" / "feb" / "mar" / "apr" /
"may" / "jun" / "jul" / "aug" / "may" / "jun" / "jul" / "aug" /
"sep" / "oct" / "nov" / "dec" ) *OCTET "sep" / "oct" / "nov" / "dec" ) *OCTET
year = 2*4DIGIT [ non-digit *OCTET ] year = 2*4DIGIT [ non-digit *OCTET ]
time = hms-time [ non-digit *OCTET ] time = hms-time [ non-digit *OCTET ]
hms-time = time-field ":" time-field ":" time-field hms-time = time-field ":" time-field ":" time-field
time-field = 1*2DIGIT time-field = 1*2DIGIT
2. Process each date-token sequentially in the order the date-tokens 2. Process each date-token sequentially in the order the date-tokens
appear in the cookie-date: appear in the cookie-date:
1. If the found-time flag is not set and the token matches the 1. If the found-time flag is not set and the token matches the
time production, set the found-time flag and set the hour- time production, set the found-time flag and set the hour-
value, minute-value, and second-value to the numbers denoted value, minute-value, and second-value to the numbers denoted
by the digits in the date-token, respectively. Skip the by the digits in the date-token, respectively. Skip the
remaining sub-steps and continue to the next date-token. remaining sub-steps and continue to the next date-token.
skipping to change at page 19, line 41 skipping to change at page 19, line 41
domain string is a %x2E (".") character. domain string is a %x2E (".") character.
- The string is a host name (i.e., not an IP address). - The string is a host name (i.e., not an IP address).
5.1.4. Paths and Path-Match 5.1.4. Paths and Path-Match
The user agent MUST use an algorithm equivalent to the following The user agent MUST use an algorithm equivalent to the following
algorithm to compute the default-path of a cookie: algorithm to compute the default-path of a cookie:
1. Let uri-path be the path portion of the request-uri if such a 1. Let uri-path be the path portion of the request-uri if such a
portion exists (and empty otherwise). For example, if the portion exists (and empty otherwise).
request-uri contains just a path (and optional query string),
then the uri-path is that path (without the %x3F ("?") character
or query string), and if the request-uri contains a full
absoluteURI, the uri-path is the path component of that URI.
2. If the uri-path is empty or if the first character of the uri- 2. If the uri-path is empty or if the first character of the uri-
path is not a %x2F ("/") character, output %x2F ("/") and skip path is not a %x2F ("/") character, output %x2F ("/") and skip
the remaining steps. the remaining steps.
3. If the uri-path contains no more than one %x2F ("/") character, 3. If the uri-path contains no more than one %x2F ("/") character,
output %x2F ("/") and skip the remaining step. output %x2F ("/") and skip the remaining step.
4. Output the characters of the uri-path from the first character up 4. Output the characters of the uri-path from the first character up
to, but not including, the right-most %x2F ("/"). to, but not including, the right-most %x2F ("/").
skipping to change at page 20, line 26 skipping to change at page 20, line 23
* The cookie-path is a prefix of the request-path, and the last * The cookie-path is a prefix of the request-path, and the last
character of the cookie-path is %x2F ("/"). character of the cookie-path is %x2F ("/").
* The cookie-path is a prefix of the request-path, and the first * The cookie-path is a prefix of the request-path, and the first
character of the request-path that is not included in the cookie- character of the request-path that is not included in the cookie-
path is a %x2F ("/") character. path is a %x2F ("/") character.
5.2. "Same-site" and "cross-site" Requests 5.2. "Same-site" and "cross-site" Requests
Two origins, A and B, are considered same-site if the following Two origins are same-site if they satisfy the "same site" criteria
algorithm returns true: defined in [SAMESITE]. A request is "same-site" if the following
criteria are true:
1. If A and B are both the same globally unique identifier, return
true.
2. If A and B are both scheme/host/port triples:
1. If A's scheme does not equal B's scheme, return false.
2. Let hostA be A's host, and hostB be B's host.
3. If hostA equals hostB and hostA's registrable domain is null,
return true.
4. If hostA's registrable domain equals hostB's registrable 1. The request is not the result of a cross-site redirect. That is,
domain and is non-null, return true. the origin of every url in the request's url list is same-site
with the request's current url's origin.
3. Return false. 2. The request is not the result of a reload navigation triggered
through a user interface element (as defined by the user agent;
e.g., a request triggered by the user clicking a refresh button
on a toolbar).
Note: The port component of the origins is not considered. 3. The request's current url's origin is same-site with the
request's client's "site for cookies" (which is an origin), or if
the request has no client or the request's client is null.
A request is "same-site" if its target's URI's origin is same-site Requests which are the result of a reload navigation triggered
with the request's client's "site for cookies" (which is an origin), through a user interface element are same-site if the reloaded
or if the request has no client. The request is otherwise "cross- document was originally navigated to via a same-site request. A
site". request that is not "same-site" is instead "cross-site".
The request's client's "site for cookies" is calculated depending The request's client's "site for cookies" is calculated depending
upon its client's type, as described in the following subsections: upon its client's type, as described in the following subsections:
5.2.1. Document-based requests 5.2.1. Document-based requests
The URI displayed in a user agent's address bar is the only security The URI displayed in a user agent's address bar is the only security
context directly exposed to users, and therefore the only signal context directly exposed to users, and therefore the only signal
users can reasonably rely upon to determine whether or not they trust users can reasonably rely upon to determine whether or not they trust
a particular website. The origin of that URI represents the context a particular website. The origin of that URI represents the context
skipping to change at page 21, line 28 skipping to change at page 21, line 25
For a document displayed in a top-level browsing context, we can stop For a document displayed in a top-level browsing context, we can stop
here: the document's "site for cookies" is the top-level origin. here: the document's "site for cookies" is the top-level origin.
For documents which are displayed in nested browsing contexts, we For documents which are displayed in nested browsing contexts, we
need to audit the origins of each of a document's ancestor browsing need to audit the origins of each of a document's ancestor browsing
contexts' active documents in order to account for the "multiple- contexts' active documents in order to account for the "multiple-
nested scenarios" described in Section 4 of [RFC7034]. A document's nested scenarios" described in Section 4 of [RFC7034]. A document's
"site for cookies" is the top-level origin if and only if the top- "site for cookies" is the top-level origin if and only if the top-
level origin is same-site with the document's origin, and with each level origin is same-site with the document's origin, and with each
of the document's ancestor documents' origins. Otherwise its "site of the document's ancestor documents' origins. Otherwise its "site
for cookies" is an origin set to a globally unique identifier. for cookies" is an origin set to an opaque origin.
Given a Document ("document"), the following algorithm returns its Given a Document ("document"), the following algorithm returns its
"site for cookies": "site for cookies":
1. Let "top-document" be the active document in "document"'s 1. Let "top-document" be the active document in "document"'s
browsing context's top-level browsing context. browsing context's top-level browsing context.
2. Let "top-origin" be the origin of "top-document"'s URI if "top- 2. Let "top-origin" be the origin of "top-document"'s URI if "top-
document"'s sandboxed origin browsing context flag is set, and document"'s sandboxed origin browsing context flag is set, and
"top-document"'s origin otherwise. "top-document"'s origin otherwise.
skipping to change at page 21, line 50 skipping to change at page 21, line 47
3. Let "documents" be a list containing "document" and each of 3. Let "documents" be a list containing "document" and each of
"document"'s ancestor browsing contexts' active documents. "document"'s ancestor browsing contexts' active documents.
4. For each "item" in "documents": 4. For each "item" in "documents":
1. Let "origin" be the origin of "item"'s URI if "item"'s 1. Let "origin" be the origin of "item"'s URI if "item"'s
sandboxed origin browsing context flag is set, and "item"'s sandboxed origin browsing context flag is set, and "item"'s
origin otherwise. origin otherwise.
2. If "origin" is not same-site with "top-origin", return an 2. If "origin" is not same-site with "top-origin", return an
origin set to a globally unique identifier. origin set to an opaque origin.
5. Return "top-origin". 5. Return "top-origin".
5.2.2. Worker-based requests 5.2.2. Worker-based requests
Worker-driven requests aren't as clear-cut as document-driven Worker-driven requests aren't as clear-cut as document-driven
requests, as there isn't a clear link between a top-level browsing requests, as there isn't a clear link between a top-level browsing
context and a worker. This is especially true for Service Workers context and a worker. This is especially true for Service Workers
[SERVICE-WORKERS], which may execute code in the background, without [SERVICE-WORKERS], which may execute code in the background, without
any document visible at all. any document visible at all.
skipping to change at page 22, line 28 skipping to change at page 22, line 28
5.2.2.1. Dedicated and Shared Workers 5.2.2.1. Dedicated and Shared Workers
Dedicated workers are simple, as each dedicated worker is bound to Dedicated workers are simple, as each dedicated worker is bound to
one and only one document. Requests generated from a dedicated one and only one document. Requests generated from a dedicated
worker (via "importScripts", "XMLHttpRequest", "fetch()", etc) define worker (via "importScripts", "XMLHttpRequest", "fetch()", etc) define
their "site for cookies" as that document's "site for cookies". their "site for cookies" as that document's "site for cookies".
Shared workers may be bound to multiple documents at once. As it is Shared workers may be bound to multiple documents at once. As it is
quite possible for those documents to have distinct "site for quite possible for those documents to have distinct "site for
cookies" values, the worker's "site for cookies" will be an origin cookies" values, the worker's "site for cookies" will be an origin
set to a globally unique identifier in cases where the values are not set to an opaque origin in cases where the values are not all same-
all same-site with the worker's origin, and the worker's origin in site with the worker's origin, and the worker's origin in cases where
cases where the values agree. the values agree.
Given a WorkerGlobalScope ("worker"), the following algorithm returns Given a WorkerGlobalScope ("worker"), the following algorithm returns
its "site for cookies": its "site for cookies":
1. Let "site" be "worker"'s origin. 1. Let "site" be "worker"'s origin.
2. For each "document" in "worker"'s Documents: 2. For each "document" in "worker"'s Documents:
1. Let "document-site" be "document"'s "site for cookies" (as 1. Let "document-site" be "document"'s "site for cookies" (as
defined in Section 5.2.1). defined in Section 5.2.1).
2. If "document-site" is not same-site with "site", return an 2. If "document-site" is not same-site with "site", return an
origin set to a globally unique identifier. origin set to an opaque origin.
3. Return "site". 3. Return "site".
5.2.2.2. Service Workers 5.2.2.2. Service Workers
Service Workers are more complicated, as they act as a completely Service Workers are more complicated, as they act as a completely
separate execution context with only tangential relationship to the separate execution context with only tangential relationship to the
Document which registered them. Document which registered them.
Requests which simply pass through a Service Worker will be handled Requests which simply pass through a Service Worker will be handled
skipping to change at page 23, line 20 skipping to change at page 23, line 20
Requests which are initiated by the Service Worker itself (via a Requests which are initiated by the Service Worker itself (via a
direct call to "fetch()", for instance), on the other hand, will have direct call to "fetch()", for instance), on the other hand, will have
a client which is a ServiceWorkerGlobalScope. Its "site for cookies" a client which is a ServiceWorkerGlobalScope. Its "site for cookies"
will be the Service Worker's URI's origin. will be the Service Worker's URI's origin.
Given a ServiceWorkerGlobalScope ("worker"), the following algorithm Given a ServiceWorkerGlobalScope ("worker"), the following algorithm
returns its "site for cookies": returns its "site for cookies":
1. Return "worker"'s origin. 1. Return "worker"'s origin.
5.3. The Set-Cookie Header 5.3. Ignoring Set-Cookie Header Fields
User agents MAY ignore Set-Cookie header fields contained in
responses with 100-level status codes or based on its cookie policy
(see Section 7.2).
All other Set-Cookie header fields SHOULD be processed according to
Section 5.4. That is, Set-Cookie header fields contained in
responses with non-100-level status codes (including those in
responses with 400- and 500-level status codes) SHOULD be processed
unless ignored according to the user agent's cookie policy.
5.4. The Set-Cookie Header Field
When a user agent receives a Set-Cookie header field in an HTTP When a user agent receives a Set-Cookie header field in an HTTP
response, the user agent MAY ignore the Set-Cookie header field in response, the user agent MAY ignore the Set-Cookie header field in
its entirety. For example, the user agent might wish to block its entirety (see Section 5.3).
responses to "third-party" requests from setting cookies (see
Section 7.1).
If the user agent does not ignore the Set-Cookie header field in its If the user agent does not ignore the Set-Cookie header field in its
entirety, the user agent MUST parse the field-value of the Set-Cookie entirety, the user agent MUST parse the field-value of the Set-Cookie
header field as a set-cookie-string (defined below). header field as a set-cookie-string (defined below).
NOTE: The algorithm below is more permissive than the grammar in NOTE: The algorithm below is more permissive than the grammar in
Section 4.1. For example, the algorithm strips leading and trailing Section 4.1. For example, the algorithm strips leading and trailing
whitespace from the cookie name and value (but maintains internal whitespace from the cookie name and value (but maintains internal
whitespace), whereas the grammar in Section 4.1 forbids whitespace in whitespace), whereas the grammar in Section 4.1 forbids whitespace in
these positions. User agents use this algorithm so as to these positions. In addition, the algorithm below accommodates some
interoperate with servers that do not follow the recommendations in characters that are not cookie-octets according to the grammar in
Section 4. Section 4.1. User agents use this algorithm so as to interoperate
with servers that do not follow the recommendations in Section 4.
NOTE: As set-cookie-string may originate from a non-HTTP API, it is
not guaranteed to be free of CTL characters, so this algorithm
handles them explicitly.
A user agent MUST use an algorithm equivalent to the following A user agent MUST use an algorithm equivalent to the following
algorithm to parse a set-cookie-string: algorithm to parse a set-cookie-string:
1. If the set-cookie-string contains a %x3B (";") character: 1. If the set-cookie-string contains a %x0D (CR), %x0A (LF), or %x00
(NUL) octet, then set the set-cookie-string equal to all the
characters of set-cookie-string up to, but not including, the
first such octet.
2. If the set-cookie-string contains a %x00-1F / %x7F (CTL)
character: Abort these steps and ignore the set-cookie-string
entirely.
3. If the set-cookie-string contains a %x3B (";") character:
1. The name-value-pair string consists of the characters up to, 1. The name-value-pair string consists of the characters up to,
but not including, the first %x3B (";"), and the unparsed- but not including, the first %x3B (";"), and the unparsed-
attributes consist of the remainder of the set-cookie-string attributes consist of the remainder of the set-cookie-string
(including the %x3B (";") in question). (including the %x3B (";") in question).
Otherwise: Otherwise:
1. The name-value-pair string consists of all the characters 1. The name-value-pair string consists of all the characters
contained in the set-cookie-string, and the unparsed- contained in the set-cookie-string, and the unparsed-
attributes is the empty string. attributes is the empty string.
2. If the name-value-pair string lacks a %x3D ("=") character, then 4. If the name-value-pair string lacks a %x3D ("=") character, then
the name string is empty, and the value string is the value of the name string is empty, and the value string is the value of
name-value-pair. name-value-pair.
Otherwise, the name string consists of the characters up to, but Otherwise, the name string consists of the characters up to, but
not including, the first %x3D ("=") character, and the (possibly not including, the first %x3D ("=") character, and the (possibly
empty) value string consists of the characters after the first empty) value string consists of the characters after the first
%x3D ("=") character. %x3D ("=") character.
3. Remove any leading or trailing WSP characters from the name 5. Remove any leading or trailing WSP characters from the name
string and the value string. string and the value string.
4. The cookie-name is the name string, and the cookie-value is the 6. The cookie-name is the name string, and the cookie-value is the
value string. value string.
The user agent MUST use an algorithm equivalent to the following The user agent MUST use an algorithm equivalent to the following
algorithm to parse the unparsed-attributes: algorithm to parse the unparsed-attributes:
1. If the unparsed-attributes string is empty, skip the rest of 1. If the unparsed-attributes string is empty, skip the rest of
these steps. these steps.
2. Discard the first character of the unparsed-attributes (which 2. Discard the first character of the unparsed-attributes (which
will be a %x3B (";") character). will be a %x3B (";") character).
skipping to change at page 25, line 22 skipping to change at page 25, line 48
6. Process the attribute-name and attribute-value according to the 6. Process the attribute-name and attribute-value according to the
requirements in the following subsections. (Notice that requirements in the following subsections. (Notice that
attributes with unrecognized attribute-names are ignored.) attributes with unrecognized attribute-names are ignored.)
7. Return to Step 1 of this algorithm. 7. Return to Step 1 of this algorithm.
When the user agent finishes parsing the set-cookie-string, the user When the user agent finishes parsing the set-cookie-string, the user
agent is said to "receive a cookie" from the request-uri with name agent is said to "receive a cookie" from the request-uri with name
cookie-name, value cookie-value, and attributes cookie-attribute- cookie-name, value cookie-value, and attributes cookie-attribute-
list. (See Section 5.4 for additional requirements triggered by list. (See Section 5.5 for additional requirements triggered by
receiving a cookie.) receiving a cookie.)
5.3.1. The Expires Attribute 5.4.1. The Expires Attribute
If the attribute-name case-insensitively matches the string If the attribute-name case-insensitively matches the string
"Expires", the user agent MUST process the cookie-av as follows. "Expires", the user agent MUST process the cookie-av as follows.
1. Let the expiry-time be the result of parsing the attribute-value 1. Let the expiry-time be the result of parsing the attribute-value
as cookie-date (see Section 5.1.1). as cookie-date (see Section 5.1.1).
2. If the attribute-value failed to parse as a cookie date, ignore 2. If the attribute-value failed to parse as a cookie date, ignore
the cookie-av. the cookie-av.
skipping to change at page 25, line 47 skipping to change at page 26, line 27
represent, the user agent MAY replace the expiry-time with the represent, the user agent MAY replace the expiry-time with the
last representable date. last representable date.
4. If the expiry-time is earlier than the earliest date the user 4. If the expiry-time is earlier than the earliest date the user
agent can represent, the user agent MAY replace the expiry-time agent can represent, the user agent MAY replace the expiry-time
with the earliest representable date. with the earliest representable date.
5. Append an attribute to the cookie-attribute-list with an 5. Append an attribute to the cookie-attribute-list with an
attribute-name of Expires and an attribute-value of expiry-time. attribute-name of Expires and an attribute-value of expiry-time.
5.3.2. The Max-Age Attribute 5.4.2. The Max-Age Attribute
If the attribute-name case-insensitively matches the string "Max- If the attribute-name case-insensitively matches the string "Max-
Age", the user agent MUST process the cookie-av as follows. Age", the user agent MUST process the cookie-av as follows.
1. If the first character of the attribute-value is not a DIGIT or a 1. If the first character of the attribute-value is not a DIGIT or a
"-" character, ignore the cookie-av. "-" character, ignore the cookie-av.
2. If the remainder of attribute-value contains a non-DIGIT 2. If the remainder of attribute-value contains a non-DIGIT
character, ignore the cookie-av. character, ignore the cookie-av.
3. Let delta-seconds be the attribute-value converted to an integer. 3. Let delta-seconds be the attribute-value converted to an integer.
4. If delta-seconds is less than or equal to zero (0), let expiry- 4. If delta-seconds is less than or equal to zero (0), let expiry-
time be the earliest representable date and time. Otherwise, let time be the earliest representable date and time. Otherwise, let
the expiry-time be the current date and time plus delta-seconds the expiry-time be the current date and time plus delta-seconds
seconds. seconds.
5. Append an attribute to the cookie-attribute-list with an 5. Append an attribute to the cookie-attribute-list with an
attribute-name of Max-Age and an attribute-value of expiry-time. attribute-name of Max-Age and an attribute-value of expiry-time.
5.3.3. The Domain Attribute 5.4.3. The Domain Attribute
If the attribute-name case-insensitively matches the string "Domain", If the attribute-name case-insensitively matches the string "Domain",
the user agent MUST process the cookie-av as follows. the user agent MUST process the cookie-av as follows.
1. If the attribute-value is empty, the behavior is undefined. 1. If the attribute-value is empty, the behavior is undefined.
However, the user agent SHOULD ignore the cookie-av entirely. However, the user agent SHOULD ignore the cookie-av entirely.
2. If the first character of the attribute-value string is %x2E 2. If the first character of the attribute-value string is %x2E
("."): ("."):
skipping to change at page 26, line 44 skipping to change at page 27, line 23
Otherwise: Otherwise:
1. Let cookie-domain be the entire attribute-value. 1. Let cookie-domain be the entire attribute-value.
3. Convert the cookie-domain to lower case. 3. Convert the cookie-domain to lower case.
4. Append an attribute to the cookie-attribute-list with an 4. Append an attribute to the cookie-attribute-list with an
attribute-name of Domain and an attribute-value of cookie-domain. attribute-name of Domain and an attribute-value of cookie-domain.
5.3.4. The Path Attribute 5.4.4. The Path Attribute
If the attribute-name case-insensitively matches the string "Path", If the attribute-name case-insensitively matches the string "Path",
the user agent MUST process the cookie-av as follows. the user agent MUST process the cookie-av as follows.
1. If the attribute-value is empty or if the first character of the 1. If the attribute-value is empty or if the first character of the
attribute-value is not %x2F ("/"): attribute-value is not %x2F ("/"):
1. Let cookie-path be the default-path. 1. Let cookie-path be the default-path.
Otherwise: Otherwise:
1. Let cookie-path be the attribute-value. 1. Let cookie-path be the attribute-value.
2. Append an attribute to the cookie-attribute-list with an 2. Append an attribute to the cookie-attribute-list with an
attribute-name of Path and an attribute-value of cookie-path. attribute-name of Path and an attribute-value of cookie-path.
5.3.5. The Secure Attribute 5.4.5. The Secure Attribute
If the attribute-name case-insensitively matches the string "Secure", If the attribute-name case-insensitively matches the string "Secure",
the user agent MUST append an attribute to the cookie-attribute-list the user agent MUST append an attribute to the cookie-attribute-list
with an attribute-name of Secure and an empty attribute-value. with an attribute-name of Secure and an empty attribute-value.
5.3.6. The HttpOnly Attribute 5.4.6. The HttpOnly Attribute
If the attribute-name case-insensitively matches the string If the attribute-name case-insensitively matches the string
"HttpOnly", the user agent MUST append an attribute to the cookie- "HttpOnly", the user agent MUST append an attribute to the cookie-
attribute-list with an attribute-name of HttpOnly and an empty attribute-list with an attribute-name of HttpOnly and an empty
attribute-value. attribute-value.
5.3.7. The SameSite Attribute 5.4.7. The SameSite Attribute
If the attribute-name case-insensitively matches the string If the attribute-name case-insensitively matches the string
"SameSite", the user agent MUST process the cookie-av as follows: "SameSite", the user agent MUST process the cookie-av as follows:
1. Let "enforcement" be "Default". 1. Let "enforcement" be "Default".
2. If cookie-av's attribute-value is a case-insensitive match for 2. If cookie-av's attribute-value is a case-insensitive match for
"None", set "enforcement" to "None". "None", set "enforcement" to "None".
3. If cookie-av's attribute-value is a case-insensitive match for 3. If cookie-av's attribute-value is a case-insensitive match for
"Strict", set "enforcement" to "Strict". "Strict", set "enforcement" to "Strict".
4. If cookie-av's attribute-value is a case-insensitive match for 4. If cookie-av's attribute-value is a case-insensitive match for
"Lax", set "enforcement" to "Lax". "Lax", set "enforcement" to "Lax".
5. Append an attribute to the cookie-attribute-list with an 5. Append an attribute to the cookie-attribute-list with an
attribute-name of "SameSite" and an attribute-value of attribute-name of "SameSite" and an attribute-value of
"enforcement". "enforcement".
Note: This algorithm maps the "None" value, as well as any unknown 5.4.7.1. "Strict" and "Lax" enforcement
value, to the "None" behavior, which is helpful for backwards
compatibility when introducing new variants.
5.3.7.1. "Strict" and "Lax" enforcement
Same-site cookies in "Strict" enforcement mode will not be sent along Same-site cookies in "Strict" enforcement mode will not be sent along
with top-level navigations which are triggered from a cross-site with top-level navigations which are triggered from a cross-site
document context. As discussed in Section 8.8.2, this might or might document context. As discussed in Section 8.8.2, this might or might
not be compatible with existing session management systems. In the not be compatible with existing session management systems. In the
interests of providing a drop-in mechanism that mitigates the risk of interests of providing a drop-in mechanism that mitigates the risk of
CSRF attacks, developers may set the "SameSite" attribute in a "Lax" CSRF attacks, developers may set the "SameSite" attribute in a "Lax"
enforcement mode that carves out an exception which sends same-site enforcement mode that carves out an exception which sends same-site
cookies along with cross-site requests if and only if they are top- cookies along with cross-site requests if and only if they are top-
level navigations which use a "safe" (in the [RFC7231] sense) HTTP level navigations which use a "safe" (in the [HTTPSEM] sense) HTTP
method. (Note that a request's method may be changed from POST to method. (Note that a request's method may be changed from POST to
GET for some redirects (see sections 6.4.2 and 6.4.3 of [RFC7231]); GET for some redirects (see Sections 15.4.2 and 15.4.3 of [HTTPSEM]);
in these cases, a request's "safe"ness is determined based on the in these cases, a request's "safe"ness is determined based on the
method of the current redirect hop.) method of the current redirect hop.)
Lax enforcement provides reasonable defense in depth against CSRF Lax enforcement provides reasonable defense in depth against CSRF
attacks that rely on unsafe HTTP methods (like "POST"), but does not attacks that rely on unsafe HTTP methods (like "POST"), but does not
offer a robust defense against CSRF as a general category of attack: offer a robust defense against CSRF as a general category of attack:
1. Attackers can still pop up new windows or trigger top-level 1. Attackers can still pop up new windows or trigger top-level
navigations in order to create a "same-site" request (as navigations in order to create a "same-site" request (as
described in Section 5.2.1), which is only a speedbump along the described in Section 5.2.1), which is only a speedbump along the
road to exploitation. road to exploitation.
2. Features like "<link rel='prerender'>" [prerendering] can be 2. Features like "<link rel='prerender'>" [prerendering] can be
exploited to create "same-site" requests without the risk of user exploited to create "same-site" requests without the risk of user
detection. detection.
When possible, developers should use a session management mechanism When possible, developers should use a session management mechanism
such as that described in Section 8.8.2 to mitigate the risk of CSRF such as that described in Section 8.8.2 to mitigate the risk of CSRF
more completely. more completely.
5.4. Storage Model 5.4.7.2. "Lax-Allowing-Unsafe" enforcement
As discussed in Section 8.8.6, compatibility concerns may necessitate
the use of a "Lax-allowing-unsafe" enforcement mode that allows
cookies to be sent with a cross-site HTTP request if and only if it
is a top-level request, regardless of request method. That is, the
"Lax-allowing-unsafe" enforcement mode waives the requirement for the
HTTP request's method to be "safe" in the "SameSite" enforcement step
of the retrieval algorithm in Section 5.6.3. (All cookies,
regardless of "SameSite" enforcement mode, may be set for top-level
navigations, regardless of HTTP request method, as specified in
Section 5.5.)
"Lax-allowing-unsafe" is not a distinct value of the "SameSite"
attribute. Rather, user agents MAY apply "Lax-allowing-unsafe"
enforcement only to cookies that did not explicitly specify a
"SameSite" attribute (i.e., those whose same-site-flag was set to
"Default" by default). To limit the scope of this compatibility
mode, user agents which apply "Lax-allowing-unsafe" enforcement
SHOULD restrict the enforcement to cookies which were created
recently. Deployment experience has shown a cookie age of 2 minutes
or less to be a reasonable limit.
If the user agent uses "Lax-allowing-unsafe" enforcement, it MUST
apply the following modification to the retrieval algorithm defined
in Section 5.6.3:
Replace the condition in the penultimate bullet point of step 1 of
the retrieval algorithm reading
* The HTTP request associated with the retrieval uses a "safe" method.
with
* At least one of the following is true:
1. The HTTP request associated with the retrieval uses a "safe" method.
2. The cookie's same-site-flag is "Default" and the amount of time
elapsed since the cookie's creation-time is at most a duration of the
user agent's choosing.
5.5. Storage Model
The user agent stores the following fields about each cookie: name, The user agent stores the following fields about each cookie: name,
value, expiry-time, domain, path, creation-time, last-access-time, value, expiry-time, domain, path, creation-time, last-access-time,
persistent-flag, host-only-flag, secure-only-flag, http-only-flag, persistent-flag, host-only-flag, secure-only-flag, http-only-flag,
and same-site-flag. and same-site-flag.
When the user agent "receives a cookie" from a request-uri with name When the user agent "receives a cookie" from a request-uri with name
cookie-name, value cookie-value, and attributes cookie-attribute- cookie-name, value cookie-value, and attributes cookie-attribute-
list, the user agent MUST process the cookie as follows: list, the user agent MUST process the cookie as follows:
1. A user agent MAY ignore a received cookie in its entirety. For 1. A user agent MAY ignore a received cookie in its entirety. See
example, the user agent might wish to block receiving cookies Section 5.3.
from "third-party" responses or the user agent might not wish to
store cookies that exceed some size.
2. If cookie-name is empty and cookie-value is empty, abort these 2. If cookie-name is empty and cookie-value is empty, abort these
steps and ignore the cookie entirely. steps and ignore the cookie entirely.
3. Create a new cookie with name cookie-name, value cookie-value. 3. If the cookie-name or the cookie-value contains a %x00-1F / %x7F
(CTL) character, abort these steps and ignore the cookie
entirely.
4. Create a new cookie with name cookie-name, value cookie-value.
Set the creation-time and the last-access-time to the current Set the creation-time and the last-access-time to the current
date and time. date and time.
4. If the cookie-attribute-list contains an attribute with an 5. If the cookie-attribute-list contains an attribute with an
attribute-name of "Max-Age": attribute-name of "Max-Age":
1. Set the cookie's persistent-flag to true. 1. Set the cookie's persistent-flag to true.
2. Set the cookie's expiry-time to attribute-value of the last 2. Set the cookie's expiry-time to attribute-value of the last
attribute in the cookie-attribute-list with an attribute- attribute in the cookie-attribute-list with an attribute-
name of "Max-Age". name of "Max-Age".
Otherwise, if the cookie-attribute-list contains an attribute Otherwise, if the cookie-attribute-list contains an attribute
with an attribute-name of "Expires" (and does not contain an with an attribute-name of "Expires" (and does not contain an
skipping to change at page 29, line 38 skipping to change at page 31, line 8
attribute in the cookie-attribute-list with an attribute- attribute in the cookie-attribute-list with an attribute-
name of "Expires". name of "Expires".
Otherwise: Otherwise:
1. Set the cookie's persistent-flag to false. 1. Set the cookie's persistent-flag to false.
2. Set the cookie's expiry-time to the latest representable 2. Set the cookie's expiry-time to the latest representable
date. date.
5. If the cookie-attribute-list contains an attribute with an 6. If the cookie-attribute-list contains an attribute with an
attribute-name of "Domain": attribute-name of "Domain":
1. Let the domain-attribute be the attribute-value of the last 1. Let the domain-attribute be the attribute-value of the last
attribute in the cookie-attribute-list with an attribute- attribute in the cookie-attribute-list with an attribute-
name of "Domain". name of "Domain".
Otherwise: Otherwise:
1. Let the domain-attribute be the empty string. 1. Let the domain-attribute be the empty string.
6. If the user agent is configured to reject "public suffixes" and 7. If the user agent is configured to reject "public suffixes" and
the domain-attribute is a public suffix: the domain-attribute is a public suffix:
1. If the domain-attribute is identical to the canonicalized 1. If the domain-attribute is identical to the canonicalized
request-host: request-host:
1. Let the domain-attribute be the empty string. 1. Let the domain-attribute be the empty string.
Otherwise: Otherwise:
1. Ignore the cookie entirely and abort these steps. 1. Ignore the cookie entirely and abort these steps.
NOTE: This step prevents "attacker.example" from disrupting the NOTE: This step prevents "attacker.example" from disrupting the
integrity of "site.example" by setting a cookie with a Domain integrity of "site.example" by setting a cookie with a Domain
attribute of "example". attribute of "example".
7. If the domain-attribute is non-empty: 8. If the domain-attribute is non-empty:
1. If the canonicalized request-host does not domain-match the 1. If the canonicalized request-host does not domain-match the
domain-attribute: domain-attribute:
1. Ignore the cookie entirely and abort these steps. 1. Ignore the cookie entirely and abort these steps.
Otherwise: Otherwise:
1. Set the cookie's host-only-flag to false. 1. Set the cookie's host-only-flag to false.
2. Set the cookie's domain to the domain-attribute. 2. Set the cookie's domain to the domain-attribute.
Otherwise: Otherwise:
1. Set the cookie's host-only-flag to true. 1. Set the cookie's host-only-flag to true.
2. Set the cookie's domain to the canonicalized request-host. 2. Set the cookie's domain to the canonicalized request-host.
8. If the cookie-attribute-list contains an attribute with an 9. If the cookie-attribute-list contains an attribute with an
attribute-name of "Path", set the cookie's path to attribute- attribute-name of "Path", set the cookie's path to attribute-
value of the last attribute in the cookie-attribute-list with an value of the last attribute in the cookie-attribute-list with an
attribute-name of "Path". Otherwise, set the cookie's path to attribute-name of "Path". Otherwise, set the cookie's path to
the default-path of the request-uri. the default-path of the request-uri.
9. If the cookie-attribute-list contains an attribute with an 10. If the cookie-attribute-list contains an attribute with an
attribute-name of "Secure", set the cookie's secure-only-flag to attribute-name of "Secure", set the cookie's secure-only-flag to
true. Otherwise, set the cookie's secure-only-flag to false. true. Otherwise, set the cookie's secure-only-flag to false.
10. If the scheme component of the request-uri does not denote a 11. If the scheme component of the request-uri does not denote a
"secure" protocol (as defined by the user agent), and the "secure" protocol (as defined by the user agent), and the
cookie's secure-only-flag is true, then abort these steps and cookie's secure-only-flag is true, then abort these steps and
ignore the cookie entirely. ignore the cookie entirely.
11. If the cookie-attribute-list contains an attribute with an 12. If the cookie-attribute-list contains an attribute with an
attribute-name of "HttpOnly", set the cookie's http-only-flag to attribute-name of "HttpOnly", set the cookie's http-only-flag to
true. Otherwise, set the cookie's http-only-flag to false. true. Otherwise, set the cookie's http-only-flag to false.
12. If the cookie was received from a "non-HTTP" API and the 13. If the cookie was received from a "non-HTTP" API and the
cookie's http-only-flag is true, abort these steps and ignore cookie's http-only-flag is true, abort these steps and ignore
the cookie entirely. the cookie entirely.
13. If the cookie's secure-only-flag is false, and the scheme 14. If the cookie's secure-only-flag is false, and the scheme
component of request-uri does not denote a "secure" protocol, component of request-uri does not denote a "secure" protocol,
then abort these steps and ignore the cookie entirely if the then abort these steps and ignore the cookie entirely if the
cookie store contains one or more cookies that meet all of the cookie store contains one or more cookies that meet all of the
following criteria: following criteria:
1. Their name matches the name of the newly-created cookie. 1. Their name matches the name of the newly-created cookie.
2. Their secure-only-flag is true. 2. Their secure-only-flag is true.
3. Their domain domain-matches the domain of the newly-created 3. Their domain domain-matches the domain of the newly-created
skipping to change at page 31, line 37 skipping to change at page 33, line 5
of the existing cookie. of the existing cookie.
Note: The path comparison is not symmetric, ensuring only that a Note: The path comparison is not symmetric, ensuring only that a
newly-created, non-secure cookie does not overlay an existing newly-created, non-secure cookie does not overlay an existing
secure cookie, providing some mitigation against cookie-fixing secure cookie, providing some mitigation against cookie-fixing
attacks. That is, given an existing secure cookie named 'a' attacks. That is, given an existing secure cookie named 'a'
with a path of '/login', a non-secure cookie named 'a' could be with a path of '/login', a non-secure cookie named 'a' could be
set for a path of '/' or '/foo', but not for a path of '/login' set for a path of '/' or '/foo', but not for a path of '/login'
or '/login/en'. or '/login/en'.
14. If the cookie-attribute-list contains an attribute with an 15. If the cookie-attribute-list contains an attribute with an
attribute-name of "SameSite", and an attribute-value of attribute-name of "SameSite", and an attribute-value of
"Strict", "Lax", or "None", set the cookie's same-site-flag to "Strict", "Lax", or "None", set the cookie's same-site-flag to
the attribute-value of the last attribute in the cookie- the attribute-value of the last attribute in the cookie-
attribute-list with an attribute-name of "SameSite". Otherwise, attribute-list with an attribute-name of "SameSite". Otherwise,
set the cookie's same-site-flag to "Default". set the cookie's same-site-flag to "Default".
15. If the cookie's "same-site-flag" is not "None": 16. If the cookie's "same-site-flag" is not "None":
1. If the cookie was received from a "non-HTTP" API, and the 1. If the cookie was received from a "non-HTTP" API, and the
API was called from a browsing context's active document API was called from a browsing context's active document
whose "site for cookies" is not same-site with the top-level whose "site for cookies" is not same-site with the top-level
origin, then abort these steps and ignore the newly created origin, then abort these steps and ignore the newly created
cookie entirely. cookie entirely.
2. If the cookie was received from a "same-site" request (as 2. If the cookie was received from a "same-site" request (as
defined in Section 5.2), skip the remaining substeps and defined in Section 5.2), skip the remaining substeps and
continue processing the cookie. continue processing the cookie.
skipping to change at page 32, line 24 skipping to change at page 33, line 39
processing the cookie. processing the cookie.
Note: Top-level navigations can create a cookie with any Note: Top-level navigations can create a cookie with any
"SameSite" value, even if the new cookie wouldn't have been "SameSite" value, even if the new cookie wouldn't have been
sent along with the request had it already existed prior to sent along with the request had it already existed prior to
the navigation. the navigation.
4. Abort these steps and ignore the newly created cookie 4. Abort these steps and ignore the newly created cookie
entirely. entirely.
16. If the cookie's "same-site-flag" is "None", abort these steps 17. If the cookie's "same-site-flag" is "None", abort these steps
and ignore the cookie entirely unless the cookie's secure-only- and ignore the cookie entirely unless the cookie's secure-only-
flag is true. flag is true.
17. If the cookie-name begins with a case-sensitive match for the 18. If the cookie-name begins with a case-sensitive match for the
string "__Secure-", abort these steps and ignore the cookie string "__Secure-", abort these steps and ignore the cookie
entirely unless the cookie's secure-only-flag is true. entirely unless the cookie's secure-only-flag is true.
18. If the cookie-name begins with a case-sensitive match for the 19. If the cookie-name begins with a case-sensitive match for the
string "__Host-", abort these steps and ignore the cookie string "__Host-", abort these steps and ignore the cookie
entirely unless the cookie meets all the following criteria: entirely unless the cookie meets all the following criteria:
1. The cookie's secure-only-flag is true. 1. The cookie's secure-only-flag is true.
2. The cookie's host-only-flag is true. 2. The cookie's host-only-flag is true.
3. The cookie-attribute-list contains an attribute with an 3. The cookie-attribute-list contains an attribute with an
attribute-name of "Path", and the cookie's path is "/". attribute-name of "Path", and the cookie's path is "/".
19. If the cookie store contains a cookie with the same name, 20. If the cookie store contains a cookie with the same name,
domain, host-only-flag, and path as the newly-created cookie: domain, host-only-flag, and path as the newly-created cookie:
1. Let old-cookie be the existing cookie with the same name, 1. Let old-cookie be the existing cookie with the same name,
domain, host-only-flag, and path as the newly-created domain, host-only-flag, and path as the newly-created
cookie. (Notice that this algorithm maintains the invariant cookie. (Notice that this algorithm maintains the invariant
that there is at most one such cookie.) that there is at most one such cookie.)
2. If the newly-created cookie was received from a "non-HTTP" 2. If the newly-created cookie was received from a "non-HTTP"
API and the old-cookie's http-only-flag is true, abort these API and the old-cookie's http-only-flag is true, abort these
steps and ignore the newly created cookie entirely. steps and ignore the newly created cookie entirely.
3. Update the creation-time of the newly-created cookie to 3. Update the creation-time of the newly-created cookie to
match the creation-time of the old-cookie. match the creation-time of the old-cookie.
4. Remove the old-cookie from the cookie store. 4. Remove the old-cookie from the cookie store.
20. Insert the newly-created cookie into the cookie store. 21. Insert the newly-created cookie into the cookie store.
A cookie is "expired" if the cookie has an expiry date in the past. A cookie is "expired" if the cookie has an expiry date in the past.
The user agent MUST evict all expired cookies from the cookie store The user agent MUST evict all expired cookies from the cookie store
if, at any time, an expired cookie exists in the cookie store. if, at any time, an expired cookie exists in the cookie store.
At any time, the user agent MAY "remove excess cookies" from the At any time, the user agent MAY "remove excess cookies" from the
cookie store if the number of cookies sharing a domain field exceeds cookie store if the number of cookies sharing a domain field exceeds
some implementation-defined upper bound (such as 50 cookies). some implementation-defined upper bound (such as 50 cookies).
skipping to change at page 33, line 49 skipping to change at page 35, line 14
4. All cookies. 4. All cookies.
If two cookies have the same removal priority, the user agent MUST If two cookies have the same removal priority, the user agent MUST
evict the cookie with the earliest last-access-time first. evict the cookie with the earliest last-access-time first.
When "the current session is over" (as defined by the user agent), When "the current session is over" (as defined by the user agent),
the user agent MUST remove from the cookie store all cookies with the the user agent MUST remove from the cookie store all cookies with the
persistent-flag set to false. persistent-flag set to false.
5.5. The Cookie Header 5.6. Retrieval Model
This section defines how cookies are retrieved from a cookie store in
the form of a cookie-string. A "retrieval" is any event which
requires generating a cookie-string. For example, a retrieval may
occur in order to build a Cookie header field for an HTTP request, or
may be required in order to return a cookie-string from a call to a
"non-HTTP" API that provides access to cookies. A retrieval has an
associated URI, same-site status, and type, which are defined below
depending on the type of retrieval.
5.6.1. The Cookie Header Field
The user agent includes stored cookies in the Cookie HTTP request The user agent includes stored cookies in the Cookie HTTP request
header. header field.
When the user agent generates an HTTP request, the user agent MUST When the user agent generates an HTTP request, the user agent MUST
NOT attach more than one Cookie header field. NOT attach more than one Cookie header field.
A user agent MAY omit the Cookie header in its entirety. For A user agent MAY omit the Cookie header field in its entirety. For
example, the user agent might wish to block sending cookies during example, the user agent might wish to block sending cookies during
"third-party" requests from setting cookies (see Section 7.1). "third-party" requests from setting cookies (see Section 7.1).
If the user agent does attach a Cookie header field to an HTTP If the user agent does attach a Cookie header field to an HTTP
request, the user agent MUST send the cookie-string (defined below) request, the user agent MUST compute the cookie-string following the
as the value of the header field. algorithm defined in Section 5.6.3, where the retrieval's URI is the
request-uri, the retrieval's same-site status is computed for the
HTTP request as defined in Section 5.2, and the retrieval's type is
"HTTP".
The user agent MUST use an algorithm equivalent to the following 5.6.2. Non-HTTP APIs
algorithm to compute the cookie-string from a cookie store and a
request-uri: The user agent MAY implement "non-HTTP" APIs that can be used to
access stored cookies.
A user agent MAY return an empty cookie-string in certain contexts,
such as when a retrieval occurs within a third-party context (see
Section 7.1).
If a user agent does return cookies for a given call to a "non-HTTP"
API with an associated Document, then the user agent MUST compute the
cookie-string following the algorithm defined in Section 5.6.3, where
the retrieval's URI is defined by the caller (see
[DOM-DOCUMENT-COOKIE]), the retrieval's same-site status is "same-
site" if the Document's "site for cookies" is same-site with the top-
level origin as defined in Section 5.2.1 (otherwise it is "cross-
site"), and the retrieval's type is "non-HTTP".
5.6.3. Retrieval Algorithm
Given a cookie store and a retrieval, the following algorithm returns
a cookie-string from a given cookie store.
1. Let cookie-list be the set of cookies from the cookie store that 1. Let cookie-list be the set of cookies from the cookie store that
meets all of the following requirements: meets all of the following requirements:
* Either: * Either:
- The cookie's host-only-flag is true and the canonicalized - The cookie's host-only-flag is true and the canonicalized
request-host is identical to the cookie's domain. host of the retrieval's URI is identical to the cookie's
domain.
Or: Or:
- The cookie's host-only-flag is false and the canonicalized - The cookie's host-only-flag is false and the canonicalized
request-host domain-matches the cookie's domain. host of the retrieval's URI domain-matches the cookie's
domain.
* The request-uri's path path-matches the cookie's path. * The retrieval's URI's path path-matches the cookie's path.
* If the cookie's secure-only-flag is true, then the request- * If the cookie's secure-only-flag is true, then the retrieval's
uri's scheme must denote a "secure" protocol (as defined by URI's scheme must denote a "secure" protocol (as defined by
the user agent). the user agent).
NOTE: The notion of a "secure" protocol is not defined by this NOTE: The notion of a "secure" protocol is not defined by this
document. Typically, user agents consider a protocol secure document. Typically, user agents consider a protocol secure
if the protocol makes use of transport-layer security, such as if the protocol makes use of transport-layer security, such as
SSL or TLS. For example, most user agents consider "https" to SSL or TLS. For example, most user agents consider "https" to
be a scheme that denotes a secure protocol. be a scheme that denotes a secure protocol.
* If the cookie's http-only-flag is true, then exclude the * If the cookie's http-only-flag is true, then exclude the
cookie if the cookie-string is being generated for a "non- cookie if the retrieval's type is "non-HTTP".
HTTP" API (as defined by the user agent).
* If the cookie's same-site-flag is not "None", and the HTTP * If the cookie's same-site-flag is not "None" and the
request is cross-site (as defined in Section 5.2) then exclude retrieval's same-site status is "cross-site", then exclude the
the cookie unless all of the following statements hold: cookie unless all of the following conditions are met:
1. The same-site-flag is "Lax" or "Default". - The retrieval's type is "HTTP".
2. The HTTP request's method is "safe". - The same-site-flag is "Lax" or "Default".
3. The HTTP request's target browsing context is a top-level - The HTTP request associated with the retrieval uses a
browsing context. "safe" method.
- The target browsing context of the HTTP request associated
with the retrieval is a top-level browsing context.
2. The user agent SHOULD sort the cookie-list in the following 2. The user agent SHOULD sort the cookie-list in the following
order: order:
* Cookies with longer paths are listed before cookies with * Cookies with longer paths are listed before cookies with
shorter paths. shorter paths.
* Among cookies that have equal-length path fields, cookies with * Among cookies that have equal-length path fields, cookies with
earlier creation-times are listed before cookies with later earlier creation-times are listed before cookies with later
creation-times. creation-times.
skipping to change at page 36, line 22 skipping to change at page 38, line 22
* At least 4096 bytes per cookie (as measured by the sum of the * At least 4096 bytes per cookie (as measured by the sum of the
length of the cookie's name, value, and attributes). length of the cookie's name, value, and attributes).
* At least 50 cookies per domain. * At least 50 cookies per domain.
* At least 3000 cookies total. * At least 3000 cookies total.
Servers SHOULD use as few and as small cookies as possible to avoid Servers SHOULD use as few and as small cookies as possible to avoid
reaching these implementation limits and to minimize network reaching these implementation limits and to minimize network
bandwidth due to the Cookie header being included in every request. bandwidth due to the Cookie header field being included in every
request.
Servers SHOULD gracefully degrade if the user agent fails to return Servers SHOULD gracefully degrade if the user agent fails to return
one or more cookies in the Cookie header because the user agent might one or more cookies in the Cookie header field because the user agent
evict any cookie at any time on orders from the user. might evict any cookie at any time on orders from the user.
6.2. Application Programming Interfaces 6.2. Application Programming Interfaces
One reason the Cookie and Set-Cookie headers use such esoteric syntax One reason the Cookie and Set-Cookie header fields use such esoteric
is that many platforms (both in servers and user agents) provide a syntax is that many platforms (both in servers and user agents)
string-based application programming interface (API) to cookies, provide a string-based application programming interface (API) to
requiring application-layer programmers to generate and parse the cookies, requiring application-layer programmers to generate and
syntax used by the Cookie and Set-Cookie headers, which many parse the syntax used by the Cookie and Set-Cookie header fields,
programmers have done incorrectly, resulting in interoperability which many programmers have done incorrectly, resulting in
problems. interoperability problems.
Instead of providing string-based APIs to cookies, platforms would be Instead of providing string-based APIs to cookies, platforms would be
well-served by providing more semantic APIs. It is beyond the scope well-served by providing more semantic APIs. It is beyond the scope
of this document to recommend specific API designs, but there are of this document to recommend specific API designs, but there are
clear benefits to accepting an abstract "Date" object instead of a clear benefits to accepting an abstract "Date" object instead of a
serialized date string. serialized date string.
6.3. IDNA Dependency and Migration 6.3. IDNA Dependency and Migration
IDNA2008 [RFC5890] supersedes IDNA2003 [RFC3490]. However, there are IDNA2008 [RFC5890] supersedes IDNA2003 [RFC3490]. However, there are
skipping to change at page 37, line 32 skipping to change at page 39, line 33
from other servers (such as advertising networks). These third-party from other servers (such as advertising networks). These third-party
servers can use cookies to track the user even if the user never servers can use cookies to track the user even if the user never
visits the server directly. For example, if a user visits a site visits the server directly. For example, if a user visits a site
that contains content from a third party and then later visits that contains content from a third party and then later visits
another site that contains content from the same third party, the another site that contains content from the same third party, the
third party can track the user between the two sites. third party can track the user between the two sites.
Given this risk to user privacy, some user agents restrict how third- Given this risk to user privacy, some user agents restrict how third-
party cookies behave, and those restrictions vary widly. For party cookies behave, and those restrictions vary widly. For
instance, user agents might block third-party cookies entirely by instance, user agents might block third-party cookies entirely by
refusing to send Cookie headers or process Set-Cookie headers during refusing to send Cookie header fields or process Set-Cookie header
third-party requests. They might take a less draconian approach by fields during third-party requests. They might take a less draconian
partitioning cookies based on the first-party context, sending one approach by partitioning cookies based on the first-party context,
set of cookies to a given third party in one first-party context, and sending one set of cookies to a given third party in one first-party
another to the same third party in another. context, and another to the same third party in another.
This document grants user agents wide latitude to experiment with This document grants user agents wide latitude to experiment with
third-party cookie policies that balance the privacy and third-party cookie policies that balance the privacy and
compatibility needs of their users. However, this document does not compatibility needs of their users. However, this document does not
endorse any particular third-party cookie policy. endorse any particular third-party cookie policy.
Third-party cookie blocking policies are often ineffective at Third-party cookie blocking policies are often ineffective at
achieving their privacy goals if servers attempt to work around their achieving their privacy goals if servers attempt to work around their
restrictions to track users. In particular, two collaborating restrictions to track users. In particular, two collaborating
servers can often track users without using cookies at all by servers can often track users without using cookies at all by
injecting identifying information into dynamic URLs. injecting identifying information into dynamic URLs.
7.2. User Controls 7.2. Cookie policy
User agents MAY enforce a cookie policy consisting of restrictions on
how cookies may be used or ignored (see Section 5.3).
A cookie policy may govern which domains or parties, as in first and
third parties (see Section 7.1), for which the user agent will allow
cookie access. The policy can also define limits on cookie size,
cookie expiry, and the number of cookies per domain or in total.
The goal of a restrictive cookie policy is often to improve security
or privacy. User agents often allow users to change the cookie
policy (see Section 7.3).
7.3. User Controls
User agents SHOULD provide users with a mechanism for managing the User agents SHOULD provide users with a mechanism for managing the
cookies stored in the cookie store. For example, a user agent might cookies stored in the cookie store. For example, a user agent might
let users delete all cookies received during a specified time period let users delete all cookies received during a specified time period
or all the cookies related to a particular domain. In addition, many or all the cookies related to a particular domain. In addition, many
user agents include a user interface element that lets users examine user agents include a user interface element that lets users examine
the cookies stored in their cookie store. the cookies stored in their cookie store.
User agents SHOULD provide users with a mechanism for disabling User agents SHOULD provide users with a mechanism for disabling
cookies. When cookies are disabled, the user agent MUST NOT include cookies. When cookies are disabled, the user agent MUST NOT include
a Cookie header in outbound HTTP requests and the user agent MUST NOT a Cookie header field in outbound HTTP requests and the user agent
process Set-Cookie headers in inbound HTTP responses. MUST NOT process Set-Cookie header fields in inbound HTTP responses.
Some user agents provide users the option of preventing persistent User agents MAY offer a way to change the cookie policy (see
Section 7.2).
User agents MAY provide users the option of preventing persistent
storage of cookies across sessions. When configured thusly, user storage of cookies across sessions. When configured thusly, user
agents MUST treat all received cookies as if the persistent-flag were agents MUST treat all received cookies as if the persistent-flag were
set to false. Some popular user agents expose this functionality via set to false. Some popular user agents expose this functionality via
"private browsing" mode [Aggarwal2010]. "private browsing" mode [Aggarwal2010].
Some user agents provide users with the ability to approve individual 7.4. Expiration Dates
writes to the cookie store. In many common usage scenarios, these
controls generate a large number of prompts. However, some privacy-
conscious users find these controls useful nonetheless.
7.3. Expiration Dates
Although servers can set the expiration date for cookies to the Although servers can set the expiration date for cookies to the
distant future, most user agents do not actually retain cookies for distant future, most user agents do not actually retain cookies for
multiple decades. Rather than choosing gratuitously long expiration multiple decades. Rather than choosing gratuitously long expiration
periods, servers SHOULD promote user privacy by selecting reasonable periods, servers SHOULD promote user privacy by selecting reasonable
cookie expiration periods based on the purpose of the cookie. For cookie expiration periods based on the purpose of the cookie. For
example, a typical session identifier might reasonably be set to example, a typical session identifier might reasonably be set to
expire in two weeks. expire in two weeks.
8. Security Considerations 8. Security Considerations
skipping to change at page 39, line 44 skipping to change at page 42, line 8
wish to consider entangling designation and authorization by treating wish to consider entangling designation and authorization by treating
URLs as capabilities. Instead of storing secrets in cookies, this URLs as capabilities. Instead of storing secrets in cookies, this
approach stores secrets in URLs, requiring the remote entity to approach stores secrets in URLs, requiring the remote entity to
supply the secret itself. Although this approach is not a panacea, supply the secret itself. Although this approach is not a panacea,
judicious application of these principles can lead to more robust judicious application of these principles can lead to more robust
security. security.
8.3. Clear Text 8.3. Clear Text
Unless sent over a secure channel (such as TLS), the information in Unless sent over a secure channel (such as TLS), the information in
the Cookie and Set-Cookie headers is transmitted in the clear. the Cookie and Set-Cookie header fields is transmitted in the clear.
1. All sensitive information conveyed in these headers is exposed to 1. All sensitive information conveyed in these header fields is
an eavesdropper. exposed to an eavesdropper.
2. A malicious intermediary could alter the headers as they travel 2. A malicious intermediary could alter the header fields as they
in either direction, with unpredictable results. travel in either direction, with unpredictable results.
3. A malicious client could alter the Cookie header before 3. A malicious client could alter the Cookie header fields before
transmission, with unpredictable results. transmission, with unpredictable results.
Servers SHOULD encrypt and sign the contents of cookies (using Servers SHOULD encrypt and sign the contents of cookies (using
whatever format the server desires) when transmitting them to the whatever format the server desires) when transmitting them to the
user agent (even when sending the cookies over a secure channel). user agent (even when sending the cookies over a secure channel).
However, encrypting and signing cookie contents does not prevent an However, encrypting and signing cookie contents does not prevent an
attacker from transplanting a cookie from one user agent to another attacker from transplanting a cookie from one user agent to another
or from replaying the cookie at a later time. or from replaying the cookie at a later time.
In addition to encrypting and signing the contents of every cookie, In addition to encrypting and signing the contents of every cookie,
servers that require a higher level of security SHOULD use the Cookie servers that require a higher level of security SHOULD use the Cookie
and Set-Cookie headers only over a secure channel. When using and Set-Cookie header fields only over a secure channel. When using
cookies over a secure channel, servers SHOULD set the Secure cookies over a secure channel, servers SHOULD set the Secure
attribute (see Section 4.1.2.5) for every cookie. If a server does attribute (see Section 4.1.2.5) for every cookie. If a server does
not set the Secure attribute, the protection provided by the secure not set the Secure attribute, the protection provided by the secure
channel will be largely moot. channel will be largely moot.
For example, consider a webmail server that stores a session For example, consider a webmail server that stores a session
identifier in a cookie and is typically accessed over HTTPS. If the identifier in a cookie and is typically accessed over HTTPS. If the
server does not set the Secure attribute on its cookies, an active server does not set the Secure attribute on its cookies, an active
network attacker can intercept any outbound HTTP request from the network attacker can intercept any outbound HTTP request from the
user agent and redirect that request to the webmail server over HTTP. user agent and redirect that request to the webmail server over HTTP.
skipping to change at page 42, line 8 skipping to change at page 44, line 18
their subdomains). For example, consider foo.site.example and their subdomains). For example, consider foo.site.example and
bar.site.example. The foo.site.example server can set a cookie with bar.site.example. The foo.site.example server can set a cookie with
a Domain attribute of "site.example" (possibly overwriting an a Domain attribute of "site.example" (possibly overwriting an
existing "site.example" cookie set by bar.site.example), and the user existing "site.example" cookie set by bar.site.example), and the user
agent will include that cookie in HTTP requests to bar.site.example. agent will include that cookie in HTTP requests to bar.site.example.
In the worst case, bar.site.example will be unable to distinguish In the worst case, bar.site.example will be unable to distinguish
this cookie from a cookie it set itself. The foo.site.example server this cookie from a cookie it set itself. The foo.site.example server
might be able to leverage this ability to mount an attack against might be able to leverage this ability to mount an attack against
bar.site.example. bar.site.example.
Even though the Set-Cookie header supports the Path attribute, the Even though the Set-Cookie header field supports the Path attribute,
Path attribute does not provide any integrity protection because the the Path attribute does not provide any integrity protection because
user agent will accept an arbitrary Path attribute in a Set-Cookie the user agent will accept an arbitrary Path attribute in a Set-
header. For example, an HTTP response to a request for Cookie header field. For example, an HTTP response to a request for
http://site.example/foo/bar can set a cookie with a Path attribute of http://site.example/foo/bar can set a cookie with a Path attribute of
"/qux". Consequently, servers SHOULD NOT both run mutually "/qux". Consequently, servers SHOULD NOT both run mutually
distrusting services on different paths of the same host and use distrusting services on different paths of the same host and use
cookies to store security-sensitive information. cookies to store security-sensitive information.
An active network attacker can also inject cookies into the Cookie An active network attacker can also inject cookies into the Cookie
header sent to https://site.example/ by impersonating a response from header field sent to https://site.example/ by impersonating a
http://site.example/ and injecting a Set-Cookie header. The HTTPS response from http://site.example/ and injecting a Set-Cookie header
server at site.example will be unable to distinguish these cookies field. The HTTPS server at site.example will be unable to
from cookies that it set itself in an HTTPS response. An active distinguish these cookies from cookies that it set itself in an HTTPS
network attacker might be able to leverage this ability to mount an response. An active network attacker might be able to leverage this
attack against site.example even if site.example uses HTTPS ability to mount an attack against site.example even if site.example
exclusively. uses HTTPS exclusively.
Servers can partially mitigate these attacks by encrypting and Servers can partially mitigate these attacks by encrypting and
signing the contents of their cookies. However, using cryptography signing the contents of their cookies. However, using cryptography
does not mitigate the issue completely because an attacker can replay does not mitigate the issue completely because an attacker can replay
a cookie he or she received from the authentic site.example server in a cookie he or she received from the authentic site.example server in
the user's session, with unpredictable results. the user's session, with unpredictable results.
Finally, an attacker might be able to force the user agent to delete Finally, an attacker might be able to force the user agent to delete
cookies by storing a large number of cookies. Once the user agent cookies by storing a large number of cookies. Once the user agent
reaches its storage limit, the user agent will be forced to evict reaches its storage limit, the user agent will be forced to evict
skipping to change at page 43, line 33 skipping to change at page 45, line 36
Setting the "SameSite" attribute in "strict" mode provides robust Setting the "SameSite" attribute in "strict" mode provides robust
defense in depth against CSRF attacks, but has the potential to defense in depth against CSRF attacks, but has the potential to
confuse users unless sites' developers carefully ensure that their confuse users unless sites' developers carefully ensure that their
cookie-based session management systems deal reasonably well with cookie-based session management systems deal reasonably well with
top-level navigations. top-level navigations.
Consider the scenario in which a user reads their email at MegaCorp Consider the scenario in which a user reads their email at MegaCorp
Inc's webmail provider "https://site.example/". They might expect Inc's webmail provider "https://site.example/". They might expect
that clicking on an emailed link to "https://projects.example/secret/ that clicking on an emailed link to "https://projects.example/secret/
project" would show them the secret project that they're authorized project" would show them the secret project that they're authorized
to see, but if "projects.example" has marked their session cookies as to see, but if "https://projects.example" has marked their session
"SameSite", then this cross-site navigation won't send them along cookies as "SameSite=Strict", then this cross-site navigation won't
with the request. "projects.example" will render a 404 error to avoid send them along with the request. "https://projects.example" will
leaking secret information, and the user will be quite confused. render a 404 error to avoid leaking secret information, and the user
will be quite confused.
Developers can avoid this confusion by adopting a session management Developers can avoid this confusion by adopting a session management
system that relies on not one, but two cookies: one conceptually system that relies on not one, but two cookies: one conceptually
granting "read" access, another granting "write" access. The latter granting "read" access, another granting "write" access. The latter
could be marked as "SameSite", and its absence would prompt a could be marked as "SameSite=Strict", and its absence would prompt a
reauthentication step before executing any non-idempotent action. reauthentication step before executing any non-idempotent action.
The former could drop the "SameSite" attribute entirely, or choose The former could be marked as "SameSite=Lax", in order to allow users
the "Lax" version of enforcement, in order to allow users access to access to data via top-level navigation, or "SameSite=None", to
data via top-level navigation. permit access in all contexts (including cross-site embedded
contexts).
8.8.3. Mashups and Widgets 8.8.3. Mashups and Widgets
The "SameSite" attribute is inappropriate for some important use- The "Lax" and "Strict" values for the "SameSite" attribute are
cases. In particular, note that content intended for embedding in a inappropriate for some important use-cases. In particular, note that
cross-site contexts (social networking widgets or commenting content intended for embedding in cross-site contexts (social
services, for instance) will not have access to same-site cookies. networking widgets or commenting services, for instance) will not
Cookies may be required for requests triggered in these cross-site have access to same-site cookies. Cookies which are required in
contexts in order to provide seamless functionality that relies on a these situations should be marked with "SameSite=None" to allow
user's state. access in cross-site contexts.
Likewise, some forms of Single-Sign-On might require cookie-based Likewise, some forms of Single-Sign-On might require cookie-based
authentication in a cross-site context; these mechanisms will not authentication in a cross-site context; these mechanisms will not
function as intended with same-site cookies. function as intended with same-site cookies and will also require
"SameSite=None".
8.8.4. Server-controlled 8.8.4. Server-controlled
SameSite cookies in and of themselves don't do anything to address SameSite cookies in and of themselves don't do anything to address
the general privacy concerns outlined in Section 7.1 of [RFC6265]. the general privacy concerns outlined in Section 7.1 of [RFC6265].
The "SameSite" attribute is set by the server, and serves to mitigate The "SameSite" attribute is set by the server, and serves to mitigate
the risk of certain kinds of attacks that the server is worried the risk of certain kinds of attacks that the server is worried
about. The user is not involved in this decision. Moreover, a about. The user is not involved in this decision. Moreover, a
number of side-channels exist which could allow a server to link number of side-channels exist which could allow a server to link
distinct requests even in the absence of cookies (for example, distinct requests even in the absence of cookies (for example,
connection and/or socket pooling between same-site and cross-site connection and/or socket pooling between same-site and cross-site
requests). requests).
9. IANA Considerations 8.8.5. Reload navigations
Requests issued for reloads triggered through user interface elements
(such as a refresh button on a toolbar) are same-site only if the
reloaded document was originally navigated to via a same-site
request. This differs from the handling of other reload navigations,
which are always same-site if top-level, since the source browsing
context's active document is precisely the document being reloaded.
This special handling of reloads triggered through a user interface
element avoids sending "SameSite" cookies on user-initiated reloads
if they were withheld on the original navigation (i.e., if the
initial navigation were cross-site). If the reload navigation were
instead considered same-site, and sent all the initially withheld
"SameSite" cookies, the security benefits of withholding the cookies
in the first place would be nullified. This is especially important
given that the absence of "SameSite" cookies withheld on a cross-site
navigation request may lead to visible site breakage, prompting the
user to trigger a reload.
For example, suppose the user clicks on a link from
"https://attacker.example/" to "https://victim.example/". This is a
cross-site request, so "SameSite=Strict" cookies are withheld.
Suppose this causes "https://victim.example/" to appear broken,
because the site only displays its sensitive content if a particular
"SameSite" cookie is present in the request. The user, frustrated by
the unexpectedly broken site, presses refresh on their browser's
toolbar. To now consider the reload request same-site and send the
initially withheld "SameSite" cookie would defeat the purpose of
withholding it in the first place, as the reload navigation triggered
through the user interface may replay the original (potentially
malicious) request. Thus, the reload request should be considered
cross-site, like the request that initially navigated to the page.
8.8.6. Top-level requests with "unsafe" methods
The "Lax" enforcement mode described in Section 5.4.7.1 allows a
cookie to be sent with a cross-site HTTP request if and only if it is
a top-level navigation with a "safe" HTTP method. Implementation
experience shows that this is difficult to apply as the default
behavior, as some sites may rely on cookies not explicitly specifying
a "SameSite" attribute being included on top-level cross-site
requests with "unsafe" HTTP methods (as was the case prior to the
introduction of the "SameSite" attribute).
For example, a login flow may involve a cross-site top-level "POST"
request to an endpoint which expects a cookie with login information.
For such a cookie, "Lax" enforcement is not appropriate, as it would
cause the cookie to be excluded due to the unsafe HTTP request
method. On the other hand, "None" enforcement would allow the cookie
to be sent with all cross-site requests, which may not be desirable
due to the cookie's sensitive contents.
The "Lax-allowing-unsafe" enforcement mode described in
Section 5.4.7.2 retains some of the protections of "Lax" enforcement
(as compared to "None") while still allowing cookies to be sent
cross-site with unsafe top-level requests.
As a more permissive variant of "Lax" mode, "Lax-allowing-unsafe"
mode necessarily provides fewer protections against CSRF.
Ultimately, the provision of such an enforcement mode should be seen
as a temporary, transitional measure to ease adoption of "Lax"
enforcement by default.
9. IANA Considerations
9.1. Cookie 9.1. Cookie
The permanent message header field registry (see [RFC3864]) needs to The permanent message header field registry (see [RFC3864]) needs to
be updated with the following registration: be updated with the following registration:
Header field name: Cookie Header field name: Cookie
Applicable protocol: http Applicable protocol: http
Status: standard Status: standard
Author/Change controller: IETF Author/Change controller: IETF
Specification document: this specification (Section 5.5) Specification document: this specification (Section 5.6.1)
9.2. Set-Cookie 9.2. Set-Cookie
The permanent message header field registry (see [RFC3864]) needs to The permanent message header field registry (see [RFC3864]) needs to
be updated with the following registration: be updated with the following registration:
Header field name: Set-Cookie Header field name: Set-Cookie
Applicable protocol: http Applicable protocol: http
Status: standard Status: standard
Author/Change controller: IETF Author/Change controller: IETF
Specification document: this specification (Section 5.3) Specification document: this specification (Section 5.4)
9.3. Cookie Attribute Registry 9.3. Cookie Attribute Registry
The "Cookie Attribute Registry" defines the name space of attribute IANA is requested to create the "Cookie Attribute Registry", defining
used to control cookies' behavior. The registry is maintained at the name space of attribute used to control cookies' behavior. The
https://www.iana.org/assignments/cookie-attribute-names registry should be maintained at https://www.iana.org/assignments/
(https://www.iana.org/assignments/cookie-attribute-names). cookie-attribute-names (https://www.iana.org/assignments/cookie-
attribute-names).
9.3.1. Procedure 9.3.1. Procedure
Each registered attribute name is associated with a description, and Each registered attribute name is associated with a description, and
a reference detailing how the attribute is to be processed and a reference detailing how the attribute is to be processed and
stored. stored.
New registrations happen on a "RFC Required" basis (see Section 4.7 New registrations happen on a "RFC Required" basis (see Section 4.7
of [RFC8126]). The attribute to be registered MUST match the of [RFC8126]). The attribute to be registered MUST match the
"extension-av" syntax defined in Section 4.1.1. Note that attribute "extension-av" syntax defined in Section 4.1.1. Note that attribute
names are generally defined in CamelCase, but technically accepted names are generally defined in CamelCase, but technically accepted
case-insensitively. case-insensitively.
9.3.2. Registration 9.3.2. Registration
The "Cookie Attribute Registry" will be updated with the The "Cookie Attribute Registry" should be created with the
registrations below: registrations below:
+==========+==================================+ +==========+==================================+
| Name | Reference | | Name | Reference |
+==========+==================================+ +==========+==================================+
| Domain | Section 4.1.2.3 of this document | | Domain | Section 4.1.2.3 of this document |
+----------+----------------------------------+ +----------+----------------------------------+
| Expires | Section 4.1.2.1 of this document | | Expires | Section 4.1.2.1 of this document |
+----------+----------------------------------+ +----------+----------------------------------+
| HttpOnly | Section 4.1.2.6 of this document | | HttpOnly | Section 4.1.2.6 of this document |
skipping to change at page 46, line 29 skipping to change at page 49, line 40
+----------+----------------------------------+ +----------+----------------------------------+
| Secure | Section 4.1.2.5 of this document | | Secure | Section 4.1.2.5 of this document |
+----------+----------------------------------+ +----------+----------------------------------+
Table 1 Table 1
10. References 10. References
10.1. Normative References 10.1. Normative References
[DOM-DOCUMENT-COOKIE]
WHATWG, "HTML - Living Standard", 18 May 2021,
<https://html.spec.whatwg.org/#dom-document-cookie>.
[FETCH] van Kesteren, A., "Fetch", n.d., [FETCH] van Kesteren, A., "Fetch", n.d.,
<https://fetch.spec.whatwg.org/>. <https://fetch.spec.whatwg.org/>.
[HTML] Hickson, I., Pieters, S., van Kesteren, A., J├Ągenstedt, [HTML] Hickson, I., Pieters, S., van Kesteren, A., J├Ągenstedt,
P., and D. Denicola, "HTML", n.d., P., and D. Denicola, "HTML", n.d.,
<https://html.spec.whatwg.org/>. <https://html.spec.whatwg.org/>.
[HTTPSEM] Fielding, R. T., Nottingham, M., and J. Reschke, "HTTP
Semantics", Work in Progress, Internet-Draft, draft-ietf-
httpbis-semantics-16, 27 May 2021,
<https://tools.ietf.org/html/draft-ietf-httpbis-semantics-
16>.
[RFC1034] Mockapetris, P., "Domain names - concepts and facilities", [RFC1034] Mockapetris, P., "Domain names - concepts and facilities",
STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987,
<https://www.rfc-editor.org/info/rfc1034>. <https://www.rfc-editor.org/rfc/rfc1034>.
[RFC1123] Braden, R., Ed., "Requirements for Internet Hosts - [RFC1123] Braden, R., Ed., "Requirements for Internet Hosts -
Application and Support", STD 3, RFC 1123, Application and Support", STD 3, RFC 1123,
DOI 10.17487/RFC1123, October 1989, DOI 10.17487/RFC1123, October 1989,
<https://www.rfc-editor.org/info/rfc1123>. <https://www.rfc-editor.org/rfc/rfc1123>.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997, DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>. <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC3490] Costello, A., "Internationalizing Domain Names in [RFC3490] Costello, A., "Internationalizing Domain Names in
Applications (IDNA)", RFC 3490, March 2003, Applications (IDNA)", RFC 3490, March 2003,
<https://www.rfc-editor.org/rfc/rfc3490>. See Section 6.3 <https://www.rfc-editor.org/rfc/rfc3490>. See Section 6.3
for an explanation why the normative reference to an for an explanation why the normative reference to an
obsoleted specification is needed. obsoleted specification is needed.
[RFC4790] Newman, C., Duerst, M., and A. Gulbrandsen, "Internet [RFC4790] Newman, C., Duerst, M., and A. Gulbrandsen, "Internet
Application Protocol Collation Registry", RFC 4790, Application Protocol Collation Registry", RFC 4790,
DOI 10.17487/RFC4790, March 2007, DOI 10.17487/RFC4790, March 2007,
<https://www.rfc-editor.org/info/rfc4790>. <https://www.rfc-editor.org/rfc/rfc4790>.
[RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
Specifications: ABNF", STD 68, RFC 5234, Specifications: ABNF", STD 68, RFC 5234,
DOI 10.17487/RFC5234, January 2008, DOI 10.17487/RFC5234, January 2008,
<https://www.rfc-editor.org/info/rfc5234>. <https://www.rfc-editor.org/rfc/rfc5234>.
[RFC5890] Klensin, J., "Internationalized Domain Names for [RFC5890] Klensin, J., "Internationalized Domain Names for
Applications (IDNA): Definitions and Document Framework", Applications (IDNA): Definitions and Document Framework",
RFC 5890, DOI 10.17487/RFC5890, August 2010, RFC 5890, DOI 10.17487/RFC5890, August 2010,
<https://www.rfc-editor.org/info/rfc5890>. <https://www.rfc-editor.org/rfc/rfc5890>.
[RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454,
DOI 10.17487/RFC6454, December 2011, DOI 10.17487/RFC6454, December 2011,
<https://www.rfc-editor.org/info/rfc6454>. <https://www.rfc-editor.org/rfc/rfc6454>.
[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext Transfer
Protocol (HTTP/1.1): Message Syntax and Routing",
RFC 7230, DOI 10.17487/RFC7230, June 2014,
<https://www.rfc-editor.org/info/rfc7230>.
[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,
<https://www.rfc-editor.org/info/rfc7231>.
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for
Writing an IANA Considerations Section in RFCs", BCP 26, Writing an IANA Considerations Section in RFCs", BCP 26,
RFC 8126, DOI 10.17487/RFC8126, June 2017, RFC 8126, DOI 10.17487/RFC8126, June 2017,
<https://www.rfc-editor.org/info/rfc8126>. <https://www.rfc-editor.org/rfc/rfc8126>.
[SAMESITE] WHATWG, "HTML - Living Standard", 26 January 2021,
<https://html.spec.whatwg.org/#same-site>.
[SERVICE-WORKERS] [SERVICE-WORKERS]
Russell, A., Song, J., and J. Archibald, "Service Russell, A., Song, J., and J. Archibald, "Service
Workers", n.d., <http://www.w3.org/TR/service-workers/>. Workers", n.d., <http://www.w3.org/TR/service-workers/>.
[USASCII] American National Standards Institute, "Coded Character [USASCII] American National Standards Institute, "Coded Character
Set -- 7-bit American Standard Code for Information Set -- 7-bit American Standard Code for Information
Interchange", ANSI X3.4, 1986. Interchange", ANSI X3.4, 1986.
10.2. Informative References 10.2. Informative References
skipping to change at page 48, line 33 skipping to change at page 51, line 49
DOI 10.1145/1455770.1455782, ISBN 978-1-59593-810-7, DOI 10.1145/1455770.1455782, ISBN 978-1-59593-810-7,
ACM CCS '08: Proceedings of the 15th ACM conference on ACM CCS '08: Proceedings of the 15th ACM conference on
Computer and communications security (pages 75-88), Computer and communications security (pages 75-88),
October 2008, October 2008,
<http://portal.acm.org/citation.cfm?id=1455770.1455782>. <http://portal.acm.org/citation.cfm?id=1455770.1455782>.
[I-D.ietf-httpbis-cookie-alone] [I-D.ietf-httpbis-cookie-alone]
West, M., "Deprecate modification of 'secure' cookies from West, M., "Deprecate modification of 'secure' cookies from
non-secure origins", Work in Progress, Internet-Draft, non-secure origins", Work in Progress, Internet-Draft,
draft-ietf-httpbis-cookie-alone-01, 5 September 2016, draft-ietf-httpbis-cookie-alone-01, 5 September 2016,
<http://www.ietf.org/internet-drafts/draft-ietf-httpbis- <https://tools.ietf.org/html/draft-ietf-httpbis-cookie-
cookie-alone-01.txt>. alone-01>.
[I-D.ietf-httpbis-cookie-prefixes] [I-D.ietf-httpbis-cookie-prefixes]
West, M., "Cookie Prefixes", Work in Progress, Internet- West, M., "Cookie Prefixes", Work in Progress, Internet-
Draft, draft-ietf-httpbis-cookie-prefixes-00, 23 February Draft, draft-ietf-httpbis-cookie-prefixes-00, 23 February
2016, <http://www.ietf.org/internet-drafts/draft-ietf- 2016, <https://tools.ietf.org/html/draft-ietf-httpbis-
httpbis-cookie-prefixes-00.txt>. cookie-prefixes-00>.
[I-D.ietf-httpbis-cookie-same-site] [I-D.ietf-httpbis-cookie-same-site]
West, M. and M. Goodwin, "Same-Site Cookies", Work in West, M. and M. Goodwin, "Same-Site Cookies", Work in
Progress, Internet-Draft, draft-ietf-httpbis-cookie-same- Progress, Internet-Draft, draft-ietf-httpbis-cookie-same-
site-00, 20 June 2016, <http://www.ietf.org/internet- site-00, 20 June 2016, <https://tools.ietf.org/html/draft-
drafts/draft-ietf-httpbis-cookie-same-site-00.txt>. ietf-httpbis-cookie-same-site-00>.
[prerendering] [prerendering]
Bentzel, C., "Chrome Prerendering", n.d., Bentzel, C., "Chrome Prerendering", n.d.,
<https://www.chromium.org/developers/design-documents/ <https://www.chromium.org/developers/design-documents/
prerender>. prerender>.
[PSL] "Public Suffix List", n.d., [PSL] "Public Suffix List", n.d.,
<https://publicsuffix.org/list/>. <https://publicsuffix.org/list/>.
[RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
DOI 10.17487/RFC2818, May 2000, DOI 10.17487/RFC2818, May 2000,
<https://www.rfc-editor.org/info/rfc2818>. <https://www.rfc-editor.org/rfc/rfc2818>.
[RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November 10646", STD 63, RFC 3629, DOI 10.17487/RFC3629, November
2003, <https://www.rfc-editor.org/info/rfc3629>. 2003, <https://www.rfc-editor.org/rfc/rfc3629>.
[RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
Procedures for Message Header Fields", BCP 90, RFC 3864, Procedures for Message Header Fields", BCP 90, RFC 3864,
DOI 10.17487/RFC3864, September 2004, DOI 10.17487/RFC3864, September 2004,
<https://www.rfc-editor.org/info/rfc3864>. <https://www.rfc-editor.org/rfc/rfc3864>.
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
Resource Identifier (URI): Generic Syntax", STD 66, Resource Identifier (URI): Generic Syntax", STD 66,
RFC 3986, DOI 10.17487/RFC3986, January 2005, RFC 3986, DOI 10.17487/RFC3986, January 2005,
<https://www.rfc-editor.org/info/rfc3986>. <https://www.rfc-editor.org/rfc/rfc3986>.
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
<https://www.rfc-editor.org/info/rfc4648>. <https://www.rfc-editor.org/rfc/rfc4648>.
[RFC5895] Resnick, P. and P. Hoffman, "Mapping Characters for [RFC5895] Resnick, P. and P. Hoffman, "Mapping Characters for
Internationalized Domain Names in Applications (IDNA) Internationalized Domain Names in Applications (IDNA)
2008", RFC 5895, DOI 10.17487/RFC5895, September 2010, 2008", RFC 5895, DOI 10.17487/RFC5895, September 2010,
<https://www.rfc-editor.org/info/rfc5895>. <https://www.rfc-editor.org/rfc/rfc5895>.
[RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265, [RFC6265] Barth, A., "HTTP State Management Mechanism", RFC 6265,
DOI 10.17487/RFC6265, April 2011, DOI 10.17487/RFC6265, April 2011,
<https://www.rfc-editor.org/info/rfc6265>. <https://www.rfc-editor.org/rfc/rfc6265>.
[RFC7034] Ross, D. and T. Gondrom, "HTTP Header Field X-Frame- [RFC7034] Ross, D. and T. Gondrom, "HTTP Header Field X-Frame-
Options", RFC 7034, DOI 10.17487/RFC7034, October 2013, Options", RFC 7034, DOI 10.17487/RFC7034, October 2013,
<https://www.rfc-editor.org/info/rfc7034>. <https://www.rfc-editor.org/rfc/rfc7034>.
[UTS46] Davis, M. and M. Suignard, "Unicode IDNA Compatibility [UTS46] Davis, M. and M. Suignard, "Unicode IDNA Compatibility
Processing", UNICODE Unicode Technical Standards # 46, Processing", UNICODE Unicode Technical Standards # 46,
June 2016, <http://unicode.org/reports/tr46/>. June 2016, <http://unicode.org/reports/tr46/>.
Appendix A. Changes Appendix A. Changes
A.1. draft-ietf-httpbis-rfc6265bis-00 A.1. draft-ietf-httpbis-rfc6265bis-00
* Port [RFC6265] to Markdown. No (intentional) normative changes. * Port [RFC6265] to Markdown. No (intentional) normative changes.
skipping to change at page 53, line 4 skipping to change at page 56, line 21
* Fixed serialization for nameless/valueless cookies: * Fixed serialization for nameless/valueless cookies:
https://github.com/httpwg/http-extensions/pull/1143 https://github.com/httpwg/http-extensions/pull/1143
(https://github.com/httpwg/http-extensions/pull/1143). (https://github.com/httpwg/http-extensions/pull/1143).
* Converted a normative reference to Mozilla's Public Suffix List * Converted a normative reference to Mozilla's Public Suffix List
[PSL] into an informative reference: https://github.com/httpwg/ [PSL] into an informative reference: https://github.com/httpwg/
http-extensions/issues/1159 (https://github.com/httpwg/http- http-extensions/issues/1159 (https://github.com/httpwg/http-
extensions/issues/1159). extensions/issues/1159).
A.8. draft-ietf-httpbis-rfc6265bis-07 A.8. draft-ietf-httpbis-rfc6265bis-07
* Moved instruction to ignore cookies with empty cookie-name and * Moved instruction to ignore cookies with empty cookie-name and
cookie-value from Section 5.3 to Section 5.4 to ensure that they cookie-value from Section 5.4 to Section 5.5 to ensure that they
apply to cookies created without parsing a cookie string: apply to cookies created without parsing a cookie string:
https://github.com/httpwg/http-extensions/issues/1234 https://github.com/httpwg/http-extensions/issues/1234
(https://github.com/httpwg/http-extensions/issues/1234). (https://github.com/httpwg/http-extensions/issues/1234).
* Add a default enforcement value to the "same-site-flag", * Add a default enforcement value to the "same-site-flag",
equivalent to "SameSite=Lax": https://github.com/httpwg/http- equivalent to "SameSite=Lax": https://github.com/httpwg/http-
extensions/pull/1325 (https://github.com/httpwg/http-extensions/ extensions/pull/1325 (https://github.com/httpwg/http-extensions/
pull/1325). pull/1325).
* Require a Secure attribute for "SameSite=None": * Require a Secure attribute for "SameSite=None":
https://github.com/httpwg/http-extensions/pull/1323 https://github.com/httpwg/http-extensions/pull/1323
(https://github.com/httpwg/http-extensions/pull/1323). (https://github.com/httpwg/http-extensions/pull/1323).
* Consider scheme when running the same-site algorithm: * Consider scheme when running the same-site algorithm:
https://github.com/httpwg/http-extensions/pull/1324 https://github.com/httpwg/http-extensions/pull/1324
(https://github.com/httpwg/http-extensions/pull/1324). (https://github.com/httpwg/http-extensions/pull/1324).
A.9. draft-ietf-httpbis-rfc6265bis-08
* Define "same-site" for reload navigation requests, e.g. those
triggered via user interface elements: https://github.com/httpwg/
http-extensions/pull/1384 (https://github.com/httpwg/http-
extensions/pull/1384)
* Consider redirects when defining same-site:
https://github.com/httpwg/http-extensions/pull/1348
(https://github.com/httpwg/http-extensions/pull/1348)
* Align on using HTML terminology for origins:
https://github.com/httpwg/http-extensions/pull/1416
(https://github.com/httpwg/http-extensions/pull/1416)
* Modify cookie parsing and creation algorithms in Section 5.4 and
Section 5.5 to explicitly handle control characters:
https://github.com/httpwg/http-extensions/pull/1420
(https://github.com/httpwg/http-extensions/pull/1420)
* Refactor cookie retrieval algorithm to support non-HTTP APIs:
https://github.com/httpwg/http-extensions/pull/1428
(https://github.com/httpwg/http-extensions/pull/1428)
* Define "Lax-allowing-unsafe" SameSite enforcement mode:
https://github.com/httpwg/http-extensions/pull/1435
(https://github.com/httpwg/http-extensions/pull/1435)
* Consistently use "header field" (vs 'header"):
https://github.com/httpwg/http-extensions/pull/1527
(https://github.com/httpwg/http-extensions/pull/1527)
Acknowledgements Acknowledgements
RFC 6265 was written by Adam Barth. This document is a minor update RFC 6265 was written by Adam Barth. This document is an update of
of RFC 6265, adding small features, and aligning the specification RFC 6265, adding features and aligning the specification with the
with the reality of today's deployments. Here, we're standing upon reality of today's deployments. Here, we're standing upon the
the shoulders of a giant since the majority of the text is still shoulders of a giant since the majority of the text is still Adam's.
Adam's.
Authors' Addresses Authors' Addresses
Lily Chen (editor)
Google LLC
Email: chlily@google.com
Steven Englehardt (editor)
Mozilla
Email: senglehardt@mozilla.com
Mike West (editor) Mike West (editor)
Google, Inc Google LLC
Email: mkwst@google.com Email: mkwst@google.com
URI: https://mikewest.org/ URI: https://mikewest.org/
John Wilander (editor) John Wilander (editor)
Apple, Inc Apple, Inc
Email: wilander@apple.com Email: wilander@apple.com
 End of changes. 172 change blocks. 
395 lines changed or deleted 633 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/