<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.27 (Ruby 3.3.6) -->
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="pre5378Trust200902" docName="draft-annevk-johannhof-httpbis-cookies-01" category="std" consensus="true" submissionType="IETF" obsoletes="[6265]" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="Cookies">Cookies: HTTP State Management Mechanism</title>
    <seriesInfo name="Internet-Draft" value="draft-annevk-johannhof-httpbis-cookies-01"/>
    <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren" role="editor">
      <organization>Apple</organization>
      <address>
        <email>annevk@annevk.nl</email>
      </address>
    </author>
    <author initials="J." surname="Hofmann" fullname="Johann Hofmann" role="editor">
      <organization>Google</organization>
      <address>
        <email>johannhof@google.com</email>
      </address>
    </author>
    <date/>
    <abstract>
      <?line 124?>

<t>This document defines the HTTP <tt>Cookie</tt> and <tt>Set-Cookie</tt> header fields. These
header fields can be used by HTTP servers to store state (called cookies) at
HTTP user agents, letting the servers maintain a stateful session over the
mostly stateless HTTP protocol. Although cookies have many historical
infelicities that degrade their security and privacy, the <tt>Cookie</tt> and <tt>Set-Cookie</tt>
header fields are widely used on the Internet. This document obsoletes RFC
6265 and 6265bis.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://johannhof.github.io/draft-annevk-johannhof-httpbis-cookies/draft-annevk-johannhof-httpbis-cookies.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-annevk-johannhof-httpbis-cookies/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/johannhof/draft-annevk-johannhof-httpbis-cookies"/>.</t>
    </note>
  </front>
  <middle>
    <?line 134?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines the HTTP <tt>Cookie</tt> and <tt>Set-Cookie</tt> header fields. Using
the <tt>Set-Cookie</tt> header field, an HTTP server can pass name/value pairs and
associated metadata (called cookies) to a user agent. When the user agent makes
subsequent requests to the server, the user agent uses the metadata and other
information to determine whether to return the name/value pairs in the <tt>Cookie</tt>
header field.</t>
      <t>Although simple on their surface, cookies have a number of complexities. For
example, the server can scope the maximum amount of time during which the user
agent should return the cookie, the servers to which the user agent should
return the cookie, and whether the cookie can be accessed through a non-HTTP
API, such as JavaScript in a web browser.</t>
      <t>For historical reasons, cookies contain a number of security and privacy
infelicities. For example, a server can indicate that a given cookie is
intended for "secure" connections, but the cookie's Secure attribute does not provide
integrity in the presence of an active network attacker. Similarly, cookies
for a given host are shared across all the ports on that host, even though the
usual "same-origin policy" used by web browsers isolates content retrieved via
different ports.</t>
      <t>This document specifies the syntax and semantics of these header fields. Where some
existing software differs from the requirements in significant ways, the document
contains a note explaining the difference.</t>
      <t>This document obsoletes <xref target="RFC6265"/> and 6265bis.</t>
      <section anchor="examples">
        <name>Examples</name>
        <t>Using the <tt>Set-Cookie</tt> header field, a server can send the user agent a short string
in an HTTP response that the user agent will return in future HTTP requests that
are within the scope of the cookie. For example, the server can send the user
agent a "session identifier" named SID with the value 31d4d96e407aad42. The
user agent then returns the session identifier in subsequent requests.</t>
        <sourcecode type="example"><![CDATA[
== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42
]]></sourcecode>
        <t>The server can alter the default scope of the cookie using the Path and
Domain attributes. For example, the server can instruct the user agent to
return the cookie to every path and every subdomain of site.example.</t>
        <sourcecode type="example"><![CDATA[
== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42; Path=/; Domain=site.example

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42
]]></sourcecode>
        <t>As shown in the next example, the server can store multiple cookies at the user
agent. For example, the server can store a session identifier as well as the
user's preferred language by returning two <tt>Set-Cookie</tt> header fields. Notice
that the server uses the Secure and HttpOnly attributes to provide
additional security protections for the more sensitive session identifier (see
<xref target="sane-set-cookie-semantics"/>).</t>
        <sourcecode type="example"><![CDATA[
== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly
Set-Cookie: lang=en-US; Path=/; Domain=site.example

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; lang=en-US
]]></sourcecode>
        <t>Notice that the <tt>Cookie</tt> header field above contains two cookies, one named SID and
one named lang.</t>
        <t>Cookie names are case-sensitive, meaning that if a server sends the user agent
two Set-Cookie header fields that differ only in their name's case the user
agent will store and return both of those cookies in subsequent requests.</t>
        <sourcecode type="example"><![CDATA[
== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42
Set-Cookie: sid=31d4d96e407aad42

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; sid=31d4d96e407aad42
]]></sourcecode>
        <t>If the server wishes the user agent to persist the cookie over
multiple "sessions" (e.g., user agent restarts), the server can specify an
expiration date in the Expires attribute. Note that the user agent might
delete the cookie before the expiration date if the user agent's cookie store
exceeds its quota or if the user manually deletes the server's cookie.</t>
        <sourcecode type="example"><![CDATA[
== Server -> User Agent ==

Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; lang=en-US
]]></sourcecode>
        <t>Finally, to remove a cookie, the server returns a <tt>Set-Cookie</tt> header field with an
expiration date in the past. The server will be successful in removing the
cookie only if the Path and the Domain attribute in the <tt>Set-Cookie</tt> header field
match the values used when the cookie was created.</t>
        <sourcecode type="example"><![CDATA[
== Server -> User Agent ==

Set-Cookie: lang=; Expires=Sun, 06 Nov 1994 08:49:37 GMT

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42
]]></sourcecode>
      </section>
    </section>
    <section anchor="conventions">
      <name>Conventions</name>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>This specification depends on Infra. <xref target="INFRA"/></t>
        <t>Some terms used in this specification are defined in the following standards and specifications:</t>
        <ul spacing="normal">
          <li>
            <t>HTTP <xref target="RFC9110"/></t>
          </li>
          <li>
            <t>URL <xref target="URL"/></t>
          </li>
        </ul>
        <t>A <strong>non-HTTP API</strong> is a non-HTTP mechanisms used to set and retrieve
cookies, such as a web browser API that exposes cookies to JavaScript.</t>
      </section>
      <section anchor="abnf">
        <name>ABNF</name>
        <t>This specification uses the Augmented Backus-Naur Form (ABNF) notation of
<xref target="RFC5234"/>.</t>
        <t>The following core rules are included by reference, as defined in <xref target="RFC5234"/>,
Appendix B.1: ALPHA (letters), CR (carriage return), CRLF (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), OCTET (any
8-bit sequence of data except NUL), SP (space), HTAB (horizontal tab),
CHAR (any ASCII byte), VCHAR (any visible ASCII byte),
and WSP (whitespace).</t>
        <t>The OWS (optional whitespace) and BWS (bad whitespace) rules are defined in
<xref section="5.6.3" sectionFormat="of" target="RFC9110"/>.</t>
      </section>
    </section>
    <section anchor="implementation-advisory">
      <name>Which Requirements to Implement</name>
      <t>The upcoming two sections, <xref target="server-requirements"/> and <xref target="ua-requirements"/>, discuss
the set of requirements for two distinct types of implementations. This section
is meant to help guide implementers in determining which set of requirements
best fits their goals. Choosing the wrong set of requirements could result in a
lack of compatibility with other cookie implementations.</t>
      <t>It's important to note that being compatible means different things
depending on the implementer's goals. These differences have built up over time
due to both intentional and unintentional specification changes, specification interpretations,
and historical implementation differences.</t>
      <t>This section roughly divides implementers of this specification into two types,
producers and consumers. These are not official terms and are only used here to
help readers develop an intuitive understanding of the use cases.</t>
      <section anchor="cookie-producing-implementations">
        <name>Cookie Producing Implementations</name>
        <t>An implementer should choose <xref target="server-requirements"/> whenever cookies are created and
will be sent to a user agent, such as a web browser. These implementations are
frequently referred to as servers by the specification but that term includes anything
which primarily produces cookies. Some potential examples:</t>
        <ul spacing="normal">
          <li>
            <t>Server applications hosting a website or API</t>
          </li>
          <li>
            <t>Programming languages or software frameworks that support cookies</t>
          </li>
          <li>
            <t>Integrated third-party web applications, such as a business management suite</t>
          </li>
        </ul>
        <t>All these benefit from not only supporting as many user agents as possible but
also supporting other servers. This is useful if a cookie is produced by a
software framework and is later sent back to a server application which needs
to read it. <xref target="server-requirements"/> advises best practices that help maximize this
sense of compatibility.</t>
      </section>
      <section anchor="cookie-consuming-implementations">
        <name>Cookie Consuming Implementations</name>
        <t>An implementer should choose <xref target="ua-requirements"/> whenever cookies are primarily
received from another source. These implementations are referred to as user
agents. Some examples:</t>
        <ul spacing="normal">
          <li>
            <t>Web browsers</t>
          </li>
          <li>
            <t>Tools that support stateful HTTP</t>
          </li>
          <li>
            <t>Programming languages or software frameworks that support cookies</t>
          </li>
        </ul>
        <t>Because user agents don't know which servers a user will access, and whether
or not that server is following best practices, users agents are advised to
implement a more lenient set of requirements and to accept some things that
servers are warned against producing. <xref target="ua-requirements"/> advises best
practices that help maximize this sense of compatibility.</t>
      </section>
      <section anchor="languages-frameworks">
        <name>Programming Languages &amp; Software Frameworks</name>
        <t>A programming language or software framework with support for cookies could
reasonably be used to create an application that acts as a cookie producer,
cookie consumer, or both. Because a developer may want to maximize their
compatibility as either a producer or consumer, these languages or frameworks
should strongly consider supporting both sets of requirements, <xref target="server-requirements"/>
and <xref target="ua-requirements"/>, behind a compatibility mode toggle. This toggle should
default to <xref target="server-requirements"/>'s requirements.</t>
        <t>Doing so will reduce the chances that a developer's application can
inadvertently create cookies that cannot be read by other servers.</t>
      </section>
    </section>
    <section anchor="server-requirements">
      <name>Server Requirements</name>
      <t>This section describes the conforming syntax and semantics of the
HTTP <tt>Cookie</tt> and <tt>Set-Cookie</tt> header fields.</t>
      <section anchor="sane-set-cookie">
        <name>Set-Cookie</name>
        <t>The <tt>Set-Cookie</tt> HTTP response header field is used to send cookies from the server to
the user agent.</t>
        <t>Origin servers MAY send a <tt>Set-Cookie</tt> response header field with any response. An
origin server can include multiple <tt>Set-Cookie</tt> header fields in a single response.
The presence of a <tt>Cookie</tt> or a <tt>Set-Cookie</tt> header field does not preclude HTTP
caches from storing and reusing a response.</t>
        <t>Origin servers and intermediaries MUST NOT combine multiple Set-Cookie header
