无法理解 JWT 和 Java (Spring Boot)。这个应用程序安全吗?

Posted

技术标签:

【中文标题】无法理解 JWT 和 Java (Spring Boot)。这个应用程序安全吗?【英文标题】:Unable to understand JWT and Java (Spring Boot).Is this application secure? 【发布时间】:2016-10-03 01:27:27 【问题描述】:

我正在学习 Udemy 课程,试图构建我的第一个 Spring Boot 应用程序。他们没有使用 Spring Security,而是使用JJWT 来实现无状态身份验证。

前端在 Angular 中,因为它在自己的服务器上运行,所以 CORS 用于打开所有内容,以便 Angular 应用程序可以访问 Java 后端 API。

我担心这会打开 CSRF 或其他安全漏洞的大门。

经过一番挖掘,我发现了与 Udemy 课程使用的 here 类似的代码,但我对安全性的了解还不够,无法知道它是否足够。

有问题的代码如下:

过滤器:

public class JwtFilter extends GenericFilterBean 

@Override
public void doFilter(final ServletRequest req,
                     final ServletResponse res,
                     final FilterChain chain) throws IOException, ServletException 
    final HttpServletRequest request = (HttpServletRequest) req;

    final String authHeader = request.getHeader("Authorization");
    if (authHeader == null || !authHeader.startsWith("Bearer ")) 
        throw new ServletException("Missing or invalid Authorization header.");
    

    final String token = authHeader.substring(7); // The part after "Bearer "

    try 
        final Claims claims = Jwts.parser().setSigningKey("secretkey")
            .parseClaimsJws(token).getBody();
        request.setAttribute("claims", claims);
    
    catch (final SignatureException e) 
        throw new ServletException("Invalid token.");
    

    chain.doFilter(req, res);

Cors 配置:

@Configuration
public class CorsConfig 

    @Bean
    public CorsFilter corsFilter() 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); //usually want this
        config.addAllowedOrigin("*");//not sure if secure?
        config.addAllowedHeader("*");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    

过滤器添加到主应用程序类:

@SpringBootApplication
public class BackendApplication 

@Bean
public FilterRegistrationBean jwtFilter() 
    final FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter((Filter) new JwtFilter());
    registrationBean.addUrlPatterns("/rest/*");

    return registrationBean;


public static void main(String[] args) 
    SpringApplication.run(BackendApplication.class, args);


那么这种设置是否足够安全,可以在生产代码中使用,还是需要更强大的解决方案?

或者有没有更好的方法完全进行无状态身份验证?如果它们都在同一个域上运行,我就不需要 CORS 对吗?

【问题讨论】:

【参考方案1】:

不要出于安全目的使用 JWT。 JWT 包含不应该出现在授权标头中的随机密钥以外的信息。虽然我们可以签署 JWT 令牌,但我们应该避免它。而是将额外信息保存在数据库中,并在服务器端收到令牌时查询它以检查令牌的真实性。此外,如果被攻击者利用,算法类型 none 可以证明是安全灾难。使用简单的随机字符串作为标记。相当简单和更安全。机密信息存在于数据库中而不是令牌中,我们都知道数据库非常安全。

【讨论】:

以上是关于无法理解 JWT 和 Java (Spring Boot)。这个应用程序安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Security + JWT 无法生成令牌

Spring Boot 2 和 Security With JWT 无法提供 Angular 构建的静态内容

Spring Security Jwt Token在请求表单角度时允许所有Options方法

如何使用spring security和java在jwt json中传递角色或权限

Spring Security OAuth2 在没有 JWT 的情况下无法工作

无法在 Java Spring Boot / Angular 应用程序中获取 cookie