我正在开发一个网站,使用Spring 1.5.7作为后端,角2作为前端。我是两种技术的新手,这是我第一次尝试开发一个网站。所以我在很多事情上有点困惑。
我已经通过JWT实现了用户身份验证。当用户通过凭据登录时,后端验证它们,然后创建一个JWT并将其返回到前端:令牌以这种方式添加到报头中:
Authorization - Bearer <jwt token>在前面,我检查这个键是否在post响应中。如果它在那里,我将它与用户名一起添加到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中检索一个令牌,并将其发送回后端进行验证。整件事起作用了。JWT对CSRF免疫,所以我可以在后端禁用它,
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
...但我读过(例如,这里),在使用localStorage时存在漏洞。
特别是,localStorage可以通过同一域的JavaScript访问,暴露于XSS攻击。为了解决这个问题,我似乎需要一个JWT Cookie。正如前面在链接中所写的,我可以设置HttpOnly cookie标志,以避免通过JavaScript访问cookie。
但是,有了cookie,我现在很容易受到CRSF攻击。
现在,这里,我已经阅读了角2+提供内置,默认启用,反XSS.
所以问题是。我应该使用localStorage,只使用嵌入式的角2抗XSS功能,或者这还不够,然后我应该在cookie上存储JWT以获得对XSS攻击的保护,然后使用Spring配置在其上实现某种CRSF保护后端?
谢谢
编辑:网站是一种购物车。用户可以查看几乎所有的页面,但要支付费用,他需要登录。
发布于 2017-09-25 18:29:03
Aniruddha方法很好,但如果用户刷新浏览器,客户端应用程序将丢失令牌,因为DOM将重新加载浏览器刷新,所有内存数据(包括令牌)都将丢失。
现在回到你的方法-
这两种方法都有正整数/缺点,您必须根据应用程序进行选择。如果您的应用程序与金融领域相关,那么我建议采用基于cookie的方法。
发布于 2017-09-25 14:51:34
在角度上,您可以在服务中持有您的令牌,并在需要时使用它。与java中的pojo一样,您可以创建一个带有getter和setter的角服务来保存令牌。向模块提供该服务,它将在所有component和directives中使用。
当应用程序在浏览器中打开时,令牌将在内存中,并将存储在浏览器中。
我想说的是,使用一个可观察的/Subject类型变量,这样它将等待从服务器中提取令牌并使用它来完成一些事情。
https://stackoverflow.com/questions/46407680
复制相似问题