2017-09-25 55 views
2

我正在开发使用春季启动1.5.7作为后端和网站角2为前端。 我是这两种技术的新手,这是我第一次尝试开发一个网站。所以我对很多事情感到困惑。Securirty:Java的春季启动+角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的检索和发送回后端进行验证。 整件事情奏效。智威汤逊是免疫的CSRF,这样我就可以禁用,在后端,

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

,但我已阅读(例如,here)有使用本地存储时的漏洞。

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

但是,使用Cookie我现在很容易受到CRSF攻击。

现在,here,我已阅读Angular 2+提供内置,默认情况下启用,反XSS。

所以问题是。我应该使用localStorage,并使用嵌入式Angular 2反XSS功能,或者这还不够,然后我应该将Cookie存储在JWT上以获得针对XSS攻击的保护,然后使用Spring在其上实现某种CRSF保护后端启动配置?

谢谢

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

回答

1

在角度你可以拿着你的令牌服务,并使用它时,曾经要求它。类似于角度为java的pojo,您可以使用getter和setter创建角度服务来保存令牌。将该服务提供给该模块,并将在所有componentdirectives中提供。

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

我会说使用一个observable/Subject类型的变量,以便它将等待,直到从服务器提取令牌并使用它来做东西。

1

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

现在回到你的approach-

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

两种方法都有prons/cons,你必须根据你的应用选择。如果您的应用程序与金融领域相关,那么我会建议您使用基于Cookie的方法。

+0

谢谢你的回答。我编辑了这个问题;我的网站将是一个有点购物车。在这种情况下,更好地遵循#2接近? – Shaunyl