Cookie 属性

当 Web 服务器响应对资源的请求时,可以在响应中添加 Set-Cookie 标头。该标头会告知浏览器存储 Cookie。例如:Set-Cookie:cat=tabby什么是 Cookie?一文介绍了 Cookie 的工作原理。

除了提供 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 属性。

安全

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

HTTPOnly

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

SameSite

如果请求的资源来自与您访问的网站不同的网站,则该请求为跨网站请求。为响应跨网站请求而设置的 Cookie 是第三方 Cookie

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

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

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

严格

只有在响应来自 Cookie 来源网站上网页的请求时,才会发送该 Cookie。例如:假设用户访问了 cats.example,并且设置了具有 SameSite=Strict 属性的 Cookie。之后,用户访问了另一个网站,并点击链接前往 cats.example 上的某个网页。设置的 Cookie 不会包含在该请求中。

Lax

这与 Strict 的运作方式相同,只不过当用户点击链接前往 Cookie 的来源网站时,浏览器也会包含该 Cookie。(在之前的 Strict 示例中,当用户点击指向 cats.example 的链接时,系统会包含 Cookie。)如果 Set-Cookie 标头中未包含 SameSite 属性,则 Lax 为默认值。

无限制:无论请求是否为跨网站请求,Cookie 都会随请求一起发送。如果使用 SameSite=None,Cookie 还必须具有 Secure 属性。

分区

借助此属性,您可以选择让 Cookie 使用分区存储,每个顶级网站都有一个单独的“Cookie 罐”。Cookie 采用双键,即顶级网站和设置它的网域。

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

图表:显示嵌入了同一第三方的两个不同网站将不再共享该第三方的 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”

网域

如果 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)上资源的任何请求一起发送

路径

如果 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. 的请求时设置了 cat=tabby Cookie。如果未设置 Path,则该 Cookie 仅会随对 cats.example/images 目录中文件的请求一起发送。

演示

工具

了解详情