假设这样一个场景:
- 用户 A 在网站 a.com 登录后,浏览器存储 a.com 的 cookie
- 用户 A 在网站 a.com 进行交易操作,携带 cookie 调用接口 a.com/api/transfer
- 用户 A 同时打开了 b.com,一个欺诈网站
- b.com 引导用户 A 点击按钮,携带了 a.com 的 cookie 调用 a.com/api/transfer
- 用户在 b.com 触发了 a.com 上的交易操作,用户却完全不知情。
以上,就是一个 csrf 攻击的场景。
same-site 如何在这种情景下保护用户 ?
same-site 的默认值是 lax,这种情况下,不属于 same site 的请求,就不会携带 cookie。因为 b.com 和 a.com 不属于 same site,所以 b.com 调用接口 a.com/api/transfer,不会携带 cookie,上述场景的步骤4也就无法成立。
same-site: strict 也有同样的效果。
怎么判断两个网站是否属于 same-site ?
当两个网站的 eTLD (effective Top-level Domain) + 1 相同时,就是 same site。
比如: