SpringBootSecurity CSRF Token在Angular中失效但Postman可用问题排查
SPA应用CSRF防护403错误排查与解决
场景背景
- 后端基于Spring Security,通过
SecurityConfigurator启用默认CSRF防护,同时提供/api/csrf/token接口返回CsrfToken - 前端为Angular应用,使用
openapi-generator-cli生成接口服务,通过请求拦截器自动为请求添加CSRF Token,核心需求是通过POST请求/api/initSettings完成应用配置初始化
正常测试表现
- 用Postman调用
/api/csrf/token能正常获取Token,手动添加X-CSRF-TOKEN请求头后调用/api/initSettings,返回200 OK - Angular应用内也能成功获取CSRF Token,且请求
/api/initSettings时确实携带了正确的X-CSRF-TOKEN头
异常问题
Angular应用发起的/api/initSettings请求始终返回403 Forbidden,后端报错:
Invalid CSRF token found for http://localhost:8080/api/initSettings
调试后发现:前端传递的Token和后端tokenRepository中存储的deferredCsrfToken完全不匹配
排查步骤
- 最初怀疑后端未将Token正确保存到仓库,但Postman测试正常,排除后端CSRF生成与存储逻辑的问题
- 尝试在获取Token后延迟发送请求,问题依然存在,排除异步时序导致的Token未就绪问题
根因与解决
后端会话管理配置为无状态(Stateless),而Spring Security默认的CSRF Token验证机制依赖HTTP会话来关联用户与Token。在无状态模式下,每次请求都是独立的,后端无法通过会话维持Token的上下文关联,导致前后端Token无法匹配验证。
最终解决方案:移除CSRF防护配置。
内容的提问来源于stack exchange,提问作者HansPI
相关产品推荐
相关产品推荐

