开始前我们先了解一下第三方请求,什么样的请求被称为第三方请求?简单来说就是在一个网页上发起一个不同源的请求,那么我们可以称为第三方请求。
在一个页面上发起一个第三方请求可以分为有 异步请求 和 同步请求:
1、异步请求 指的是在当前页面上通过 script、 link、img、fetch、XHR 等方法发起的请求,这些都不会让页面发生变化,也不会打开新的页面。
2、同步请求 指的是在当前页面点击 <a> 标签,或 <form>提交、 JS 调起的 location.href、window.open() 等方式发起的请求,这些方式可能会使当前页面刷新或者打开新的页面。
第三方cookie
通过 a.com 的页面发起 a.com 的请求,会带上第一方 cookie(first-party cookie)。
通过 a.com 的页面发起 b.com 或 c.com 的请求,会自动带上第三方 cookie(third-party cookie) CSRF 就是利用第三方请求会带上第三方 cookie的弱点来达到在一个不信任的域下也可以达到的危险操作。
关于SameSite
正如文章开头所说的防 CSRF 可以直接上方案 Token + Referer,但是人家 Google 就是要改变世界,怎么说? Google 提了一份草案 ,给 cookie新增 SameSite 属性,通过这个属性可以标记哪个 cookie只作为同站 cookie(即第一方 cookie,不能作为第三方 cookie),既然不能作为第三方 cookie,那么别的网站发起第三方请求时,第三方网站是收不到这个被标记关键 cookie,后面的鉴权处理就好办了。这一切都不需要做 token 生命周期的管理,也不用担心 Referer 会丢失或被中途被篡改。