fields into a single header field. The usual mechanism for combining HTTP
headers fields (i.e., as defined in <xref section="5.3" sectionFormat="of" target="RFC9110"/>) might change
the semantics of the Set-Cookie header field because the %x2C (",") character
is used by Set-Cookie in a way that conflicts with such combining.</t>
        <t>For example,</t>
        <artwork><![CDATA[
Set-Cookie: a=b;path=/c,d=e
]]></artwork>
        <t>is ambiguous. It could be intended as two cookies, a=b and d=e, or a single
cookie with a path of /c,d=e.</t>
        <section anchor="abnf-syntax">
          <name>Syntax</name>
          <t>Informally, the <tt>Set-Cookie</tt> response header field contains a cookie, which begins with a
name-value-pair, followed by zero or more attribute-value pairs. Servers
MUST send <tt>Set-Cookie</tt> header fields that conform to the following grammar:</t>
          <sourcecode type="abnf"><![CDATA[
set-cookie        = set-cookie-string
set-cookie-string = BWS cookie-pair *( BWS ";" OWS cookie-av )
cookie-pair       = cookie-name BWS "=" BWS cookie-value
cookie-name       = token
cookie-value      = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
cookie-octet      = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
                      ; US-ASCII characters excluding CTLs,
                      ; whitespace, DQUOTE, comma, semicolon,
                      ; and backslash
token             = <token, defined in [HTTP], Section 5.6.2>

cookie-av         = expires-av / max-age-av / domain-av /
                    path-av / secure-av / httponly-av /
                    samesite-av / extension-av
expires-av        = "Expires" BWS "=" BWS sane-cookie-date
sane-cookie-date  =
    <IMF-fixdate, defined in [HTTP], Section 5.6.7>
max-age-av        = "Max-Age" BWS "=" BWS non-zero-digit *DIGIT
non-zero-digit    = %x31-39
                      ; digits 1 through 9
domain-av         = "Domain" BWS "=" BWS domain-value
domain-value      = <subdomain>
                      ; see details below
path-av           = "Path" BWS "=" BWS path-value
path-value        = *av-octet
secure-av         = "Secure"
httponly-av       = "HttpOnly"
samesite-av       = "SameSite" BWS "=" BWS samesite-value
samesite-value    = "Strict" / "Lax" / "None"
extension-av      = *av-octet
av-octet          = %x20-3A / %x3C-7E
                      ; any CHAR except CTLs or ";"
]]></sourcecode>
          <t>Note that some of the grammatical terms above reference documents that use
different grammatical notations than this document (which uses ABNF from
<xref target="RFC5234"/>).</t>
          <t>Per the grammar above, servers MUST NOT produce nameless cookies (i.e., an
empty cookie-name) as such cookies may be unpredictably serialized by user agents when
sent back to the server.</t>
          <t>The semantics of the cookie-value are not defined by this document.</t>
          <t>To maximize compatibility with user agents, servers that wish to store arbitrary
data in a cookie-value SHOULD encode that data, for example, using Base64
<xref target="RFC4648"/>.</t>
          <t>Per the grammar above, the cookie-value MAY be wrapped in DQUOTE characters.
Note that in this case, the initial and trailing DQUOTE characters are not
stripped. They are part of the cookie-value, and will be included in <tt>Cookie</tt>
header fields sent to the server.</t>
          <t>The domain-value is a subdomain as defined by <xref target="RFC1034"/>, Section 3.5, and
as enhanced by <xref target="RFC1123"/>, Section 2.1. Thus, domain-value is a byte sequence of
ASCII bytes.</t>
          <t>The portions of the set-cookie-string produced by the cookie-av term are
known as attributes. To maximize compatibility with user agents, servers SHOULD
NOT produce two attributes with the same name in the same set-cookie-string.</t>
          <t>NOTE: The name of an attribute-value pair is not case-sensitive. So while they
are presented here in CamelCase, such as <tt>HttpOnly</tt> or <tt>SameSite</tt>, any case is
accepted. E.g., <tt>httponly</tt>, <tt>Httponly</tt>, <tt>hTTPoNLY</tt>, etc.</t>
          <t>Servers MUST NOT include more than one <tt>Set-Cookie</tt> header field in the same
response with the same cookie-name. (See <xref target="set-cookie"/> for how user agents
handle this case.)</t>
          <t>If a server sends multiple responses containing <tt>Set-Cookie</tt> header fields
concurrently to the user agent (e.g., when communicating with the user agent
over multiple sockets), these responses create a "race condition" that can lead
to unpredictable behavior.</t>
          <t>NOTE: Some existing user agents differ in their interpretation of two-digit
years. To avoid compatibility issues, servers SHOULD use the rfc1123-date
format, which requires a four-digit year.</t>
          <t>NOTE: Some user agents store and process dates in cookies as 32-bit UNIX time_t
values. Implementation bugs in the libraries supporting time_t processing on
some systems might cause such user agents to process dates after the year 2038
incorrectly.</t>
        </section>
        <section anchor="sane-set-cookie-semantics">
          <name>Semantics (Non-Normative)</name>
          <t>This section describes simplified semantics of the <tt>Set-Cookie</tt> header field. These
semantics are detailed enough to be useful for understanding the most common
uses of cookies by servers. The full semantics are described in <xref target="ua-requirements"/>.</t>
          <t>When the user agent receives a <tt>Set-Cookie</tt> header field, the user agent stores the
cookie together with its attributes. Subsequently, when the user agent makes
an HTTP request, the user agent includes the applicable, non-expired cookies
in the <tt>Cookie</tt> header field.</t>
          <t>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, the
existing cookie is evicted and replaced with the new cookie. Notice that
servers can delete cookies by sending the user agent a new cookie with an
Expires attribute with a value in the past.</t>
          <t>Unless the cookie's attributes indicate otherwise, the cookie is returned only
to the origin server (and not, for example, to any subdomains), and it expires
at the end of the current session (as defined by the user agent). User agents
ignore unrecognized cookie attributes (but not the entire cookie).</t>
          <section anchor="attribute-expires">
            <name>The Expires Attribute</name>
            <t>The Expires attribute indicates the maximum lifetime of the cookie,
represented as the date and time at which the cookie expires. The user agent is
not required to retain the cookie until the specified date has passed. In fact,
user agents often evict cookies due to memory pressure or privacy concerns.</t>
          </section>
          <section anchor="attribute-max-age">
            <name>The Max-Age Attribute</name>
            <t>The Max-Age attribute indicates the maximum lifetime of the cookie,
represented as the number of seconds until the cookie expires. The user agent is
not required to retain the cookie for the specified duration. In fact, user
agents often evict cookies due to memory pressure or privacy concerns.</t>
            <t>NOTE: Some existing user agents do not support the Max-Age attribute. User
agents that do not support the Max-Age attribute ignore the attribute.</t>
            <t>If a cookie has both the Max-Age and the Expires attribute, the Max-Age
attribute has precedence and controls the expiration date of the cookie. If a
cookie has neither the Max-Age nor the Expires attribute, the user agent
will retain the cookie until "the current session is over" (as defined by the
user agent).</t>
          </section>
          <section anchor="attribute-domain">
            <name>The Domain Attribute</name>
            <t>The Domain attribute specifies those hosts to which the cookie will be sent.</t>
            <t>If the server includes the Domain attribute, the value applies to both the
specified domain and any subdomains. For example, if the value of the Domain
attribute is "site.example", the user agent will include the cookie in the
<tt>Cookie</tt> header field when making HTTP requests to site.example, www.site.example,
and www.corp.site.example. Note that a leading %x2E ("."), if present, is
ignored even though that character is not permitted.</t>
            <t>If the server omits the Domain attribute, the user agent will return the cookie
only to the origin server and not to any subdomains.</t>
            <t>WARNING: Some existing user agents treat an absent Domain attribute as if the
Domain attribute were present and contained the current host name. For
example, if site.example returns a <tt>Set-Cookie</tt> header field without a Domain
attribute, these user agents will erroneously send the cookie to
www.site.example and www.corp.site.example as well.</t>
            <t>The user agent will reject cookies unless the Domain attribute specifies a
scope for the cookie that would include the origin server. For example, the
user agent will accept a cookie with a 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 Domain attribute of "bar.site.example" or of
"baz.foo.site.example".</t>
          </section>
          <section anchor="attribute-path">
            <name>The Path Attribute</name>
            <t>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 agent will
use the "directory" of the request-uri's path component as the default value.
(See <xref target="cookie-path"/> for more details.)</t>
            <t>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 cookie's
Path attribute, where the %x2F ("/") character is interpreted as a directory
separator.</t>
            <t>Although seemingly useful for isolating cookies between different paths within
a given host, the Path attribute cannot be relied upon for security (see
<xref target="security-considerations"/>).</t>
          </section>
          <section anchor="attribute-secure">
            <name>The Secure Attribute</name>
            <t>The Secure attribute limits the scope of the cookie to "secure" channels
(where "secure" is outside the scope of this document). E.g., when a cookie has the Secure
attribute, the user agent will include the cookie in an HTTP request only if
the request is transmitted over a secure channel (typically HTTP over Transport
Layer Security (TLS) <xref target="RFC8446"/> <xref target="RFC9110"/>).</t>
          </section>
          <section anchor="attribute-httponly">
            <name>The HttpOnly Attribute</name>
            <t>The HttpOnly attribute limits the scope of the cookie to HTTP requests. In
particular, the attribute instructs the user agent to omit the cookie when
providing access to cookies via non-HTTP APIs.</t>
          </section>
          <section anchor="attribute-samesite">
            <name>The SameSite Attribute</name>
            <t>The SameSite attribute limits the scope of the cookie upon creation and delivery
with respect to whether the cookie is considered to be "same-site" within a larger context
(where "same-site" is outside the scope of this document). The SameSite attribute is particularly
relevant for web browsers and web applications accessible through them.</t>
            <t>The SameSite attribute supports Strict, Lax, and None as values.</t>
          </section>
        </section>
        <section anchor="server-name-prefixes">
          <name>Cookie Name Prefixes</name>
          <t><xref target="weak-confidentiality"/> and <xref target="weak-integrity"/> of this document spell out some of the drawbacks of cookies'
historical implementation. In particular, it 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 confidence in a backwards-compatible way, two common sets
of requirements can be inferred from the first few characters of the cookie's
name.</t>
          <t>To maximize compatibility with user agents, servers SHOULD use prefixes as
described below.</t>
          <section anchor="the-secure-prefix">
            <name>The "__Secure-" Prefix</name>
            <t>If a cookie's name begins with a case-sensitive match for the string
<tt>__Secure-</tt>, then the cookie will have been set with a <tt>Secure</tt> attribute.</t>
            <t>For example, the following <tt>Set-Cookie</tt> header field would be rejected by a conformant
user agent, as it does not have a <tt>Secure</tt> attribute.</t>
            <sourcecode type="example"><![CDATA[
Set-Cookie: __Secure-SID=12345; Domain=site.example
]]></sourcecode>
            <t>Whereas the following <tt>Set-Cookie</tt> header field would be accepted if set from a secure origin
