Cookie 是服务器发送到用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带并发送到服务器上,通常用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态、记录用户偏好等。
当用户第一次访问网站时,服务器会在响应的 HTTP 头中设置 Set-Cookie 字段,用于发送 Cookie 到用户的浏览器,浏览器在接收到 Cookie 后,会将其保存在本地(通常是按照域名进行存储),在之后的请求中,浏览器会自动在 HTTP 请求头中携带 Cookie 字段,将之前保存的 Cookie 信息发送给服务器。
1、会话 Cookie:在浏览器关闭时失效。
2、持久 Cookie:带有明确的过期日期或持续时间,可以跨多个浏览器会话存在。
Set-Cookie: <name>=<value>
<name> 是 Cookie 的名称,<value> 是 Cookie 的值,完整格式如下:
Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00 UTC; path=/; domain=.example.com; secure; HttpOnly
属性 | 含义 |
Name | Cookie的名称 |
Value | 对应名称的值 |
Domain | 指定可以访问 Cookie 的域名,通常情况下,Cookie 只能被设置在创建它的域名以及其子域名下。 |
Path | 指定可以访问 Cookie 的路径,这个字段定义了在哪些路径下的请求可以发送 Cookie。 |
Expires | 过期时间,过了这个时间,浏览器将不再发送该 Cookie。 |
Size | 指定了 Cookie 的大小,单位为字节。 |
HttpOnly | 布尔值字段,设置为 true,那么该 Cookie 只能通过 HTTP 或 HTTPS 协议访问,不能通过 JavaScript 或其他客户端脚本访问,有助于增强安全性,以防止反面脚本访问敏感信息。 |
Secure | 布尔值字段,设置为 true,那么该 Cookie 只能在通过 HTTPS 等安全连接发送时才会被浏览器发送到服务器,有助于保护敏感信息的传输安全。 |
SameSite | 限制第三方 cookie,表示 Cookie 不随着跨域请求发送,减少安全风险,它可以有三个可能的值:Strict、Lax、None,Strict 表示只有在同一站点的请求中才会发送 Cookie;Lax 在某些情况下允许 Cookie 在跨站点请求中发送(例如从外部链接打开的页面);None 允许 Cookie 在任何情况下都发送。 |
Partition Key | 一个标识符,指示 Cookie 属于哪个上下文或分区,它通常用于在浏览器中隔离不同网站或应用程序的 Cookie 数据,以增强隐私和安全性。 |
Priority | 指定了 Cookie 的传输优先级,Cookie 数量超出限制时低优先级会被优先清除。 |
问题一:如果一个网站有多个子域名,如何设置Cookie才能使所有子域名都能共享?
答:如果希望在一个网站的多个子域名之间共享 Cookie,可以将 Cookie 的域名设置为包含所有子域名的通配符,对于子域名 images.example.com 和 forums.example.com,可以将 Cookie 的域名设置为 .example.com,这样,所有以 example.com 结尾的域名都可以访问这个 Cookie。
问题二:为什么有些网站的Cookie设置了特定的域名,而有些没有设置?
答:默认情况下,Cookie 的域名会被设置为创建该 Cookie 时所在的域名,如果网站开发者希望 Cookie 能被特定的子域名访问,或者需要在不同的子域名之间共享 Cookie,就需要明确地设置 Cookie 的域名属性,如果没有设置域名属性,Cookie 只能被设置它的域名及其子域名访问。