为何跨域场景下同时使用JWT与CSRF Token存储于Cookie?
一、同时存储在Cookie中的核心作用
当JWT存放在Cookie且SameSite=None时,浏览器会在跨域请求时自动携带该Cookie,但JWT本身无法区分请求是用户主动发起的,还是恶意网站通过CSRF伪造的。CSRF Token的核心作用是验证请求的发起者是合法前端页面:它需要前端从合法页面(比如后端接口返回、页面渲染注入)获取后,放在请求头或请求体中一同发送,后端同时校验Cookie里的JWT和请求中的CSRF Token是否匹配。
简单来说:JWT负责确认“你是谁”,CSRF Token负责确认“这个请求是你本人在合法页面发起的”。
二、仅用JWT是否足够保障安全?
绝对不够,核心问题在于CSRF攻击场景:
- 若用户已登录,Cookie中存储了
SameSite=None的JWT,当用户访问恶意网站时,恶意网站可构造指向你后端的操作请求(比如转账、修改个人信息),浏览器会自动带上JWT Cookie。 - 此时后端仅校验JWT合法性,会误判为合法用户的请求并执行操作——这就是CSRF攻击的本质:利用浏览器自动携带Cookie的特性,伪造用户的合法请求。
你提到的“窃取令牌或重放攻击”属于XSS、MITM这类风险范畴,需要通过HTTPS、HttpOnly标记、令牌过期策略等手段防范,但CSRF Token解决的是无需窃取令牌就能发起攻击的场景,二者防护的是不同类型的安全风险,不能混为一谈。
三、CSRF Token是不是多余的开销?
你的理解存在偏差,关键在于:CSRF Token不会被浏览器自动携带,攻击者无法通过CSRF攻击获取合法前端页面中的CSRF Token:
- 当用户受骗点击恶意链接时,恶意网站只能触发浏览器发送带JWT Cookie的请求,但由于跨域限制,恶意网站的JS无法读取你前端页面的DOM或接口返回的CSRF Token。
- 因此恶意构造的请求中没有正确的CSRF Token,后端校验不通过,就能拦截这次CSRF攻击。
你所说的“二者均可能被劫持”,只有在存在XSS漏洞的情况下才会发生,但XSS是另一种安全风险,需要用HttpOnly、Content-Security-Policy等手段防范,CSRF Token并非用于抵御XSS,不能因为XSS能绕过就否定它的核心价值。
总结
JWT和CSRF Token是互补的安全机制:
- JWT用于身份认证,确认请求发起者的身份合法性;
- CSRF Token用于防止跨域请求伪造,确认请求是合法前端发起的,而非恶意网站诱导的;
- 当
SameSite=None时,浏览器会跨域携带Cookie,此时CSRF Token的作用尤为关键,是抵御CSRF攻击的核心手段之一,绝非多余开销。
内容的提问来源于stack exchange,提问作者Abrie
相关产品推荐
相关产品推荐

