Name/Value
Expires
Expires 用于设置 Cookie 的过期时间。比如:
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
当 Expires 属性缺省时,表示是会话性 Cookie,像上图 Expires 的值为 Session,表示的就是会话性 Cookie。当为会话性 Cookie 的时候,值保存在客户端内存中,并在用户关闭浏览器时失效。需要注意的是,有些浏览器提供了会话恢复功能,这种情况下即使关闭了浏览器,会话期 Cookie 也会被保留下来,就好像浏览器从来没有关闭一样。
与会话性 Cookie 相对的是持久性 Cookie,持久性 Cookies 会保存在用户的硬盘中,直至过期或者清除 Cookie。这里值得注意的是,设定的日期和时间只与客户端相关,而不是服务端。
Max-Age
- Max-Age 用于设置在 Cookie 失效之前需要经过的秒数。比如:
- Set-Cookie: id=a3fWa; Max-Age=604800;
- Max-Age 可以为正数、负数、甚至是 0。
- 如果 max-Age 属性为正数时,浏览器会将其持久化,即写到对应的 Cookie 文件中。
- 当 max-Age 属性为负数,则表示该 Cookie 只是一个会话性 Cookie。
- 当 max-Age 为 0 时,则会立即删除这个 Cookie。
- 假如 Expires 和 Max-Age 都存在,Max-Age 优先级更高。
Domain
Path
Path 指定了一个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie 首部。比如设置 Path=/docs,/docs/Web/ 下的资源会带 Cookie 首部,/test 则不会携带 Cookie 首部。
Domain 和 Path 标识共同定义了 Cookie 的作用域:即 Cookie 应该发送给哪些 URL。
Secure属性
HTTPOnly
SameSite
SameSite属性用来限制第三方 Cookie,减少安全风险,有三个值:
Strict
Lax
None
从上图可以看出,对大部分 web 应用而言,Post 表单,iframe,AJAX,Image 这四种情况从以前的跨站会发送三方 Cookie,变成了不发送。
Post表单:应该的,学 CSRF 总会举表单的例子。
iframe:iframe 嵌入的 web 应用有很多是跨站的,都会受到影响。
AJAX:可能会影响部分前端取值的行为和结果。
Image:图片一般放 CDN,大部分情况不需要 Cookie,故影响有限。但如果引用了需要鉴权的图片,可能会受到影响。
临时方案可设置 SameSite 为 None,必须同时设置Secure属性 (Set-cookie: key=value; SameSite=None; Secure)
合理的解决方案简单总结应该是按照谷歌浏览器规则:
7月14日稳定发布Chrome 84的同时恢复SameSite Cookie的强制实施,同时对Chrome 80+启用强制实施。
cookie的校验更加严格,SameSite属性默认值由None变为Lax