Cookie 属性

当 Web 服务器响应资源请求时,服务器可以在响应中添加 Set-Cookie 标头。该标头会告知浏览器存储 Cookie。

例如:Set-Cookie:cat=tabby

除了提供 Cookie 名称和值之外,Set-Cookie 还可以包含属性来控制是否设置 Cookie 以及 Cookie 的失效时间。Cookie 属性之间用英文分号分隔。例如:

    Set-Cookie:cat=tabby; Secure; HTTPOnly; Expires=Tue, 31 Dec 2999 23:59:59 GMT;

本文档介绍了最重要的 Cookie 属性:

使用 HTTP Cookie 更详细地介绍了 Cookie 属性。

Secure

如果 Set-Cookie 标头包含 Secure,则 Cookie 将仅包含在使用 HTTPS 协议的加密请求中:Cookie 不会包含在 HTTP 请求中。这有助于阻止 中间人攻击, 即攻击者秘密介入 浏览器和服务器之间的通信,以传递信息并可能更改信息。

HTTPOnly

如果 Set-Cookie 标头包含 HTTPOnly,则 JavaScript 无法访问该 Cookie,例如使用 document.cookie。这有助于防范针对 Cookie 的某些类型的攻击。

SameSite

从与您访问的网站不同的网站请求资源是跨网站 请求。为响应跨网站请求而设置的 Cookie 是第三方 Cookie

SameSite 属性控制是否在请求中包含第三方 Cookie。它有三个可能的值:StrictLaxNone

如果未设置任何值,则默认值为

了解详情:什么是第三方 Cookie?

Strict

Cookie 将仅在响应来自 Cookie 源站上的页面的请求时发送。例如:假设用户访问 cats.example,并设置了一个 Cookie,其属性为 SameSite=Strict。稍后,用户访问了另一个网站,然后点击链接转到 cats.example 上的页面。设置的 Cookie 不会包含在该请求中。

Lax

此属性的工作方式与 Strict 相同,不同之处在于,当用户点击链接转到 Cookie 的来源网站时,浏览器也会包含该 Cookie。(在之前的 Strict 示例中,当用户点击链接转到 cats.example 时,Cookie 将包含在请求中。)如果 Set-Cookie 标头中未包含 SameSite 属性,则 Lax 是默认值。

None

没有限制:Cookie 将包含在请求中,无论该请求是否为跨网站请求。对于 SameSite=None,Cookie 还必须具有 Secure 属性。

Partitioned

借助此属性,您可以选择将 Cookie 加入分区存储,每个顶级网站都有一个单独的 “Cookie 罐”。Cookie 由顶级网站以及设置该 Cookie 的网域双重键控。

例如:假设网站 A 和网站 B 都包含来自网站 C 的 iframe。网站 A 上的 iframe 设置的分区 Cookie 无法由网站 B 上的 iframe 访问:AC Cookie 与 BC Cookie 是分开的。

图表:显示嵌入了同一第三方的两个不同网站将不再共享该第三方的 Cookie。
通过 Cookie 分区,当第三方服务嵌入到一个顶级网站中时,该服务设置的 Cookie 无法在嵌入到其他顶级网站中时访问。

具有 Partitioned 属性的 Cookie 称为 CHIPS:Cookies Having Independent Partitioned State(具有独立分区状态的 Cookie)。

分区 Cookie 必须具有 Secure 属性。

了解详情:Cookies Having Independent Partitioned State

Expires 和 Max-Age

您可以指定 Expires 日期和时间,或以秒为单位的 Max-Age,在此之后,Cookie 应被删除且不再发送。例如:

  • Set-Cookie:cat=tabby; Expires=Tue, 31 Dec 2999 23:59:59 GMT;
  • Set-Cookie:cat=tabby; Max-Age=86400

如果您未指定 Max-AgeExpires 属性,则 Cookie 将在当前会话结束时被删除。这种 Cookie 有时称为会话 Cookie

Domain

如果 Set-Cookie 标头具有 Domain 属性,则 Cookie 将包含在对指定网域及其任何子网域的请求中。

如果 Set-Cookie 标头没有 Domain 属性,则 Cookie 不会包含在对子网域的请求中。

换句话说,添加 Domain 属性会减少网域限制。

例如,对于来自网站 cats.example 的响应:

  • Set-Cookie:cat=tabby
    Cookie 将仅包含在对 cats.example 的请求中
  • Set-Cookie:cat=tabby; Domain=cats.example
    Cookie 将包含在对 cats.example 的请求中,以及对子网域(例如 fluffy.cats.exampleuser.assets.cats.example)上的资源的任何 请求中

Path

如果 Set-Cookie 响应标头中包含 Path 属性,则设置的 Cookie 将仅包含在对与 Path 值匹配的网址(在设置 Cookie 的网站上!)的请求中。

例如:

  • Set-Cookie:cat=tabby; Path=/articles
    对于以 /articles 开头的任何网址路径的请求,Cookie 将包含在请求中:
    https://cats.example/articles/tabby/index.html
    https://cats.example/articles/breeds/tabby/index.html
    https://cats.example/images/tabby.jpg
    https://cats.example/en/articles/tabby/index.html
  • Set-Cookie:cat=tabby; Path=/
    对网站上任何网址的所有请求都将包含该 Cookie。

如果 Set-Cookie 响应标头没有 Path 值,则 Cookie 将仅包含在对同一目录的请求中。例如,假设为响应对 cats.example/images/tabby.jpg. 的请求而设置了 a cat=tabby Cookie。如果未设置 Path,则 Cookie 将仅包含在对 cats.example/images 目录中的文件的请求中。

演示

工具

了解详情