我正在开发一个网站,后端使用 Spring Boot 1.5.7,前端使用 Angular 2。由于我对这两种技术都是新手,所以在很多事情上我还有些困惑。
我已经用 JWT 实现了用户身份验证。当用户通过凭据登录时,后端会验证凭据并创建一个 JWT,并将其返回到前端:token 以此方式添加到头部:
我已阅读(例如,这里),使用localStorage存在漏洞。
特别是,同一域上的JavaScript可以访问localStorage,从而暴露了XSS攻击的风险。解决方法似乎是使用JWT Cookie。如之前链接中所写,我可以设置HttpOnly cookie标志以避免JavaScript访问cookie。
但是,使用cookie后我就容易受到CRSF攻击的影响。
现在,在这里,我已经了解到Angular 2+提供了内置的默认启用的反XSS功能。
所以问题是,我应该使用localStorage并只使用嵌入式Angular 2反XSS功能,还是那不够安全,然后我应该将JWT存储在cookie中以获得对XSS攻击的保护,并在其上实施某种CRSF保护后端侧使用Spring Boot配置?
谢谢
我已经用 JWT 实现了用户身份验证。当用户通过凭据登录时,后端会验证凭据并创建一个 JWT,并将其返回到前端:token 以此方式添加到头部:
Authorization - Bearer <jwt token>
在前端中,我会检查帖子响应中是否存在该键。如果有,我会将其与用户名一起添加到本地存储中。
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存在漏洞。
特别是,同一域上的JavaScript可以访问localStorage,从而暴露了XSS攻击的风险。解决方法似乎是使用JWT Cookie。如之前链接中所写,我可以设置HttpOnly cookie标志以避免JavaScript访问cookie。
但是,使用cookie后我就容易受到CRSF攻击的影响。
现在,在这里,我已经了解到Angular 2+提供了内置的默认启用的反XSS功能。
所以问题是,我应该使用localStorage并只使用嵌入式Angular 2反XSS功能,还是那不够安全,然后我应该将JWT存储在cookie中以获得对XSS攻击的保护,并在其上实施某种CRSF保护后端侧使用Spring Boot配置?
谢谢