【问题标题】:Securirty: Java Spring Boot + Angular 2 + JWT安全性:Java Spring Boot + Angular 2 + JWT
【发布时间】:2023-04-04 05:05:01
【问题描述】:

我正在开发一个网站,使用 Spring Boot 1.5.7 作为后端,Angular 2 作为前端。 我是这两种技术的新手,这是我第一次尝试开发网站。所以我对很多事情都有些困惑。

我已经通过 JWT 实现了用户身份验证。 当用户通过凭据登录时,后端会对其进行验证,然后创建一个 JWT 并将其返回给前端:令牌以这种方式添加到标头中:

Authorization - Bearer <jwt token>

在前端,我检查该键是否在发布响应中。如果存在,我将其与用户名一起添加到 localStorage

private authUrl = 'http://localhost:8080/login';
private headers = new Headers({
    'Content-Type': 'application/json',
    'Accept': 'application/json'
});

constructor(private http: Http) { }

login(username: string, password: string): Observable<void> {
    let loginRequest = JSON.stringify({ username: username, password: password });

    return this.http.post(this.authUrl, loginRequest, { headers: this.headers })
        .map((response: Response) => {
            let token = response.headers.get('Authorization');
            // If token is not null, empty or undefined.
            if (token) {
                localStorage.setItem('jwt', JSON.stringify({ username: username, token: token }));
            }
        });
}

当用户登录后,每次访问受保护的资源时,都会从 localStorage 中获取一个 token 并发送回后端进行验证。 整个事情都有效。 JWT 对 CSRF 免疫,所以我可以在后端禁用它,

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
    ...

但我读到(例如,here)在使用 localStorage 时存在漏洞。

特别是 localStorage 可以通过同一域上的 JavaScript 访问,从而暴露于 XSS 攻击。 为了解决这个问题,我似乎可以使用 JWT Cookie。如之前链接中所写,我可以设置 HttpOnly cookie 标志以避免通过 JavaScript 访问 cookie。

但是,有了 cookie,我现在很容易受到 CRSF 攻击。

现在,here,我已阅读 Angular 2+ 提供了内置的、默认启用的抗 XSS。

所以问题是。我应该使用 localStorage 并且只使用嵌入式 Angular 2 反 XSS 功能,或者这还不够,然后我应该将 JWT 存储在 cookie 上以防止 XSS 攻击,然后在其之上使用 Spring 实现某种 CRSF 保护后端开机配置?

谢谢

编辑:该网站是一种购物车。用户几乎可以查看所有 页面,但要付款,他需要登录。

【问题讨论】:

    标签: java angular spring-boot cookies jwt


    【解决方案1】:

    Aniruddha Das 方法很好,但如果用户刷新浏览器,客户端应用程序将丢失令牌,因为 DOM 将随着浏览器刷新而重新加载,并且包括令牌在内的所有内存数据都将丢失。

    现在回到你的方法-

    1. 本地存储 - 使用这种方法不可能进行 CSRF 攻击,应用程序将是无状态的,但容易受到 XSS 攻击。默认情况下,Angular 会进行输出编码以防止 XSS 攻击,但服务器端 Angular 模板仍然存在风险。为了缓解 XSS 攻击,您可以减少令牌过期时间并在存在敏感信息时对其进行加密。
    2. Cookie 方法 - HTTP cookie 将缓解 XSS 攻击,但您必须实施 CSRF 保护。您必须使用 API 网关模式来使应用程序无状态。

    这两种方法各有利弊,您必须根据您的应用进行选择。如果您的应用程序与金融领域有关,那么我会建议基于 cookie 的方法。

    【讨论】:

    • 感谢您的回答。我已经编辑了这个问题;我的网站将是一个购物车。在这种情况下最好遵循方法#2?
    【解决方案2】:

    在 Angular 中,您可以使用令牌并在需要时使用它。就像 pojo in java in angular 一样,您可以使用 getter 和 setter 创建一个 angular 服务来保存令牌。向模块提供该服务,它将在所有componentdirectives 中可用。

    当应用程序在浏览器中打开时,令牌将在内存中,并将存储在浏览器中。

    我会说使用 observable/Subject 类型变量,这样它就会等到从服务器提取令牌并使用它来做事。

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 2017-09-13
      • 2016-07-10
      • 2020-05-27
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2018-10-29
      • 2017-07-01
      相关资源
      最近更新 更多