Spring Boot公网REST接口需分层设防:认证按场景选API Key/JWT/OAuth2,授权须方法级+数据级校验,禁用permitAll;关闭Swagger/Actuator非必要端点,统一对齐脱敏错误响应;防篡改与重放需timestamp+nonce+HMAC签名,关键接口叠加人机验证与限流。

Spring Boot 的 REST 接口暴露在公网时,必须从认证、授权、防篡改、防探测、传输加密等多个层面设防。单靠一个方案无法兜底,关键在于分层加固、精准控制。
用合适的身份验证方式守住入口
REST API 是无状态的,不能依赖 Session 或 Cookie。推荐按场景选择:
- 内部服务调用:用 API Key(请求头携带 X-API-Key),配合白名单 IP 或固定密钥校验,轻量且可控;
- 面向用户的应用:优先选 JWT,服务端不存会话,只需校验签名+过期时间+黑名单(如登出或强制刷新);
- 第三方集成系统:采用 OAuth2.0(如 Authorization Code 流),由独立授权服务器管理令牌生命周期;
- 调试或简单管理接口:Basic Auth 可临时使用,但必须强制 HTTPS,且密码不可硬编码,应走配置中心或 Vault。
权限控制必须落到具体接口和数据维度
通过 Spring Security 的注解 + 方法级校验,避免“越权读写”:
- 用
@PreAuthorize("hasRole('ADMIN')")控制角色访问; - 对用户私有数据,加数据级校验,例如:
@PreAuthorize("#userId == authentication.principal.id or hasRole('ADMIN')"); - 敏感操作(如删除、导出)单独加
@PreAuthorize("hasAuthority('USER_DELETE')"),权限粒度比角色更细; - 禁用全局放行(如
permitAll())用于生产环境的业务接口,尤其避开/api/**这类宽泛路径。
防止接口被扫描和信息泄露
攻击者常靠错误响应、Actuator 端点、HTTP 方法枚举来反推接口结构:
- 关闭开发期工具:生产环境禁用 Swagger UI(
springdoc.api-docs.enabled=false)、禁用 H2 Console; - 收敛 Actuator:只暴露必要端点(如
health,info),并用management.endpoints.web.base-path=/actuator-secure改路径,再配独立鉴权; - 统一对齐错误响应:自定义
ErrorController或全局异常处理器,所有 4xx/5xx 返回相同结构体(不含堆栈、类名、路径细节),状态码保持语义准确但内容脱敏; - 禁用危险 HTTP 方法:在 WebSecurity 配置中拒绝
TRACE, OPTIONS, HEAD(除非明确需要)。
防重放与参数篡改要双管齐下
即使用了 HTTPS,也不能防住合法请求被截获后重复提交或修改参数:
- 每个请求带
timestamp(毫秒级)和nonce(一次随机字符串),服务端缓存最近 5 分钟的 nonce 并去重; - 客户端用约定密钥 + 请求路径 + 参数排序 + timestamp + nonce 计算签名(如 HMAC-SHA256),服务端复现比对;
- 关键业务接口(如支付、发短信)增加人机识别(滑块、图形验证码)或频控(Redis 计数器,按用户/IP/接口维度限流);
- 敏感字段(如金额、ID)服务端二次校验逻辑合理性,例如充值金额不能为负、不能超单日上限。


















