当 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。它有三个可能的值:Strict、Lax 或 None。
了解详情:什么是第三方 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 是分开的。
具有 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 。
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.example或user.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.htmlSet-Cookie:cat=tabby; Path=/
对网站上任何网址的所有请求都将包含该 Cookie。
如果 Set-Cookie 响应标头没有 Path 值,则 Cookie 将仅包含在对同一目录的请求中。例如,假设为响应对
cats.example/images/tabby.jpg. 的请求而设置了
a 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