Cookie

作者: shaokang 时间: January 9, 2023字数:2029

用于服务端辨别用户身份,储存在用户本地的数据。

可以解决客户端与服务端会话状态的问题,这个状态是指后端服务的状态而非通讯协议(HTTP)的状态。

域名下的 cookie 最大为 4kb。以 Name=Value 的形式进行存储。

Domain / Path 作用域

Domain 是限制域名,设置为 a.test.com 的话,b.test.com 就获取不到了。 Path 是限制路径,如果设置为 /cors 的话,/api 下的请求就不会携带该 cookie。

Expires / Max-Age 有效性

Expires 是当前 Cookie 的过期时间,默认是会话级别。

Max-Age 是当前 Cookie 经过多少秒失效。

  • 大于 0 是计算经过多少秒失效
  • 等于 0 是会话级别,关闭浏览器就失效
  • 小于 0 是指 cookie 无效,立即删除

Max-Age 的优先级比 Expires 更高。

HttpOnly 安全性

设置以后客户端脚本就无法通过 document.cookie 等方式获取,有助于避免 XSS 攻击。

Secure 安全性

设置以后客户端只有 HTTPS 协议下才会发送给服务端。
使用 HTTPS 安全协议,可以保护 Cookie 在浏览器和 Web 服务器间的传输过程中不被窃取和篡改。

SameSite 安全性

设置 Cookie 在什么场景下会被发送,从而屏蔽跨站时发送 cookie,用于阻止跨站请求伪造攻击(CSRF)。

同站和跨站
同站是指二级域名+顶级域名,相等即可。 比如 www.test.com 解析就是 主机名.二级域名.顶级域名,所以判断规则还是比较松的。
eTLD 表示有效顶级域名,注册于 Mozilla 维护的公共后缀列表 Public Suffix List 中,例如,.com、.co.uk、.github.io 等。 eTLD+1 表示,有效顶级域名+二级域名,例如 taobao.com 等。

同源和跨域
同源策略的同源是指两个 URL 的协议/主机名/端口一致。

SameSite 三个不同值:

  • Strict: 表示只允许同站请求携带 Cookie。
  • Lax(chrome 80 后的默认值): 允许部分第三方请求场景 携带 Cookie。
  • None(chrome 80 前的默认值): 无论是否跨站都会发送 Cookie。必须同时加上 Secure 属性,否则无效,也就是说只支持 HTTPS。

iOS 12 的 Safari 以及老版本的一些 Chrome 会把 SameSite=none 识别成 SameSite=Strict,所以服务端必须在下发 Set-Cookie 响应头时进行 User-Agent 检测,对这些浏览器不下发 SameSite=none 属性

跨站的各个场景:

请求类型 示例 None Lax Strict
链接 <a href="..."></a> 发送 Cookie 发送 Cookie 不发送
预加载 <link rel="prerender" href="..."/> 发送 Cookie 发送 Cookie 不发送
GET 表单 <form method="GET" action="..."> 发送 Cookie 发送 Cookie 不发送
POST 表单 <form method="POST" action="..."> 发送 Cookie 不发送 不发送
iframe <iframe src="..."></iframe> 发送 Cookie 不发送 不发送
AJAX $.get("...") 发送 Cookie 不发送 不发送
Image <img src="..."> 发送 Cookie 不发送 不发送

关闭 Chrome 浏览器安全策略

open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/xxx/Documents/MyChromeDev