知识卡片
无状态令牌认证不需要CSRF防护
内容
CSRF 攻击的原理是浏览器会在同源请求里自动带上 cookie,攻击者诱导用户在恶意页面上触发一个跨站请求,浏览器照样把受害者的登录 cookie 自动附带上去,服务器分不清这是用户本人发的还是被诱导发的。这套攻击手法成立的前提是认证状态存在 cookie 里、且浏览器会自动携带——资源服务器如果改用[[JWT令牌免去资源服务器的网络往返|无状态的令牌认证]],每次请求都要求调用方显式在请求头里带上访问令牌,浏览器并不会像对待 cookie 那样自动附加这个请求头,攻击者诱导出的跨站请求根本带不上令牌,CSRF 攻击的前提条件就不成立了,因此可以放心关掉 CSRF 防护。发散:这提醒了一个通用的安全判断原则——防护手段是不是必要,取决于它防的那个攻击面在当前架构下是不是真的存在,认证方式从”cookie 会话”换成”显式令牌头”之后,攻击面本身发生了变化,继续套用旧防护手段不但没用,反而可能干扰无状态场景下的正常调用(比如程序化调用没有 CSRF token 时会被误伤)。
参考来源
《Cloud Native Spring in Action》第12章《Security: Authorization and auditing》