当 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 是否会包含在请求中。它有三个可能的值:Strict
、Lax
或 None
。
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 是分开的。

具有 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-Age
或 Expires
属性,系统会在当前会话结束时删除 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.example
或user.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
目录中文件的请求一起发送。
演示
- 1pc.glitch.me:第一方 Cookie 演示
- 3pc.glitch.me:第三方 Cookie 演示
工具
了解详情
- 第一方 Cookie 方案
- 什么是 Cookie?
- 什么是第三方 Cookie?
- HTTP 请求和响应
- Cookie 工具
- Cookie 演示
- 使用 HTTP Cookie
- SameSite Cookie 说明
- OWASP:Cookie