在Spring中配置REST API的安全性

作者:API传播员 · 2026-01-12 · 阅读时间:5分钟

在大多数情况下,REST API 应仅允许授权方访问。Spring 框架为应用程序的身份验证和授权提供了多种配置方法。尽管 Spring 提供了较为完善的默认设置,但了解其背后的运行机制仍然是非常重要的。本文将列出在配置基于 Spring 框架的 RESTful 应用程序时需要注意的身份验证和授权设置。这些内容更像是一些技巧和建议的集合,而非全面的指导方针。


使用 OAuth2 或 JWT 提升安全性

通常情况下,只有授权用户或应用程序才能访问 RESTful 服务。RESTful Web 应用程序通常不会使用 HTTP 会话,而是对每个传入请求执行访问检查。

限制 RESTful 应用程序访问的一种方法是使用 JSON Web Token)可能是更好的选择。这两者是 RFC 中描述的身份验证和授权框架,提供了比 API 密钥更灵活的身份验证和授权控制方式,但也增加了基础设施和复杂性的成本。幸运的是,已经有许多标准实现,甚至一些服务(如 AWS 的应用程序负载均衡器)支持 OAuth2。

即使使用 OAuth2 或 JWT,也需要确保正确使用它们,例如:

  • 验证每个请求的令牌和访问权限;
  • 避免暴露访问令牌(如不将令牌记录到日志中);
  • 确保访问令牌具有合理的生存期。

此外,OWASP 提供了关于身份验证和授权的良好实践指导,值得参考。


强制使用 HTTPS

强制使用 API 密钥进行身份验证时,TLS(传输层安全协议)对数据的机密性和完整性至关重要。

在 Spring 中,可以通过 requiresSecure() 方法强制使用 HTTPS,并启用 HSTS(HTTP 严格传输安全)标头。例如:

http.requiresSecure();
http.headers().httpStrictTransportSecurity().includeSubDomains(true).maxAgeInSeconds(31536000);

如果应用程序通过反向代理提供 TLS,请确保代理配置为使用 HTTPS 和 HSTS 标头,同时拒绝普通 HTTP 连接或将其重定向到 HTTPS。


配置会话管理

Spring 框架默认支持建立 HTTP 会话,但对于 RESTful 服务来说,每个请求通常都会进行独立的身份验证,因此不需要会话管理机制。在这种情况下,可以通过以下方式禁用会话:

http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

禁用登录和注销页面

Spring 提供了默认的登录表单和注销页面,这对于带有 GUI 的 Web 应用程序可能有用,但 RESTful 应用程序通常不需要这些功能。如果应用程序使用 OAuth2、JWT 或 API 令牌进行访问控制,可以通过以下方式禁用这些功能:

http.formLogin().disable();
http.logout().disable();

禁用基本 HTTP 身份验证

RESTful 应用程序通常不需要基本 HTTP 身份验证,因此可以将其禁用:

http.httpBasic().disable();

禁用匿名访问

如果 RESTful 服务仅允许授权客户端访问,应禁用匿名访问:

http.anonymous().disable();

避免 HTTP 方法授权配置中的问题

在 Spring 中,可以使用 antMatchers() 方法为特定的 HTTP 方法配置访问权限,例如:

http.authorizeRequests()
    .antMatchers(HttpMethod.GET, "/api/**").authenticated()
    .antMatchers(HttpMethod.POST, "/api/**").authenticated();

然而,这种配置可能会遗漏某些 HTTP 方法(如 HEAD),导致安全漏洞。为避免此类问题,建议对所有请求统一要求身份验证,并在最后调用 denyAll()

http.authorizeRequests()
    .antMatchers("/api/**").authenticated()
    .anyRequest().denyAll();

可以使用 authenticated()fullyAuthenticated() 方法,其中后者不考虑“记住我”功能。需要注意的是,RESTful 服务通常不需要“记住我”功能。


禁止使用随机密码创建默认用户

Spring 框架默认会创建一个用户名为“user”的用户,并为其生成随机密码,密码会打印到日志中。这种行为可能会带来安全隐患,因此应禁用默认用户:

spring.security.user.name=none
spring.security.user.password=none

总结

通过本文的建议和技巧,可以有效提升基于 Spring 框架的 RESTful 应用程序的安全性。从使用 OAuth2 或 JWT 到强制 HTTPS,再到禁用不必要的功能,这些措施都旨在减少潜在的安全风险。结合 OWASP 的安全指导方针,开发者可以更全面地保护应用程序的安全。

原文链接: https://blog.gypsyengineer.com/en/security/tips-configuring-security-rest-api-spring.html