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

标签 angularjs spring spring-security spring-boot jwt

我正在学习 Udemy 类(class)以尝试构建我的第一个 Spring Boot 应用程序。他们没有使用 Spring Security,而是使用 JJWT实现无状态认证。

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

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

经过一番挖掘,我发现了与 Udemy 类(class)使用的代码类似的代码 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,对吗?

最佳答案

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

关于angularjs - 无法理解 JWT 和 Java (Spring Boot)。这个应用程序安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37606596/

相关文章:

spring - 使用 Hibernate 和 Spring MVC 的 JSP

spring-security - 如何实现Openid Connect和Spring Security

javascript - AngularJS - 在 ng-repeat 中过滤未定义的属性?

javascript - 为信用卡禁用 Safari 自动填充

javascript - 从 ng-repeat 输入框访问 Controller 中的 Angular 范围值

java - Spring-Security:当 AuthenticationManager 抛出 BadCredentialsException 时返回状态 401

java - 单点登录在 Spring Web 应用程序中不起作用

javascript - 使用 AngularJS 在 Cordova 上失去焦点()

mysql - 两个数据库存储库中的 Spring Data JPA

java - 为什么 Spring 在第一次调用 Repository 方法后关闭 Runnable 中的 DB-session?