spring boot 配置安全响应头需依托 spring security 统一注入,默认启用 x-content-type-options、x-frame-options 等基础头,hsts 和 csp 需显式配置;未集成 security 时可用 responseentity、拦截器或 @controlleradvice 补充;注意 x-frame-options 与 csp frame-ancestors 的兼容性、csp 策略调试及 hsts 的 https 依赖。

Spring Boot 配置安全响应头,核心是通过 Spring Security 统一注入标准 HTTP 安全头,而不是零散地在每个接口里手动加。它不是锦上添花,而是防御 XSS、点击劫持、MIME 嗅探等常见攻击的必要基础。
用 Spring Security 启用默认安全头
只要项目引入了 spring-boot-starter-security,Spring Security 就会自动启用一套默认安全头(如 X-Content-Type-Options、X-Frame-Options、X-XSS-Protection 等)。无需写代码,这些头就会出现在所有响应中。
- 默认 X-Frame-Options 是
DENY,防止页面被 iframe 嵌入 - 默认 X-Content-Type-Options 是
nosniff,禁用 MIME 类型嗅探 - 默认不启用 HSTS 和 CSP,需显式配置
自定义或增强安全头配置
在安全配置类中继承 WebSecurityConfigurerAdapter(Spring Boot 2.x)或使用基于 SecurityFilterChain 的函数式配置(Spring Boot 3.x+),可精细化控制:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
headers().frameOptions().sameOrigin()替换 DENY,允许同源 iframe - 用
headers().contentSecurityPolicy("default-src 'self'; script-src 'self' https:")启用 CSP - 用
headers().hsts().maxAgeInSeconds(31536000)强制 HTTPS 并缓存一年 - 用
headers().referrerPolicy("no-referrer-when-downgrade")控制 Referer 泄露
绕过 Spring Security 的轻量补充方式
若项目未集成 Spring Security,或仅需为个别接口加特定头,可用以下方式:
- 在 Controller 方法中用
ResponseEntity手动添加:return ResponseEntity.ok().header("X-My-Security", "enabled").body("ok"); - 实现
WebMvcConfigurer的addInterceptors,在拦截器中统一设头 - 用
@ControllerAdvice+ResponseBodyAdvice在响应体返回前注入头(适合全局补漏)
注意事项与避坑点
有些头相互影响,配置时要注意兼容性:
-
X-Frame-Options和Content-Security-Policy: frame-ancestors不要同时设置,后者优先且更现代,前者会被忽略 - CSP 策略写错会导致 JS/CSS 加载失败,建议先用
Content-Security-Policy-Report-Only测试 - HSTS 必须在 HTTPS 环境下生效,HTTP 下设置无效,且首次访问必须走 HTTPS 才能生效
- 若前端用了 Nginx 反向代理,确保 Nginx 没有覆盖或删除后端返回的安全头










