谷歌在Chrome 80版本改变了cookie的samesite默认值,在此一起加深下理解。
一、首先简要说下samesite的几个值。
- Strict 仅允许一方请求携带 Cookie,即浏览器将只发送相同站点请求的 Cookie,即当前网页 URL 与请求目标 URL 完全一致。
- Lax 允许部分第三方请求携带 Cookie
- None 无论是否跨站都会发送 Cookie
之前默认是 None 的,Chrome80 后默认是 Lax。如果Chrome80后想要将其设置为None,需要同时将secure
属性设置为true
。这也意味着你的后端服务域名必需使用https
协议访问,否则 None是无效的。
二、其次谈下 xhr中的cookie,在同域时cookie默认会发送,withCredentials属性此时是设为false也是无效的;但在跨域时,withCredentials默认为false,是不发送cookie的,设为 true 即可在跨域时 也能发送cookie;
三、此时说下 跨域和跨站 这两个是不同的定义。
1. 首先要理解的一点就是跨站和跨域是不同的。同站(same-site)/跨站(cross-site)」和第一方(first-party)/第三方(third-party)是等价的。但是与浏览器同源策略(SOP)中的「同源(same-origin)/跨域(cross-origin)」是完全不同的概念。
同源策略的同源是指两个 URL 的协议/主机名/端口一致。例如,https://www.taobao.com/pages/...,它的协议是 https,主机名是 www.taobao.com,端口是 443。
同源策略作为浏览器的安全基石,其「同源」判断是比较严格的,相对而言,Cookie中的「同站」判断就比较宽松:只要两个 URL 的 eTLD+1 相同即可,不需要考虑协议和端口。其中,eTLD 表示有效*域名,注册于 Mozilla 维护的公共后缀列表(Public Suffix List)中,例如,.com、.co.uk、.github.io 等。eTLD+1 则表示,有效*域名+二级域名,例如 taobao.com 等。
举几个例子,www.taobao.com 和 www.baidu.com 是跨站,www.a.taobao.com 和 www.b.taobao.com 是同站,a.github.io 和 b.github.io 是跨站(注意是跨站)。
2.根据 跨域 和 跨站 定义的 不同,我们可以知道 跨站一定跨域,但是跨域不一定跨站。
四、最后说下
那么是否存在一种情况,withCredentials属性值和samesite值会出现冲突,此时谁的权重更高呢?答案是存在的,此时以samesite为主。举个例子:
在a.demo2.com
域名下,ajax请求a.demo.com
的api,此时是跨站 且跨域 的,需要设置withCredentials
才能带上cookie,但如果此时cookie中的samesite值为Lax或Strict,此ajax请求是不能携带cookie的。
五、具体关于samesite和withCredentials的知识可以查看参考文章
参考文章:withCredentials