Spring Boot开发中如何用Postman携带CSRF令牌发送POST请求
解决Postman中Spring Boot CSRF Token获取并复用的问题
核心原理回顾
Spring Security默认开启CSRF防护:
- GET/HEAD/OPTIONS等安全方法无需CSRF Token
- POST/PUT/DELETE等修改类请求必须携带与Session绑定的CSRF Token
- 默认CSRF Token会以
XSRF-TOKEN为名存入Cookie,请求时需在Header中携带X-XSRF-TOKEN,值为Cookie中的Token内容
关键前置配置(Spring Boot端)
如果你的Security配置自定义过,必须确保CSRF Token的Cookie允许客户端读取,否则Postman无法提取:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf() // 允许Cookie被客户端脚本读取(必须设置,否则Postman拿不到Token) .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .and() // 其他认证/授权配置示例 .authorizeRequests() .antMatchers("/blog/**").permitAll() .anyRequest().authenticated(); } }
Postman端完整操作步骤
1. 获取CSRF Token并存入变量
- 新建一个GET请求,指向任意受Spring Security保护的接口(比如
GET /blog/list) - 在该请求的Tests标签页中,添加如下脚本提取Cookie中的Token并存储:
// 从响应Cookie中提取XSRF-TOKEN const xsrfToken = pm.cookies.get("XSRF-TOKEN"); // 将Token存入环境变量(用全局变量则替换为pm.globals.set) pm.environment.set("XSRF-TOKEN", xsrfToken); - 发送该GET请求,执行后检查Postman的环境变量列表,确认
XSRF-TOKEN已被正确赋值(不再是undefined)
2. 在POST请求中复用Token
- 打开你的POST请求(比如
POST /blog/create) - 在Headers标签页中添加一条Header:
- Key:
X-XSRF-TOKEN - Value:
{{XSRF-TOKEN}}(Postman会自动替换为环境变量中的值)
- Key:
- 确保POST请求携带正确的Session Cookie(Postman默认会自动保存并发送之前GET请求的
JSESSIONIDCookie,无需手动添加) - 发送POST请求,即可正常通过CSRF校验
常见问题排查
- 变量仍为undefined:检查Spring Security配置是否开启了
withHttpOnlyFalse(),如果Cookie是HttpOnly的,Postman脚本无法读取;同时确认GET请求确实触发了Spring Security生成CSRF Cookie(可在Postman的Cookies面板查看是否存在XSRF-TOKEN) - POST仍返回403:确保
X-XSRF-TOKEN的Header值与Cookie中的XSRF-TOKEN完全一致,且POST请求使用的Session(JSESSIONID)与获取Token时的Session相同 - Cookie名称不匹配:如果自定义了CSRF Cookie的名称,需同步修改Postman脚本中的Cookie名称
内容的提问来源于stack exchange,提问作者Tamsin-chan
相关产品推荐
相关产品推荐