(e.g. <tt>https://site.example/</tt>), and rejected otherwise:</t>
            <sourcecode type="example"><![CDATA[
Set-Cookie: __Secure-SID=12345; Domain=site.example; Secure
]]></sourcecode>
          </section>
          <section anchor="the-host-prefix">
            <name>The "__Host-" Prefix</name>
            <t>If a cookie's name begins with a case-sensitive match for the string
<tt>__Host-</tt>, then the cookie will have been set with a <tt>Secure</tt> attribute, a
<tt>Path</tt> attribute with a value of <tt>/</tt>, and no <tt>Domain</tt> attribute.</t>
            <t>This combination yields a cookie that hews as closely as a cookie can to
treating the origin as a security boundary. The lack of a <tt>Domain</tt> attribute
ensures that cookie's host-only is true, locking the cookie to a
particular host, rather than allowing it to span subdomains. Setting the <tt>Path</tt>
to <tt>/</tt> means that the cookie is effective for the entire host, and won't be
overridden for specific paths. The <tt>Secure</tt> attribute ensures that the cookie
is unaltered by non-secure origins, and won't span protocols.</t>
            <t>Ports are the only piece of the same-origin policy that <tt>__Host-</tt> cookies continue
to ignore.</t>
            <t>For example, the following cookies would always be rejected:</t>
            <sourcecode type="example"><![CDATA[
Set-Cookie: __Host-SID=12345
Set-Cookie: __Host-SID=12345; Secure
Set-Cookie: __Host-SID=12345; Domain=site.example
Set-Cookie: __Host-SID=12345; Domain=site.example; Path=/
Set-Cookie: __Host-SID=12345; Secure; Domain=site.example; Path=/
]]></sourcecode>
            <t>While the following would be accepted if set from a secure origin (e.g.
<tt>https://site.example/</tt>), and rejected otherwise:</t>
            <sourcecode type="example"><![CDATA[
Set-Cookie: __Host-SID=12345; Secure; Path=/
]]></sourcecode>
          </section>
        </section>
      </section>
      <section anchor="sane-cookie">
        <name>Cookie</name>
        <section anchor="server-syntax">
          <name>Syntax</name>
          <t>The user agent sends stored cookies to the origin server in the <tt>Cookie</tt> header field.
If the server conforms to the requirements in <xref target="sane-set-cookie"/> (and the user agent
conforms to the requirements in <xref target="ua-requirements"/>), the user agent will send a <tt>Cookie</tt>
header field that conforms to the following grammar:</t>
          <sourcecode type="abnf"><![CDATA[
cookie        = cookie-string
cookie-string = cookie-pair *( ";" SP cookie-pair )
]]></sourcecode>
          <t>While <xref section="5.4" sectionFormat="of" target="RFC9110"/> does not define a length limit for header
fields it is likely that the web server's implementation does impose a limit;
many popular implementations have default limits of 8 kibibytes. Servers SHOULD avoid
setting a large number of large cookies such that the final cookie-string
would exceed their header field limit. Not doing so could result in requests
to the server failing.</t>
          <t>Servers MUST be tolerant of multiple <tt>Cookie</tt> headers. For example, an HTTP/2
<xref target="RFC9113"/> or HTTP/3 <xref target="RFC9114"/> client or intermediary might split a <tt>Cookie</tt>
header to improve compression. Servers are free to determine what form this
tolerance takes. For example, the server could process each <tt>Cookie</tt> header
individually or the server could concatenate all the <tt>Cookie</tt> headers into one
and then process that final, single, header. The server should be mindful of
any header field limits when deciding which approach to take.</t>
          <t>Note: Since intermediaries can modify <tt>Cookie</tt> headers they should also be
mindful of common server header field limits in order to avoid sending servers
headers that they cannot process. For example, concatenating multiple cookie
 headers into a single header might exceed a server's size limit.</t>
        </section>
        <section anchor="semantics">
          <name>Semantics</name>
          <t>Each cookie-pair represents a cookie stored by the user agent. The
cookie-pair contains the cookie-name and cookie-value the user agent
received in the <tt>Set-Cookie</tt> header field.</t>
          <t>Notice that the cookie attributes are not returned. In particular, the server
cannot determine from the <tt>Cookie</tt>  field alone when a cookie will expire, for
which hosts the cookie is valid, for which paths the cookie is valid, or
whether the cookie was set with the Secure or HttpOnly attributes.</t>
          <t>The semantics of individual cookies in the <tt>Cookie</tt> header field are not defined by
this document. Servers are expected to imbue these cookies with
application-specific semantics.</t>
          <t>Although cookies are serialized linearly in the <tt>Cookie</tt> header field, servers SHOULD
NOT rely upon the serialization order. In particular, if the <tt>Cookie</tt> header field
contains two cookies with the same name (e.g., that were set with different
Path or Domain attributes), servers SHOULD NOT rely upon the order in which
these cookies appear in the header field.</t>
        </section>
      </section>
    </section>
    <section anchor="ua-requirements">
      <name>User Agent Requirements</name>
      <t>This section specifies the processing models associated with the <tt>Cookie</tt> and <tt>Set-Cookie</tt> header fields
in sufficient detail that a user agent can interoperate with existing servers (even those
that do not conform to the well-behaved profile described in <xref target="server-requirements"/>).</t>
      <t>A user agent could enforce more restrictions than those specified herein (e.g.,
restrictions specified by its cookie policy, described in <xref target="cookie-policy"/>).
However, such additional restrictions may reduce the likelihood that a user
agent will be able to interoperate with existing servers.</t>
      <section anchor="cookie-concepts">
        <name>Cookie Concepts</name>
        <t>To facilitate the algorithms that follow, a number of pre-requisite concepts need to be introduced.</t>
        <section anchor="cookie-store-and-limits">
          <name>Cookie Store And Limits</name>
          <t>A user agent has an associated <strong>cookie store</strong>, which is a list of cookies. It is initially « ».</t>
          <t>A user agent has an associated <strong>total cookies-per-host limit</strong>, which is an integer. It SHOULD be 50 or more.</t>
          <t>A user agent has an associated <strong>total cookies limit</strong>, which is an integer. It SHOULD be 3000 or more.</t>
          <t>A user agent has an associated <strong>cookie age limit</strong>, which is a number of days. It SHOULD be 400 days or less (see <xref target="cookie-policy"/>).</t>
        </section>
        <section anchor="cookie-struct">
          <name>Cookie Struct</name>
          <t>A <strong>cookie</strong> is a struct that represents a piece of state to be transmitted between a client and a
server.</t>
          <t>A cookie's <strong>name</strong> is a byte sequence. It always needs to be set.</t>
          <t>A cookie's <strong>value</strong> is a byte sequence. It always needs to be set.</t>
          <t>A cookie's <strong>secure</strong> is a boolean. It is initially false.</t>
          <t>A cookie's <strong>host</strong> is a domain, IP address, null, or failure. It is initially null. Note: Once a
cookie is in the user agent's cookie store its host is a domain or IP address.</t>
          <t>A cookie's <strong>host-only</strong> is a boolean. It is initially false.</t>
          <t>A cookie's <strong>path</strong> is a URL path.</t>
          <t>A cookie's <strong>same-site</strong> is "<tt>strict</tt>", "<tt>lax</tt>", "<tt>unset</tt>", or "<tt>none</tt>". It is initially "<tt>unset</tt>".</t>
          <t>A cookie's <strong>http-only</strong> is a boolean. It is initially false.</t>
          <!--
A cookie's **partition** is null or a partition-key. It is initially null.
-->

<t>A cookie's <strong>creation-time</strong> is a time. It is initially the current time.</t>
          <t>A cookie's <strong>expiry-time</strong> is null or a time. It is initially null. Note: A prior version of this
specification referred to null with a distinct "persistent-flag" field being false.</t>
          <t>A cookie's <strong>last-access-time</strong> is a time. It is initially the current time.</t>
          <section anchor="cookie-struct-miscellaneous">
            <name>Cookie Struct Miscellaneous</name>
            <t>A cookie is <strong>expired</strong> if its expiry-time is non-null and its expiry-time is in the past.</t>
          </section>
        </section>
      </section>
      <section anchor="cookie-store-eviction">
        <name>Cookie Store Eviction</name>
        <t>The user agent SHOULD evict all expired cookies from its cookie store if, at any
time, an expired cookie exists in the cookie store.</t>
        <t>When "the current session is over" (as defined by the user agent), the user
agent MUST remove from the cookie store all cookies whose expiry-time is null.</t>
        <section anchor="remove-excess-cookies-for-a-host">
          <name>Remove Excess Cookies for a Host</name>
          <t>To <strong>Remove Excess Cookies for a Host</strong> given a host <em>host</em>:</t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>insecureCookies</em> be all cookies in the user agent's cookie store whose host is host-equal to <em>host</em> and whose secure is false.</t>
            </li>
            <li>
              <t>Sort <em>insecureCookies</em> by earliest last-access-time first.</t>
            </li>
            <li>
              <t>Let <em>secureCookies</em> be all cookies in the user agent's cookie store whose host is host-equal to <em>host</em> and whose secure is true.</t>
            </li>
            <li>
              <t>Sort <em>secureCookies</em> by earliest last-access-time first.</t>
            </li>
            <li>
              <t>While <em>insecureCookies</em>'s size + <em>secureCookies</em>'s size is greater than the user agent's total cookies-per-host limit:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>If <em>insecureCookies</em> is not empty, remove the first item of <em>insecureCookies</em> and
 delete the corresponding cookie from the user agent's cookie store.</t>
                </li>
                <li>
                  <t>Otherwise, remove the first item of <em>secureCookies</em> and delete the corresponding cookie from the user agent's cookie store.</t>
                </li>
              </ol>
            </li>
          </ol>
        </section>
        <section anchor="remove-global-excess-cookies">
          <name>Remove Global Excess Cookies</name>
          <t>To <strong>Remove Global Excess Cookies</strong>:</t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>allCookies</em> be the result of sorting the user agent's cookie store by earliest last-access-time first.</t>
            </li>
            <li>
              <t>While <em>allCookies</em>'s size is greater than the user agent's total cookies limit:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>Remove the first item of <em>allCookies</em> and delete the corresponding cookie from the user agent's cookie store.</t>
                </li>
              </ol>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="subcomponent-algorithms">
        <name>Subcomponent Algorithms</name>
        <t>This section defines some algorithms used by user agents to process specific
subcomponents of the <tt>Cookie</tt> and <tt>Set-Cookie</tt> header fields.</t>
        <section anchor="cookie-date">
          <name>Parse a Date</name>
          <t>To <strong>Parse a Date</strong> given a byte sequence <em>input</em>, run these steps. They return a date and time or failure.</t>
          <t>Note that the various boolean flags defined as a part
of the algorithm (i.e., found-time, found-day-of-month, found-month,
found-year) are initially "not set".</t>
          <ol spacing="normal" type="1"><li>
              <t>Using the grammar below, divide the cookie-date into date-tokens.  </t>
              <sourcecode type="abnf"><![CDATA[
cookie-date     = *delimiter date-token-list *delimiter
date-token-list = date-token *( 1*delimiter date-token )
date-token      = 1*non-delimiter

delimiter       = %x09 / %x20-2F / %x3B-40 / %x5B-60 / %x7B-7E
non-delimiter   = %x00-08 / %x0A-1F / DIGIT / ":" / ALPHA
                  / %x7F-FF
non-digit       = %x00-2F / %x3A-FF

day-of-month    = 1*2DIGIT [ non-digit *OCTET ]
month           = ( "jan" / "feb" / "mar" / "apr" /
                    "may" / "jun" / "jul" / "aug" /
                    "sep" / "oct" / "nov" / "dec" ) *OCTET
year            = 2*4DIGIT [ non-digit *OCTET ]
time            = hms-time [ non-digit *OCTET ]
hms-time        = time-field ":" time-field ":" time-field
time-field      = 1*2DIGIT
]]></sourcecode>
            </li>
            <li>
              <t>Process each date-token sequentially in the order the date-tokens
appear in the cookie-date:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>If the found-time flag is not set and the token matches the
 time production, set the found-time flag and set the hour-value,
 minute-value, and second-value to the numbers denoted by the digits
 in the date-token, respectively. Skip the remaining sub-steps and
 continue to the next date-token.</t>
                </li>
                <li>
                  <t>If the found-day-of-month flag is not set and the date-token matches
 the day-of-month production, set the found-day-of-month flag and set
 the day-of-month-value to the number denoted by the date-token. Skip
 the remaining sub-steps and continue to the next date-token.</t>
                </li>
                <li>
                  <t>If the found-month flag is not set and the date-token matches the
 month production, set the found-month flag and set the month-value
 to the month denoted by the date-token. Skip the remaining sub-steps
 and continue to the next date-token.</t>
                </li>
                <li>
                  <t>If the found-year flag is not set and the date-token matches the
 year production, set the found-year flag and set the year-value to
 the number denoted by the date-token. Skip the remaining sub-steps
 and continue to the next date-token.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>If the year-value is greater than or equal to 70 and less than or equal to
99, increment the year-value by 1900.</t>
            </li>
            <li>
              <t>If the year-value is greater than or equal to 0 and less than or equal to
69, increment the year-value by 2000.  </t>
              <ol spacing="normal" type="1"><li>
                  <t>NOTE: Some existing user agents interpret two-digit years differently.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>If one of the following is true:  </t>
              <ul spacing="normal">
                <li>
                  <t>at least one of the found-day-of-month, found-month, found-year, or
found-time flags is not set,</t>
                </li>
                <li>
                  <t>the day-of-month-value is less than 1 or greater than 31,</t>
                </li>
                <li>
                  <t>the year-value is less than 1601,</t>
                </li>
                <li>
                  <t>the hour-value is greater than 23,</t>
                </li>
                <li>
                  <t>the minute-value is greater than 59, or</t>
                </li>
                <li>
                  <t>the second-value is greater than 59,</t>
                </li>
              </ul>
              <t>
then return failure.  </t>
              <t>
(Note that leap seconds cannot be represented in this syntax.)</t>
            </li>
            <li>
              <t>Let the parsed-cookie-date be the date whose day-of-month, month,
year, hour, minute, and second (in UTC) are the
day-of-month-value, the month-value, the year-value, the hour-value,
the minute-value, and the second-value, respectively. If no such date
exists, abort these steps and fail to parse the cookie-date.</t>
            </li>
            <li>
              <t>Return the parsed-cookie-date as the result of this algorithm.</t>
            </li>
          </ol>
        </section>
        <section anchor="domain-matching">
          <name>Domain Matching</name>
          <t>A host <em>host</em> <strong>Domain-Matches</strong> a string <em>domainAttributeValue</em> if at least one of the following is true:</t>
          <ul spacing="normal">
            <li>
              <t><em>host</em> equals <em>domainAttributeValue</em>, or</t>
            </li>
            <li>
              <t>if all of the following are true:  </t>
              <ul spacing="normal">
                <li>
                  <t><em>host</em> is a domain, and</t>
                </li>
                <li>
                  <t><em>host</em> ends with the concatenation of U+002E (.) and <em>domainAttributeValue</em>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="cookie-path">
          <name>Cookie Default Path</name>
          <t>To determine the <strong>Cookie Default Path</strong>, given a URL path <em>path</em>, run these steps.
They return a URL path.</t>
          <ol spacing="normal" type="1"><li>
              <t>Assert: <em>path</em> is a non-empty list.</t>
            </li>
            <li>
              <t>If <em>path</em>'s size is greater than 1, then remove <em>path</em>'s last item.</t>
            </li>
            <li>
              <t>Otherwise, set <em>path</em>[0] to the empty string.</t>
            </li>
            <li>
              <t>Return <em>path</em>.</t>
            </li>
          </ol>
        </section>
        <section anchor="path-matching">
          <name>Path Matching</name>
          <t>To determine if a URL path <em>requestPath</em> <strong>Path-Matches</strong> a URL path <em>cookiePath</em>, run these steps.
They return a boolean.</t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>serializedRequestPath</em> be the result of URL path serializing <em>requestPath</em>.</t>
            </li>
            <li>
              <t>Let <em>serializedCookiePath</em> be the result of URL path serializing <em>cookiePath</em>.</t>
            </li>
            <li>
              <t>If <em>serializedCookiePath</em> is <em>serializedRequestPath</em>, then return true.</t>
            </li>
            <li>
              <t>If <em>serializedRequestPath</em> starts with <em>serializedCookiePath</em> and <em>serializedCookiePath</em> ends
with a U+002F (/), then return true.</t>
            </li>
            <li>
              <t>Return whether the concatenation of <em>serializedRequestPath</em> followed by U+002F (/) starts with <em>serializedCookiePath</em>.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="main-algorithms">
        <name>Main Algorithms</name>
        <section anchor="parse-and-store-a-cookie">
          <name>Parse and Store a Cookie</name>
          <t>To <strong>Parse and Store a Cookie</strong> given a byte sequence <em>input</em>, boolean <em>isSecure</em>, domain or IP address <em>host</em>,
URL path <em>path</em>, boolean <em>httpOnlyAllowed</em>, boolean <em>allowNonHostOnlyCookieForPublicSuffix</em>, and boolean <em>sameSiteStrictOrLaxAllowed</em>:</t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>cookie</em> be the result of running Parse a Cookie with <em>input</em>, <em>isSecure</em>, <em>host</em>, and <em>path</em>.</t>
            </li>
            <li>
              <t>If <em>cookie</em> is failure, then return.</t>
            </li>
            <li>
              <t>Run Store a Cookie given <em>cookie</em>, <em>isSecure</em>, <em>host</em>, <em>path</em>, <em>httpOnlyAllowed</em>,
<em>allowNonHostOnlyCookieForPublicSuffix</em>, and <em>sameSiteStrictOrLaxAllowed</em>.</t>
            </li>
          </ol>
        </section>
        <section anchor="parse-a-cookie">
          <name>Parse a Cookie</name>
          <t>To <strong>Parse a Cookie</strong> given a byte sequence <em>input</em>, boolean <em>isSecure</em>, host <em>host</em>,
URL path <em>path</em>, run these steps. They return a new cookie or failure:</t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>input</em> contains a byte in the range 0x00 to 0x08, inclusive,
the range 0x0A to 0x1F inclusive, or 0x7F (CTL bytes excluding HTAB),
then return failure.</t>
            </li>
            <li>
              <t>Let <em>nameValueInput</em> be null.</t>
            </li>
            <li>
              <t>Let <em>attributesInput</em> be the empty byte sequence.</t>
            </li>
            <li>
              <t>If <em>input</em> contains 0x3B (;), then set <em>nameValueInput</em> to the bytes up to, but not including,
the first 0x3B (;), and <em>attributesInput</em> to the remainder of <em>input</em> (including the 0x3B (;) in question).</t>
            </li>
            <li>
              <t>Otherwise, set <em>nameValueInput</em> to <em>input</em>.</t>
            </li>
            <li>
              <t>Assert: <em>nameValueInput</em> is a byte sequence.</t>
            </li>
            <li>
              <t>Let <em>name</em> be null.</t>
            </li>
            <li>
              <t>Let <em>value</em> be null.</t>
            </li>
            <li>
              <t>If <em>nameValueInput</em> does not contain a 0x3D (=) character, then set <em>name</em>
to the empty byte sequence, and <em>value</em> to <em>nameValueInput</em>.</t>
            </li>
            <li>
              <t>Otherwise, set <em>name</em> to the bytes up to, but not
including, the first 0x3D (=), and set <em>value</em>
to the bytes after the first 0x3D (=) (possibly being the
empty byte sequence).</t>
            </li>
            <li>
              <t>Remove any leading or trailing WSP bytes from <em>name</em> and <em>value</em>.</t>
            </li>
            <li>
              <t>If <em>name</em>'s length + <em>value</em>'s length is 0 or is greater than 4096, then return failure.</t>
            </li>
            <li>
              <t>Let <em>cookie</em> be a new cookie whose name is <em>name</em> and value is <em>value</em>.</t>
            </li>
            <li>
              <t>Set <em>cookie</em>'s path to the result of running Cookie Default Path with <em>path</em>.  </t>
              <t>
Note: A <tt>Path</tt> attribute can override this.</t>
            </li>
            <li>
              <t>While <em>attributesInput</em> is not an empty byte sequence:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>Let <em>maxAgeSeen</em> be false.</t>
                </li>
                <li>
                  <t>Let <em>char</em> be the result of consuming the first byte of <em>attributesInput</em>.</t>
                </li>
                <li>
                  <t>Assert: <em>char</em> is 0x3B (;).</t>
                </li>
                <li>
                  <t>Let <em>attributeNameValueInput</em> be null.</t>
                </li>
                <li>
                  <t>If <em>attributesInput</em> contains 0x3B (;), then
set <em>attributeNameValueInput</em> to the result of consuming the bytes of
<em>attributesInput</em> up to, but not including, the first 0x3B (;).</t>
                </li>
                <li>
                  <t>Otherwise, set <em>attributeNameValueInput</em> to the result of consuming the remainder of <em>attributesInput</em>.</t>
                </li>
                <li>
                  <t>Let <em>attributeName</em> be null.</t>
                </li>
                <li>
                  <t>Let <em>attributeValue</em> be the empty string.</t>
                </li>
                <li>
                  <t>If <em>attributeNameValueInput</em> contains a 0x3D (=), then set <em>attributeName</em> to the bytes
up to, but not including, the first 0x3D (=) of <em>attributeNameValueInput</em>, and <em>attributeValue</em> to the bytes
after the first 0x3D (=) of <em>attributeNameValueInput</em>.</t>
                </li>
                <li>
                  <t>Otherwise, set <em>attributeName</em> to <em>attributeNameValueInput</em>.</t>
                </li>
                <li>
                  <t>Remove any leading or trailing WSP bytes from <em>attributeName</em> and <em>attributeValue</em>.</t>
                </li>
                <li>
                  <t>If <em>attributeValue</em>'s length is greater than 1024, then continue.</t>
                </li>
                <li>
                  <t>If <em>attributeName</em> is a byte-case-insensitive match for <tt>Expires</tt>:      </t>
                  <ol spacing="normal" type="1"><li>
                      <t>If <em>maxAgeSeen</em> is true, then continue.</t>
                    </li>
                    <li>
                      <t>Let <em>expiryTime</em> be the result of running Parse a Date given <em>attributeValue</em>.</t>
                    </li>
                    <li>
                      <t>If <em>attributeValue</em> is failure, then continue.</t>
                    </li>
                    <li>
                      <t>If <em>expiryTime</em> is greater than the current time and date + the user agent's cookie age limit,
then set <em>expiryTime</em> to the user agent's cookie age limit.</t>
                    </li>
                    <li>
                      <t>If <em>expiryTime</em> is earlier than the earliest date the user agent can
represent, the user agent MAY replace <em>expiryTime</em> with the earliest
representable date.</t>
                    </li>
                    <li>
                      <t>Set <em>cookie</em>'s expiry-time to <em>expiryTime</em>.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If <em>attributeName</em> is a byte-case-insensitive match for <tt>Max-Age</tt>:      </t>
                  <ol spacing="normal" type="1"><li>
                      <t>If <em>attributeValue</em> is empty, continue.</t>
                    </li>
                    <li>
                      <t>If the first byte of <em>attributeValue</em> is neither a DIGIT, nor 0x2D (-)
followed by a DIGIT, then continue.</t>
                    </li>
                    <li>
                      <t>If the remainder of <em>attributeValue</em> contains a non-DIGIT, then continue.</t>
                    </li>
                    <li>
                      <t>Let <em>deltaSeconds</em> be <em>attributeValue</em>, converted to a base 10 integer.</t>
                    </li>
                    <li>
                      <t>Set <em>deltaSeconds</em> to the smaller of <em>deltaSeconds</em> and the user agent's cookie age limit, in seconds.</t>
                    </li>
                    <li>
                      <t>If <em>deltaSeconds</em> is less than or equal to 0, let <em>expiryTime</em> be
the earliest representable date and time. Otherwise, let <em>expiryTime</em>
be the current date and time + <em>deltaSeconds</em> seconds.</t>
                    </li>
                    <li>
                      <t>Set <em>cookie</em>'s expiry-time to <em>expiryTime</em>.</t>
                    </li>
                    <li>
                      <t>Set <em>maxAgeSeen</em> to true.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If <em>attributeName</em> is a byte-case-insensitive match for <tt>Domain</tt>:      </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Let <em>host</em> be failure.</t>
                    </li>
                    <li>
                      <t>If <em>attributeValue</em> contains only ASCII bytes:          </t>
                      <ol spacing="normal" type="1"><li>
                          <t>Let <em>hostInput</em> be <em>attributeValue</em>, ASCII decoded.</t>
                        </li>
                        <li>
                          <t>If <em>hostInput</em> starts with U+002E (.), then set <em>hostInput</em> to <em>hostInput</em>
without its leading U+002E (.).</t>
                        </li>
                        <li>
                          <t>Set <em>host</em> to the result of host parsing <em>hostInput</em>.</t>
                        </li>
                      </ol>
                    </li>
                    <li>
                      <t>Set <em>cookie</em>'s host to <em>host</em>.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If <em>attributeName</em> is a byte-case-insensitive match for <tt>Path</tt>:      </t>
                  <ol spacing="normal" type="1"><li>
                      <t>If <em>attributeValue</em> is not empty and if the first byte of
<em>attributeValue</em> is 0x2F (/), then set <em>cookie</em>'s path to <em>attributeValue</em>
split on 0x2F (/).</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If <em>attributeName</em> is a byte-case-insensitive match for <tt>Secure</tt>:      </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Set <em>cookie</em>'s secure to true.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If <em>attributeName</em> is a byte-case-insensitive match for <tt>HttpOnly</tt>:      </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Set <em>cookie</em>'s http-only to true.</t>
                    </li>
                  </ol>
                </li>
                <li>
                  <t>If <em>attributeName</em> is a byte-case-insensitive match for <tt>SameSite</tt>:      </t>
                  <ol spacing="normal" type="1"><li>
                      <t>If <em>attributeValue</em> is a byte-case-insensitive match for <tt>None</tt>, then set <em>cookie</em>'s same-site to "none".</t>
                    </li>
                    <li>
                      <t>If <em>attributeValue</em> is a byte-case-insensitive match for <tt>Strict</tt>, then set <em>cookie</em>'s same-site to "strict".</t>
                    </li>
                    <li>
                      <t>If <em>attributeValue</em> is a byte-case-insensitive match for <tt>Lax</tt>, then set <em>cookie</em>'s same-site to "lax".</t>
                    </li>
                  </ol>
                </li>
              </ol>
            </li>
            <li>
              <t>Return <em>cookie</em>.</t>
            </li>
          </ol>
          <t>Note: Attributes with an unrecognized <em>attributeName</em> are ignored.</t>
          <t>Note: This intentionally overrides earlier cookie attributes so that generally the last specified
cookie attribute "wins".</t>
        </section>
        <section anchor="store-a-cookie">
          <name>Store a Cookie</name>
          <t>To <strong>Store a Cookie</strong> given a cookie <em>cookie</em>, boolean <em>isSecure</em>, domain or IP address <em>host</em>,
boolean <em>httpOnlyAllowed</em>, boolean <em>allowNonHostOnlyCookieForPublicSuffix</em>, and boolean <em>sameSiteStrictOrLaxAllowed</em>:</t>
          <ol spacing="normal" type="1"><li>
              <t>Assert: <em>cookie</em>'s name's length + <em>cookie</em>'s value's length is not 0 or greater than 4096.</t>
            </li>
            <li>
              <t>Assert: <em>cookie</em>'s name does not contain a byte in the range 0x00 to 0x08, inclusive, in the range 0x0A to 0x1F, inclusive, or
0x7F (CTL characters excluding HTAB).</t>
            </li>
            <li>
              <t>If <em>cookie</em>'s host is failure, then return.</t>
            </li>
            <li>
              <t>Set <em>cookie</em>'s creation-time and last-access-time to the current date and time.</t>
            </li>
            <li>
              <t>If <em>allowNonHostOnlyCookieForPublicSuffix</em> is false and <em>cookie</em>'s host is a public suffix:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>If <em>cookie</em>'s host is host-equal to <em>host</em>, then set <em>cookie</em>'s host to null.</t>
                </li>
                <li>
                  <t>Otherwise, return.</t>
                </li>
              </ol>
              <t>
Note: This step prevents <tt>attacker.example</tt> from disrupting the integrity of
 <tt>site.example</tt> by setting a cookie with a <tt>Domain</tt> attribute of <tt>example</tt>. In the
 event the end user navigates directly to <tt>example</tt>, a cookie can still be set and
 will forcibly have its host-only set to true.</t>
            </li>
            <li>
              <t>If <em>cookie</em>'s host is null:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>Set <em>cookie</em>'s host-only to true.</t>
                </li>
                <li>
                  <t>Set <em>cookie</em>'s host to <em>host</em>.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Otherwise:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>If <em>host</em> does not Domain-Match <em>cookie</em>'s host, then return.</t>
                </li>
                <li>
                  <t>Set <em>cookie</em>'s host-only to false.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Assert: <em>cookie</em>'s host is a domain or IP address.</t>
            </li>
            <li>
              <t>If <em>httpOnlyAllowed</em> is false and <em>cookie</em>'s http-only is true, then return.</t>
            </li>
            <li>
              <t>If <em>isSecure</em> is false:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>If <em>cookie</em>'s secure-only is true, then return.</t>
                </li>
                <li>
                  <t>If the user agent's cookie store contains at least one cookie <em>existingCookie</em> that meets all of the following criteria:      </t>
                  <ol spacing="normal" type="1"><li>
                      <t><em>existingCookie</em>'s name is <em>cookie</em>'s name;</t>
                    </li>
                    <li>
                      <t><em>existingCookie</em>'s secure-only is true;</t>
                    </li>
                    <li>
                      <t><em>existingCookie</em>'s host Domain-Matches <em>cookie</em>'s host, or vice-versa; and</t>
                    </li>
                    <li>
                      <t><em>cookie</em>'s path Path-Matches <em>existingCookie</em>'s path,</t>
                    </li>
                  </ol>
                  <t>
then return.      </t>
                  <t>
Note: The path comparison is not symmetric, ensuring only that a newly-created, non-secure
cookie does not overlay an existing secure cookie, providing some mitigation against
cookie-fixing attacks. That is, given an existing secure cookie named 'a' 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' or '/login/en'.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>If <em>cookie</em>'s same-site is not "<tt>none</tt>" and <em>sameSiteStrictOrLaxAllowed</em> is false,
then return.</t>
            </li>
            <li>
              <t>If <em>cookie</em>'s same-site is "<tt>none</tt>" and <em>cookie</em>'s secure-only is false,
then return.</t>
            </li>
            <li>
              <t>If <em>cookie</em>'s name, byte-lowercased, starts with <tt>__secure-</tt> and <em>cookie</em>'s secure-only is false,
then return.  </t>
              <t>
Note: The check here and those below are with a byte-lowercased value in order to protect servers that process these values in a case-insensitive manner.</t>
            </li>
            <li>
              <t>If <em>cookie</em>'s name, byte-lowercased, starts with <tt>__host-</tt> and not all of the following are true:  </t>
              <ol spacing="normal" type="1"><li>
                  <t><em>cookie</em>'s secure-only is true;</t>
                </li>
                <li>
                  <t><em>cookie</em>'s host-only is true; and</t>
                </li>
                <li>
                  <t><em>cookie</em>'s path's size is 1 and <em>cookie</em>'s path[0] is the empty string,</t>
                </li>
              </ol>
              <t>
then return.</t>
            </li>
            <li>
              <t>If <em>cookie</em>'s name is the empty byte sequence and one of the following is true:  </t>
              <ul spacing="normal">
                <li>
                  <t><em>cookie</em>'s value, byte-lowercased, starts with <tt>__secure-</tt>, or</t>
                </li>
                <li>
                  <t><em>cookie</em>'s value, byte-lowercased, starts with <tt>__host-</tt></t>
                </li>
              </ul>
              <t>
then return.</t>
            </li>
            <li>
              <t>If the user agent's cookie store contains a cookie <em>oldCookie</em> whose name is <em>cookie</em>'s name,
host is host-equal to <em>cookie</em>'s host, host-only is <em>cookie</em>'s host-only, and path is path-equal to <em>cookie</em>'s path:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>If <em>httpOnlyAllowed</em> is false and <em>oldCookie</em>'s http-only is true,
then return.</t>
                </li>
                <li>
                  <t>Set <em>cookie</em>'s creation-time to <em>oldCookie</em>'s creation-time.</t>
                </li>
                <li>
                  <t>Remove <em>oldCookie</em> from the user agent's cookie store.</t>
                </li>
              </ol>
              <t>
Note: This algorithm maintains the invariant that there is at most one such cookie.</t>
            </li>
            <li>
              <t>Insert <em>cookie</em> into the user agent's cookie store.</t>
            </li>
            <li>
              <t>Remove all expired cookies from the user agent's cookie store.</t>
            </li>
            <li>
              <t>Run Remove Excess Cookies for Host given <em>cookie</em>'s host.</t>
            </li>
            <li>
              <t>Run Remove Global Excess Cookies.</t>
            </li>
          </ol>
        </section>
        <section anchor="retrieve-cookies">
          <name>Retrieve Cookies</name>
          <t>To <strong>Retrieve Cookies</strong> given a boolean <em>isSecure</em>, host <em>host</em>, URL path <em>path</em>,
boolean <em>httpOnlyAllowed</em>, and string <em>sameSite</em>:</t>
          <ol spacing="normal" type="1"><li>
              <t>Assert: <em>sameSite</em> is "<tt>strict-or-less</tt>", "<tt>lax-or-less</tt>", "<tt>unset-or-less</tt>", or "<tt>none</tt>".</t>
            </li>
            <li>
              <t>Let <em>cookies</em> be all cookies from the user agent's cookie store that meet these conditions:  </t>
              <ul spacing="normal">
                <li>
                  <t>One of the following is true:      </t>
                  <ul spacing="normal">
                    <li>
                      <t>cookie's host-only is true and <em>host</em> is host-equal to cookie's host, or</t>
                    </li>
                    <li>
                      <t>cookie's host-only is false and <em>host</em> Domain-Matches cookie's host.</t>
                    </li>
                  </ul>
                  <t>
It's possible that the public suffix list changed since a cookie was
created. If this change results in a cookie's host becoming a public
suffix and the cookie's host-only is false, then that cookie SHOULD NOT
be returned.      </t>
                  <t>
XXX: We should probably move this requirement out-of-bound as this invalidation
should happen as part of updating the public suffixes.</t>
                </li>
                <li>
                  <t><em>path</em> Path-Matches cookie's path.</t>
                </li>
                <li>
                  <t>One of the following is true:      </t>
                  <ul spacing="normal">
                    <li>
                      <t>cookie's secure is true and <em>isSecure</em> is true, or</t>
                    </li>
                    <li>
                      <t>cookie's secure is false.</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>One of the following is true:      </t>
                  <ul spacing="normal">
                    <li>
                      <t>cookie's http-only is true and <em>httpOnlyAllowed</em> is true, or</t>
                    </li>
                    <li>
                      <t>cookie's http-only is false.</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>One of the following is true:      </t>
                  <ul spacing="normal">
                    <li>
                      <t>cookie's same-site is "<tt>strict</tt>" and <em>sameSite</em> is "<tt>strict-or-less</tt>";</t>
                    </li>
                    <li>
                      <t>cookie's same-site is "<tt>lax</tt>" and <em>sameSite</em> is one of "<tt>strict-or-less</tt>" or "<tt>lax-or-less</tt>";</t>
                    </li>
                    <li>
                      <t>cookie's same-site is "<tt>unset</tt>" and <em>sameSite</em> is one of "<tt>strict-or-less</tt>", "<tt>lax-or-less</tt>", or "<tt>unset-or-less</tt>"; or</t>
                    </li>
                    <li>
                      <t>cookie's same-site is "<tt>none</tt>".</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t>Sort <em>cookies</em> in the following order:  </t>
              <ul spacing="normal">
                <li>
                  <t>Cookies whose path's size is greater are listed before cookies whose path's size
is smaller.</t>
                </li>
                <li>
                  <t>Among cookies whose path's size is equal, cookies whose creation-time is earlier
are listed before cookies whose creation-time is later.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Set the last-access-time of each cookie of <em>cookies</em> to the current date and time
and reflect these changes in the user agent's cookie store.</t>
            </li>
            <li>
              <t>Return <em>cookies</em>.</t>
            </li>
          </ol>
        </section>
        <section anchor="serialize-cookies">
          <name>Serialize Cookies</name>
          <t>To <strong>Serialize Cookies</strong> given a list of cookies <em>cookies</em>:</t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>output</em> be an empty byte sequence.</t>
            </li>
            <li>
              <t>For each <em>cookie</em> of <em>cookies</em>:  </t>
              <ol spacing="normal" type="1"><li>
                  <t>If <em>output</em> is not the empty byte sequence, then append 0x3B (;) followed by 0x20 (SP) to <em>output</em>.</t>
                </li>
                <li>
                  <t>If <em>cookie</em>'s name is not the empty byte sequence, then append <em>cookie</em>'s name followed by
0x3D (=) to <em>output</em>.</t>
                </li>
                <li>
                  <t>Append <em>cookie</em>'s value to <em>output</em>.</t>
                </li>
              </ol>
            </li>
            <li>
              <t>Return <em>output</em>.</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="requirements-specific-to-non-browser-user-agents">
        <name>Requirements Specific to Non-Browser User Agents</name>
        <section anchor="set-cookie">
          <name>The Set-Cookie Header Field</name>
          <t>When a user agent receives a <tt>Set-Cookie</tt> header field in an HTTP response, the
user agent MAY ignore the <tt>Set-Cookie</tt> header field in its entirety as per its cookie policy
(see <xref target="cookie-policy"/>).</t>
          <t>User agents MAY ignore <tt>Set-Cookie</tt> header fields contained in responses with 100-level
status codes.</t>
          <t><tt>Set-Cookie</tt> 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 as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>isSecure</em> be a boolean indicating whether request's URL's scheme is deemed secure, in an implementation-defined manner.</t>
            </li>
            <li>
              <t>Let <em>host</em> be request's host.</t>
            </li>
            <li>
              <t>Let <em>path</em> be request's URL's path.</t>
            </li>
            <li>
              <t>Let <em>httpOnlyAllowed</em> be true.</t>
            </li>
            <li>
              <t>Let <em>allowNonHostOnlyCookieForPublicSuffix</em> be a boolean whose value is implementation-defined.</t>
            </li>
            <li>
              <t>Let <em>sameSiteStrictOrLaxAllowed</em> be a boolean whose value is implementation-defined.</t>
            </li>
            <li>
              <t>Let <em>cookie</em> be the result of running Parse and Store a Cookie given the header field value,
<em>isSecure</em>, <em>host</em>, <em>path</em>, <em>httpOnlyAllowed</em>, <em>allowNonHostOnlyCookieForPublicSuffix</em>, and
<em>sameSiteStrictOrLaxAllowed</em>.</t>
            </li>
          </ol>
        </section>
        <section anchor="cookie">
          <name>The Cookie Header Field</name>
          <t>The user agent includes stored cookies in the <tt>Cookie</tt> request header field.</t>
          <t>When the user agent generates an HTTP request, the user agent MUST NOT attach
more than one <tt>Cookie</tt> header field.</t>
          <t>A user agent MAY omit the <tt>Cookie</tt> header field in its entirety.</t>
          <t>If the user agent does attach a <tt>Cookie</tt> header field to an HTTP request, the
user agent MUST compute its value as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>isSecure</em> be a boolean indicating whether request's URL's scheme is deemed secure, in an implementation-defined manner.</t>
            </li>
            <li>
              <t>Let <em>host</em> be request's host.</t>
            </li>
            <li>
              <t>Let <em>path</em> be request's URL's path.</t>
            </li>
            <li>
              <t>Let <em>httpOnlyAllowed</em> be true.</t>
            </li>
            <li>
              <t>Let <em>sameSite</em> be a string whose value is implementation-defined, but has to be one of
"<tt>strict-or-less</tt>", "<tt>lax-or-less</tt>", "<tt>unset-or-less</tt>", or "<tt>none</tt>".</t>
            </li>
            <li>
              <t>Let <em>cookies</em> be the result of running Retrieve Cookies given <em>isSecure</em>, <em>host</em>, <em>path</em>,
<em>httpOnlyAllowed</em>, and <em>sameSite</em>.</t>
            </li>
            <li>
              <t>Return the result of running Serialize Cookies given <em>cookies</em>.</t>
            </li>
          </ol>
          <t>Note: Previous versions of this specification required that only one Cookie
header field be sent in requests. This is no longer a requirement. While this
specification requires that a single cookie-string be produced, some user agents
may split that string across multiple <tt>Cookie</tt> header fields. For examples, see
<xref section="8.2.3" sectionFormat="of" target="RFC9113"/> and <xref section="4.2.1" sectionFormat="of" target="RFC9114"/>.</t>
        </section>
      </section>
      <section anchor="requirements-specific-to-browser-user-agents">
        <name>Requirements Specific to Browser User Agents</name>
        <t>While browsers are expected to generally follow the same model as non-browser user agents, they
have additional complexity due to the document model (and the ability to nest documents) that is
considered out-of-scope for this specification.</t>
        <t>Specifications for such a user agent are expected to build upon the following algorithms
and invoke them appropriately to process <tt>Cookie</tt> and <tt>Set-Cookie</tt> header fields, as well as
manipulating the user agent's cookie store through non-HTTP APIs:</t>
        <ul spacing="normal">
          <li>
            <t>Parse and Store a Cookie</t>
          </li>
          <li>
            <t>Store a Cookie</t>
          </li>
          <li>
            <t>Retrieve Cookies</t>
          </li>
          <li>
            <t>Serialize Cookies</t>
          </li>
        </ul>
        <t>This provides the flexibility browsers need to detail their requirements in considerable detail.</t>
      </section>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <section anchor="limits">
        <name>Limits</name>
        <t>Servers SHOULD use as few and as small cookies as possible to avoid reaching
these implementation limits, minimize network bandwidth due to the
<tt>Cookie</tt> header field being included in every request, and to avoid reaching
server header field limits (See <xref target="server-syntax"/>).</t>
        <t>Servers SHOULD gracefully degrade if the user agent fails to return one or more
cookies in the <tt>Cookie</tt> header field because the user agent might evict any cookie
at any time.</t>
      </section>
      <section anchor="application-programming-interfaces">
        <name>Application Programming Interfaces</name>
        <t>One reason the <tt>Cookie</tt> and <tt>Set-Cookie</tt> header fields use such esoteric syntax is
that many platforms (both in servers and user agents) provide a string-based
application programming interface (API) to cookies, requiring
application-layer programmers to generate and parse the syntax used by the
<tt>Cookie</tt> and <tt>Set-Cookie</tt> header fields, which many programmers have done incorrectly,
resulting in interoperability problems.</t>
        <t>Instead of providing string-based APIs to cookies, platforms would be
well-served by providing more semantic APIs. It is beyond the scope of this
document to recommend specific API designs, but there are clear benefits to
accepting an abstract "Date" object instead of a serialized date string.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>Cookies' primary privacy risk is their ability to correlate user activity. This
can happen on a single site, but is most problematic when activity is tracked across different,
seemingly unconnected Web sites to build a user profile.</t>
      <t>Over time, this capability (warned against explicitly in <xref target="RFC2109"/> and all of its successors)
has become widely used for varied reasons including:</t>
      <ul spacing="normal">
        <li>
          <t>authenticating users across sites,</t>
        </li>
        <li>
          <t>assembling information on users,</t>
        </li>
        <li>
          <t>protecting against fraud and other forms of undesirable traffic,</t>
        </li>
        <li>
          <t>targeting advertisements at specific users or at users with specified attributes,</t>
        </li>
        <li>
          <t>measuring how often ads are shown to users, and</t>
        </li>
        <li>
          <t>recognizing when an ad resulted in a change in user behavior.</t>
        </li>
      </ul>
      <t>While not every use of cookies is necessarily problematic for privacy, their potential for abuse
has become a widespread concern in the Internet community and broader society. In response to these concerns, user agents
have actively constrained cookie functionality in various ways (as allowed and encouraged by
previous specifications), while avoiding disruption to features they judge desirable for the health
of the Web.</t>
      <t>It is too early to declare consensus on which specific mechanism(s) should be used to mitigate cookies' privacy impact; user agents' ongoing changes to how they are handled are best characterised as experiments that
can provide input into that eventual consensus.</t>
      <t>Instead, this document describes limited, general mitigations against the privacy risks associated
with cookies that enjoy wide deployment at the time of writing. It is expected that implementations
will continue to experiment and impose stricter, more well-defined limitations on cookies over
time. Future versions of this document might codify those mechanisms based upon deployment
experience. If functions that currently rely on cookies can be supported by separate, targeted
mechanisms, they might be documented in separate specifications and stricter limitations on cookies
might become feasible.</t>
      <t>Note that cookies are not the only mechanism that can be used to track users across sites, so while
these mitigations are necessary to improve Web privacy, they are not sufficient on their own.</t>
      <section anchor="third-party-cookies">
        <name>Third-Party Cookies</name>
        <t>A "third-party" or cross-site cookie is one that is associated with embedded content (such as
scripts, images, stylesheets, frames) that is obtained from a different server than the one that
hosts the primary resource (usually, the Web page that the user is viewing). Third-party cookies
are often used to correlate users' activity on different sites.</t>
        <t>Because of their inherent privacy issues, most user agents now limit third-party cookies in a
variety of ways. Some completely block third-party cookies by refusing to process third-party
<tt>Set-Cookie</tt> header fields and refusing to send third-party <tt>Cookie</tt> header fields. Some partition
cookies based upon the first-party context, so that different cookies are sent depending on the
site being browsed. Some block cookies based upon user agent cookie policy and/or user controls.</t>
        <t>While this document does not endorse or require a specific approach, it is RECOMMENDED that user
agents adopt a policy for third-party cookies that is as restrictive as compatibility constraints
permit. Consequently, resources cannot rely upon third-party cookies being treated consistently by
user agents for the foreseeable future.</t>
      </section>
      <section anchor="cookie-policy">
        <name>Cookie Policy</name>
        <t>User agents MAY enforce a cookie policy consisting of restrictions on how
cookies may be used or ignored (see <xref target="set-cookie"/>).</t>
        <t>A cookie policy may govern which domains or parties, as in first and third parties
(see <xref target="third-party-cookies"/>), for which the user agent will allow cookie access.
The policy can also define limits on cookie size, cookie expiry (see
<xref target="attribute-expires"/> and <xref target="attribute-max-age"/>), and the number of cookies per
domain or in total.</t>
        <t>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 <xref target="user-controls"/>).</t>
      </section>
      <section anchor="user-controls">
        <name>User Controls</name>
        <t>User agents SHOULD provide users with a mechanism for managing the cookies
stored in the cookie store. For example, a user agent might let users delete
all cookies received during a specified time period or all the cookies related
to a particular domain. In addition, many user agents include a user interface
element that lets users examine the cookies stored in their cookie store.</t>
        <t>User agents SHOULD provide users with a mechanism for disabling cookies. When
cookies are disabled, the user agent MUST NOT include a <tt>Cookie</tt> header field in
outbound HTTP requests and the user agent MUST NOT process <tt>Set-Cookie</tt> header fields
in inbound HTTP responses.</t>
        <t>User agents MAY offer a way to change the cookie policy (see
<xref target="cookie-policy"/>).</t>
        <t>User agents MAY provide users the option of preventing persistent storage of
cookies across sessions. When configured thusly, user agents MUST treat all
received cookies as if their expiry-time is null.</t>
      </section>
      <section anchor="expiration-dates">
        <name>Expiration Dates</name>
        <t>Although servers can set the expiration date for cookies to the distant future,
most user agents do not actually retain cookies for multiple decades. Rather
than choosing gratuitously long expiration periods, servers SHOULD promote user
privacy by selecting reasonable cookie expiration periods based on the purpose
of the cookie. For example, a typical session identifier might reasonably be
set to expire in two weeks.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="overview">
        <name>Overview</name>
        <t>Cookies have a number of security pitfalls. This section overviews a few of the
more salient issues.</t>
        <t>In particular, cookies encourage developers to rely on ambient authority for
authentication, often becoming vulnerable to attacks such as cross-site request
forgery <xref target="CSRF"/>. Also, when storing session identifiers in cookies, developers
often create session fixation vulnerabilities.</t>
        <t>Transport-layer encryption, such as that employed in HTTPS, is insufficient to
prevent a network attacker from obtaining or altering a victim's cookies because
the cookie protocol itself has various vulnerabilities (see "Weak Confidentiality"
and "Weak Integrity", below). In addition, by default, cookies do not provide
confidentiality or integrity from network attackers, even when used in conjunction
with HTTPS.</t>
      </section>
      <section anchor="ambient-authority">
        <name>Ambient Authority</name>
        <t>A server that uses cookies to authenticate users can suffer security
vulnerabilities because some user agents let remote parties issue HTTP requests
from the user agent (e.g., via HTTP redirects or HTML forms). When issuing
those requests, user agents attach cookies even if the remote party does not
know the contents of the cookies, potentially letting the remote party exercise
authority at an unwary server.</t>
        <t>Although this security concern goes by a number of names (e.g., cross-site
request forgery, confused deputy), the issue stems from cookies being a form of
ambient authority. Cookies encourage server operators to separate designation
(in the form of URLs) from authorization (in the form of cookies).
Consequently, the user agent might supply the authorization for a resource
designated by the attacker, possibly causing the server or its clients to
undertake actions designated by the attacker as though they were authorized by
the user.</t>
        <t>Instead of using cookies for authorization, server operators might wish to
consider entangling designation and authorization by treating URLs as
capabilities. Instead of storing secrets in cookies, this approach stores
secrets in URLs, requiring the remote entity to supply the secret itself.
Although this approach is not a panacea, judicious application of these
principles can lead to more robust security.</t>
      </section>
      <section anchor="clear-text">
        <name>Clear Text</name>
        <t>Unless sent over a secure channel (such as TLS <xref target="RFC8446"/>), the information in the <tt>Cookie</tt>
and <tt>Set-Cookie</tt> header fields is transmitted in the clear.</t>
        <ol spacing="normal" type="1"><li>
            <t>All sensitive information conveyed in these header fields is exposed to an
eavesdropper.</t>
          </li>
          <li>
            <t>A malicious intermediary could alter the header fields as they travel in either
direction, with unpredictable results.</t>
          </li>
          <li>
            <t>A malicious client could alter the <tt>Cookie</tt> header fields before transmission,
with unpredictable results.</t>
          </li>
        </ol>
        <t>Servers SHOULD encrypt and sign the contents of cookies (using whatever format
the server desires) when transmitting them to the user agent (even when sending
the cookies over a secure channel). However, encrypting and signing cookie
contents does not prevent an attacker from transplanting a cookie from one user
agent to another or from replaying the cookie at a later time.</t>
        <t>In addition to encrypting and signing the contents of every cookie, servers that
require a higher level of security SHOULD use the <tt>Cookie</tt> and <tt>Set-Cookie</tt>
header fields only over a secure channel. When using cookies over a secure channel,
servers SHOULD set the Secure attribute (see <xref target="attribute-secure"/>) for every
cookie. If a server does not set the Secure attribute, the protection
provided by the secure channel will be largely moot.</t>
        <t>For example, consider a webmail server that stores a session identifier in a
cookie and is typically accessed over HTTPS. If the server does not set the
Secure attribute on its cookies, an active network attacker can intercept any
outbound HTTP request from the user agent and redirect that request to the
webmail server over HTTP. Even if the webmail server is not listening for HTTP
connections, the user agent will still include cookies in the request. The
active network attacker can intercept these cookies, replay them against the
server, and learn the contents of the user's email. If, instead, the server had
set the Secure attribute on its cookies, the user agent would not have
included the cookies in the clear-text request.</t>
      </section>
      <section anchor="session-identifiers">
        <name>Session Identifiers</name>
        <t>Instead of storing session information directly in a cookie (where it might be
exposed to or replayed by an attacker), servers commonly store a nonce (or
"session identifier") in a cookie. When the server receives an HTTP request
with a nonce, the server can look up state information associated with the
cookie using the nonce as a key.</t>
        <t>Using session identifier cookies limits the damage an attacker can cause if the
attacker learns the contents of a cookie because the nonce is useful only for
interacting with the server (unlike non-nonce cookie content, which might itself
be sensitive). Furthermore, using a single nonce prevents an attacker from
"splicing" together cookie content from two interactions with the server, which
could cause the server to behave unexpectedly.</t>
        <t>Using session identifiers is not without risk. For example, the server SHOULD
take care to avoid "session fixation" vulnerabilities. A session fixation attack
proceeds in three steps. First, the attacker transplants a session identifier
from his or her user agent to the victim's user agent. Second, the victim uses
that session identifier to interact with the server, possibly imbuing the
session identifier with the user's credentials or confidential information.
Third, the attacker uses the session identifier to interact with server
directly, possibly obtaining the user's authority or confidential information.</t>
      </section>
      <section anchor="weak-confidentiality">
        <name>Weak Confidentiality</name>
        <t>Cookies do not provide isolation by port. If a cookie is readable by a service
running on one port, the cookie is also readable by a service running on another
port of the same server. If a cookie is writable by a service on one port, the
cookie is also writable by a service running on another port of the same server.
For this reason, servers SHOULD NOT both run mutually distrusting services on
different ports of the same host and use cookies to store security-sensitive
information.</t>
        <t>Cookies do not provide isolation by scheme. Although most commonly used with
the http and https schemes, the cookies for a given host might also be
available to other schemes, such as ftp and gopher. Although this lack of
isolation by scheme is most apparent in non-HTTP APIs that permit access to
cookies (e.g., HTML's document.cookie API), the lack of isolation by scheme
is actually present in requirements for processing cookies themselves (e.g.,
consider retrieving a URI with the gopher scheme via HTTP).</t>
        <t>Cookies do not always provide isolation by path. Although the network-level
protocol does not send cookies stored for one path to another, some user
agents expose cookies via non-HTTP APIs, such as HTML's document.cookie API.
Because some of these user agents (e.g., web browsers) do not isolate resources
received from different paths, a resource retrieved from one path might be able
to access cookies stored for another path.</t>
      </section>
      <section anchor="weak-integrity">
        <name>Weak Integrity</name>
        <t>Cookies do not provide integrity guarantees for sibling domains (and their
subdomains). For example, consider foo.site.example and bar.site.example. The
foo.site.example server can set a cookie with a Domain attribute of
"site.example" (possibly overwriting an existing "site.example" cookie set by
bar.site.example), and the user agent will include that cookie in HTTP requests
to bar.site.example. 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 might be able to leverage this ability to mount an attack against
bar.site.example.</t>
        <t>Even though the <tt>Set-Cookie</tt> header field supports the Path attribute, the Path
attribute does not provide any integrity protection because the user agent
will accept an arbitrary Path attribute in a <tt>Set-Cookie</tt> 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 "/qux". Consequently, servers SHOULD NOT
both run mutually distrusting services on different paths of the same host and
use cookies to store security-sensitive information.</t>
        <t>An active network attacker can also inject cookies into the <tt>Cookie</tt> header field
sent to <tt>https://site.example/</tt> by impersonating a response from
<tt>http://site.example/</tt> and injecting a <tt>Set-Cookie</tt> header field. The HTTPS server
at site.example will be unable to distinguish these cookies from cookies that
it set itself in an HTTPS response. An active network attacker might be able
to leverage this ability to mount an attack against site.example even if
site.example uses HTTPS exclusively.</t>
        <t>Servers can partially mitigate these attacks by encrypting and signing the
contents of their cookies, or by naming the cookie with the <tt>__Secure-</tt> prefix.
However, using cryptography does not mitigate the issue completely because an
attacker can replay a cookie he or she received from the authentic site.example
server in the user's session, with unpredictable results.</t>
        <t>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 reaches its storage
limit, the user agent will be forced to evict some cookies. Servers SHOULD NOT
rely upon user agents retaining cookies.</t>
      </section>
      <section anchor="reliance-on-dns">
        <name>Reliance on DNS</name>
        <t>Cookies rely upon the Domain Name System (DNS) for security. If the DNS is
partially or fully compromised, the cookie protocol might fail to provide the
security properties required by applications.</t>
      </section>
      <section anchor="samesite-cookies">
        <name>SameSite Cookies</name>
        <t>SameSite cookies offer a robust defense against CSRF attack when deployed in
strict mode, and when supported by the client. It is, however, prudent to ensure
that this designation is not the extent of a site's defense against CSRF, as
same-site navigations and submissions can certainly be executed in conjunction
with other attack vectors such as cross-site scripting.</t>
        <t>Developers are strongly encouraged to deploy the usual server-side defenses
(CSRF tokens, ensuring that "safe" HTTP methods are idempotent, etc) to mitigate
the risk more fully.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="iana-cookie">
        <name>Cookie</name>
        <t>The HTTP Field Name Registry (see <xref target="HttpFieldNameRegistry"/>) needs to be
updated with the following registration:</t>
        <dl>
          <dt>Header field name:</dt>
          <dd>
            <t>Cookie</t>
          </dd>
          <dt>Applicable protocol:</dt>
          <dd>
            <t>http</t>
          </dd>
          <dt>Status:</dt>
          <dd>
            <t>standard</t>
          </dd>
          <dt>Author/Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification document:</dt>
          <dd>
            <t>this specification (<xref target="cookie"/>)</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-set-cookie">
        <name>Set-Cookie</name>
        <t>The HTTP Field Name Registry (see <xref target="HttpFieldNameRegistry"/>) needs to be
updated with the following registration:</t>
        <dl>
          <dt>Header field name:</dt>
          <dd>
            <t>Set-Cookie</t>
          </dd>
          <dt>Applicable protocol:</dt>
          <dd>
            <t>http</t>
          </dd>
          <dt>Status:</dt>
          <dd>
            <t>standard</t>
          </dd>
          <dt>Author/Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification document:</dt>
          <dd>
            <t>this specification (<xref target="set-cookie"/>)</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="changes">
      <name>Changes</name>
      <t>Revamped the document to allow for more detailed requirements on browsers in downstream specifications.</t>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Many thanks to Adam Barth for laying the groundwork for a modern cookie specification with RFC 6265.</t>
      <t>And thanks to John Wilander, Lily Chen, Mike West, Steven Bingler, and Steven Englehardt for improving upon that work in subsequent drafts.</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC8446" to="TLS13"/>
    <displayreference target="RFC9114" to="HTTP"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC1034">
          <front>
            <title>Domain names - concepts and facilities</title>
            <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/>
            <date month="November" year="1987"/>
            <abstract>
              <t>This RFC is the revised basic definition of The Domain Name System. It obsoletes RFC-882. This memo describes the domain style names and their used for host address look up and electronic mail forwarding. It discusses the clients and servers in the domain name system and the protocol used between them.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="13"/>
          <seriesInfo name="RFC" value="1034"/>
          <seriesInfo name="DOI" value="10.17487/RFC1034"/>
        </reference>
        <reference anchor="RFC1123">
          <front>
            <title>Requirements for Internet Hosts - Application and Support</title>
            <author fullname="R. Braden" initials="R." role="editor" surname="Braden"/>
            <date month="October" year="1989"/>
            <abstract>
              <t>This RFC is an official specification for the Internet community. It incorporates by reference, amends, corrects, and supplements the primary protocol standards documents relating to hosts. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="3"/>
          <seriesInfo name="RFC" value="1123"/>
          <seriesInfo name="DOI" value="10.17487/RFC1123"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="HTML" target="https://html.spec.whatwg.org/">
          <front>
            <title>HTML</title>
            <author initials="I." surname="Hickson" fullname="Ian Hickson">
              <organization>Google, Inc.</organization>
            </author>
            <author initials="S." surname="Pieters" fullname="Simon Pieters">
              <organization>Mozilla</organization>
            </author>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple</organization>
            </author>
            <author initials="P." surname="Jägenstedt" fullname="Philip Jägenstedt">
              <organization>Google</organization>
            </author>
            <author initials="D." surname="Denicola" fullname="Domenic Denicola">
              <organization>Google, Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="INFRA" target="https://infra.spec.whatwg.org">
          <front>
            <title>Infra</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple</organization>
            </author>
            <author initials="D." surname="Denicola" fullname="Domenic Denicola">
              <organization>Google, Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="URL" target="https://url.spec.whatwg.org">
          <front>
            <title>URL</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC6265">
          <front>
            <title>HTTP State Management Mechanism</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="April" year="2011"/>
            <abstract>
              <t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol. Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet. This document obsoletes RFC 2965. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6265"/>
          <seriesInfo name="DOI" value="10.17487/RFC6265"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC7034">
          <front>
            <title>HTTP Header Field X-Frame-Options</title>
            <author fullname="D. Ross" initials="D." surname="Ross"/>
            <author fullname="T. Gondrom" initials="T." surname="Gondrom"/>
            <date month="October" year="2013"/>
            <abstract>
              <t>To improve the protection of web applications against clickjacking, this document describes the X-Frame-Options HTTP header field, which declares a policy, communicated from the server to the client browser, regarding whether the browser may display the transmitted content in frames that are part of other web pages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7034"/>
          <seriesInfo name="DOI" value="10.17487/RFC7034"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="RFC9114">
          <front>
            <title>HTTP/3</title>
            <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment. This document describes a mapping of HTTP semantics over QUIC. This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9114"/>
          <seriesInfo name="DOI" value="10.17487/RFC9114"/>
        </reference>
        <reference anchor="CSRF" target="http://portal.acm.org/citation.cfm?id=1455770.1455782">
          <front>
            <title>Robust Defenses for Cross-Site Request Forgery</title>
            <author initials="A." surname="Barth" fullname="Adam Barth">
              <organization/>
            </author>
            <author initials="C." surname="Jackson">
              <organization/>
            </author>
            <author initials="J." surname="Mitchell">
              <organization/>
            </author>
            <date year="2008" month="October"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/1455770.1455782"/>
          <seriesInfo name="ISBN" value="978-1-59593-810-7"/>
          <seriesInfo name="ACM" value="CCS '08: Proceedings of the 15th ACM conference on Computer and communications security (pages 75-88)"/>
        </reference>
        <reference anchor="HttpFieldNameRegistry" target="https://www.iana.org/assignments/http-fields/">
          <front>
            <title>Hypertext Transfer Protocol (HTTP) Field Name Registry</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC2109">
          <front>
            <title>HTTP State Management Mechanism</title>
            <author fullname="D. Kristol" initials="D." surname="Kristol"/>
            <author fullname="L. Montulli" initials="L." surname="Montulli"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document specifies a way to create a stateful session with HTTP requests and responses. It describes two new headers, Cookie and Set- Cookie, which carry state information between participating origin servers and user agents. The method described here differs from Netscape's Cookie proposal, but it can interoperate with HTTP/1.0 user agents that use Netscape's method. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2109"/>
          <seriesInfo name="DOI" value="10.17487/RFC2109"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+2963LbWJYm+n8/BY4cfSy5SFryJdNWdta00mlXqsZ2+ljO
ypro6LBBEqRQBgE2AEpiOdxPM//mEeZfz4ud9a219g0AJTnTdWZ+nI7oShkE
9mXttdf9Mh6PTZu3RXac7D2rqo951hwnP7179yY5a9M2S16lZbrMVlnZJq+y
2Xla5s1qz6TTaZ1d+E/2zLyalemKRpnX6aIdp2WZXXwc/62iL8rzajE+b9v1
NG/GM/lgfHhk5jT+cfLpx5N3zz+bGf1jWdXb46Rp56aaNlWRtbQWk4yTbx58
89gkd+gvGTzPWj9gvZjhd/rTmGYzXeVNk1dlu13T2KfP370w+bo+TtZ19vjh
t0/e1ZumfXB4+PTwgbmTpHWWHicn63WR0/T0VZOk5Tx5m6XF+F2+yuiVy6r+
uKyrzVqAYtb5cfKvbTUbJfQ/eTknuIySpqrbOls09Nd2pX+0dT6jn2bVap3q
HwAi/ZSXRV5m/2aaliZ7nxZVSSvdZk1y571pVmndvv/3TYWtJ2VlzEVWbjKC
QhKuIklkf7/S6vJymfwJv9HT8wonAMg0x/fv47+Xy0lVL+/Tb6s0L44TB7rx
5fJfLh/iR/otrWfn/rsib9pmIj/eP6Gf8ousuf9mMyUw3Q8HwLDLvD3fTAkT
3FHfvx0G7NHHBR1609LHdmr39kTGneTVLYe75WuT83ZV7BmTbtrzqj42Y1pF
XhKsTybJRVom/5XWk9VZSY8FnU9owO4vdYXrks3ztqrpnwQmuhZ/ZwwSdMro
aSYAlwX9i/xnUhbGT/nnSfJTtVjRT262P/O6g8fXTvWnqlqGc7ld/8uSf5kQ
0hlTVvWKPrhgLHr74tnR4cNH9s+jBw/1zwdHR0/1z8cP5IWf3r16if8StqX1
MmtDzFoVk2adzSaX52nrcYzeFFKCT/nfFs74e8z/q5s/pc3ns49NVepTAcAp
QTp+PrTlUXJazib9Qc8myRtC0KxuokHP8lVVdn6Jh31V/T0virQ/Yh8t/LBD
qNEf2uJDZ+A3k+TP/+u/L7OSPp230bhvzvMiXw/8vOP0OyP/OEl+zMp8Vul+
7LA/EnGgx90fr4Xv6esXb0+GcSAvF3XaRYIQB07xwvVI8A+D7teEwS9vd9yC
Td27BOH+6bv/b3Zv6Cg6dxwcUf989M2jJ/2n33oi8OTRo29kdfO8WRcpseB3
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
wBQePVonck83U9UoknmdLiBb/L980Z3xNBsBAA==

-->

</rfc>
