·
Across the Great Wall, we can reach every corner in the world.

csrf 攻击方可以拿到 cookie 的,cookie 的发送机制是浏览器自动的,建议你了解下基本原理,攻击者伪造请求的请求会发送这个 cookie,但是这个请求没法伪造 header,所以常见的防御手段就是前端每次发送请求时在 header 带上这个cookie值,后端检查到 header 中的值是否和 cookie 中的值一致,判断是否为合法请求,举个 spring security 的例子:

  1. 后端接受到第一个请求时返回 set-cookie 的 header,里面有一个值:XSRF-TOKEN,带一个随机数
  2. 前端再次发送请求时先从 cookie 中获取这个值,填充到 header 中,key 为:X-XSRF-TOKEN,顺带把 cookie 带过去
  3. 后端接收到请求时判断 cookie 中的 XSRF-TOKEN 和 header 中的 X-XSRF-TOKEN 是否一致,判断是否为合法请求

由于 csrf 攻击方无法伪造第2步(需要具体 js 执行),所以能够识别csrf攻击,进行拦截。

一般常见的请求库都给你做好这块了,自动发送保护 header,比如 axios,只要设置:

// axios.defaults.xsrfCookieName = 'XSRF-TOKEN';
// axios.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';
axios.defaults.withCredentials = true;

就可以了,后端同步配置上就可以(axios 默认的 cookieName 和 headerName 就是上述的 key,可以用默认的就行)