返回

从 JWT 跨域到接口安全,贯穿 Spring Boot API 守护之旅

后端

跨域资源共享(CORS)和 JSON Web Token(JWT)是当今网络安全领域的两大热门话题。CORS 允许不同源的应用程序进行交互,而 JWT 是一种用于在各方之间安全地传输信息的方法。

在这篇文章中,我们将探讨如何将 JWT 集成到 Spring Boot 项目中,并使用它来保护 API 接口。我们将从 JWT 的基本原理开始,然后介绍如何使用 Spring Security 来实现 JWT 认证。最后,我们将提供一些最佳实践来确保您的 API 接口安全可靠。

JWT 简介

JWT 是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。JWT 由三部分组成:

  • 头部(Header): 包含有关 JWT 的元数据,例如算法和令牌类型。
  • 有效载荷(Payload): 包含实际数据,例如用户 ID、用户名和电子邮件地址。
  • 签名(Signature): 用于验证 JWT 是否被篡改。

JWT 是使用数字签名算法(DSA)签名的,这意味着只有拥有私钥的人才能创建有效的 JWT。这使得 JWT 非常适合用于在各方之间安全地传输信息,因为即使有人拦截了 JWT,他们也无法伪造它。

Spring Security 集成

Spring Security 是一个流行的 Spring Boot 安全框架,它提供了多种开箱即用的安全功能,包括 JWT 认证。要使用 Spring Security 来实现 JWT 认证,我们需要做的就是:

  1. 在 pom.xml 文件中添加 Spring Security 依赖项:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 在 Spring Boot 配置类中启用 JWT 认证:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
    }
}
  1. 创建一个 JWT 过滤器来处理 JWT 请求:
public class JwtFilter extends OncePerRequestFilter {

    private final AuthenticationManager authenticationManager;

    public JwtFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            String token = authorizationHeader.substring(7);
            Authentication authentication = authenticationManager.authenticate(new JwtAuthenticationToken(token));
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }

        filterChain.doFilter(request, response);
    }
}
  1. 将 JWT 过滤器添加到 Spring Security 配置中:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/api/**").authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt()
                .jwtAuthenticationConverter(new JwtAuthenticationConverter());

        http.addFilterBefore(new JwtFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class);
    }
}
  1. 创建一个 JwtAuthenticationConverter 来将 JWT 转换为 Spring Security Authentication 对象:
public class JwtAuthenticationConverter implements Converter<Jwt, Authentication> {

    @Override
    public Authentication convert(Jwt jwt) {
        Claims claims = jwt.getClaims();
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (String role : claims.get("roles", List.class)) {
            authorities.add(new SimpleGrantedAuthority(role));
        }

        return new JwtAuthenticationToken(claims, authorities);
    }
}

最佳实践

在使用 JWT 时,需要注意以下几点:

  • 使用 HTTPS: JWT 应始终通过 HTTPS 传输,以防止数据被窃听。
  • 使用强密钥: JWT 签名密钥应足够强,以防止被破解。
  • 不要在 JWT 中存储敏感数据: JWT 不应存储敏感数据,如密码或信用卡号码。
  • 设置 JWT 过期时间: JWT 应设置过期时间,以防止它们被无限期使用。
  • 使用多因素身份验证: 除了 JWT 之外,还应使用多因素身份验证来保护您的 API 接口。

总结

JWT 是一个非常强大的工具,它可以帮助您保护您的 API 接口。通过使用 Spring Security 来实现 JWT 认证,您可以轻松地将 JWT 集成到您的 Spring Boot 项目中。