angularjs – 无法理解JWT和Java(Spring Boot).这个应用程序是否安全?

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

前端是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 Config:

@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吧?

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

点赞