已实现JWT认证授权,代码中仍需CSRF Token吗?
当系统基于JWT实现身份认证与授权时,还需要用CSRF Token吗?
答案不是绝对的,完全取决于你把JWT存在哪儿,分三种常见场景说明:
1. JWT存在HttpOnly Cookie里
这种情况和传统Session认证逻辑类似——浏览器会自动在同源请求里带上Cookie。这时候存在CSRF风险:攻击者可以构造恶意页面,诱导用户触发POST类操作请求(比如修改密码、提交订单),浏览器会自动把存JWT的Cookie发送给服务器,服务器会误以为是合法用户的请求,从而执行敏感操作。
所以这种场景必须使用CSRF Token:要么在表单中添加隐藏的CSRF Token字段,要么将Token放在自定义请求头里,服务器校验请求时,除了验证JWT的合法性,还要核对CSRF Token是否与当前用户会话绑定。
2. JWT存在LocalStorage/SessionStorage里
浏览器不会自动将LocalStorage/SessionStorage中的内容携带到跨域请求中,攻击者无法通过CSRF攻击窃取JWT并冒充用户发起请求。这种场景不需要CSRF Token,但要重点防范XSS攻击——XSS脚本可以直接读取LocalStorage中的JWT,一旦Token被窃取,攻击者就能完全冒充用户进行操作。
3. JWT手动放在请求头里(比如Authorization: Bearer <token>)
如果前端每次发起请求时,手动从LocalStorage取出JWT并放到Authorization请求头中发送,这种场景同样不需要CSRF Token。因为跨域请求时,浏览器不会自动添加自定义的Authorization头(除非配置CORS明确允许),攻击者无法构造出携带正确JWT头的跨域请求,自然无法发起CSRF攻击。
一句话总结
- JWT存于HttpOnly Cookie:必须使用CSRF Token
- JWT存于LocalStorage/SessionStorage或手动放在请求头:无需CSRF Token,但要重点防范XSS
内容的提问来源于stack exchange,提问作者utkarsh sharma
相关产品推荐
相关产品推荐

