【发布时间】: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