阅读 198

SameSite属性变更引起的bug

写这篇文章的初衷是我在项目当中遇到了关于SameSite默认属性值改变引起的bug,突然发现网站中嵌入的iframe无法登录。找了一些资料,了解到有可能是由SameSite属性默认值改为Lax造成的。

问题如下:

本站网站:http://a.demo.com

嵌入网站:https://b.demo.com

发现向b.demo.com 发送请求时,没有携带.demo.com域名下的Cookie(即.demo.com域名下的统一登录态),因此造成嵌入网站无法登录。

之前的知识储备是:跨站请求在某些情况下是不会携带cookie的,但是a.demo.comb.demo.com 明明是同站啊,同站可以携带Cookie....

后来,参考英文资料,发现跨协议(http、https)也被划分为跨站行为。

呵~

由于补了一些这方面的知识,为了后面忘记,这里记录一下吧。

什么是跨站?

Cookie中的同站判断标准:eTLD(effective Top Level Domain)+1,即有效顶级域名+二级域名相同。有效顶级域名是指注册在 Mozilla 维护的公共后缀列表中,例如,.com、.co.uk、.github.io 等(也经常被叫做公共后缀)。

举例:

  • a.taobao.com与b.taobao.com 同站
  • a.github.io与b.github.io 跨站
  • a.taobao.com与a.tianmao.com 跨站
  • a.taobao.coma.taobao.com 跨站 跨协议也是跨站(补充)

之前我们在讲cookie的时候,都是在访问a.tmall.com的情况下,任何有关.tmall.com的域名下的用户行为(跳转、请求等)都会主动携带.tmall.com域名下的Cookie。但是一些跨站行为(比如发送到a.taobao.com的post请求)是不会携带cookie的,这与Cookie的SameSite属性有关。

上述所说的同站/跨站第一方/第三方其实是等价的。通常我们所说的跨站请求,其实就是第三方请求,它携带的Cookie即为第三方Cookie,同站请求携带的Cookie即为第一方Cookie

跨站请求会不会携带Cookie?

我们上面已经学会了如何区分同站/跨站请求,也清楚了跨站请求有时候是不会携带第三方Cookie的。而这个是否携带Cookie就跟Cookie的SameSite属性有关。

浏览器之前对于SameSite属性的默认值设置为None,意思是对于跨站请求允许其携带第三方Cookie。

但是,2月份发布的 Chrome80 版本中将SameSite属性的默认值设置为Lax,意思是只有部分的跨站行为允许携带第三方Cookie。

至于这个‘部分’如何去界定,可以参考下表:

image.png

当然,如果你想让跨站ajax请求携带某Cookie,可以将该Cookie的SameSite属性设置为None

浏览器为什么限制跨站请求Cookie的携带?

这有关于Cookie引起的网络安全问题,比如我们比较熟悉的CSRF攻击和XSS攻击,都与Cookie有关。

详情请参考下方文章:

CSRF攻击参考这篇

XSS攻击参考这篇

参考文章:

web.dev/samesite-co…

juejin.cn/post/684490…

juejin.cn/post/691188…

文章分类
前端
文章标签