我已经阅读了很多有关在何处存储JWT的文章,并且似乎有很多人支持本地存储vs Cookies的观点。
Microsoft说this关于基于令牌的身份验证:
要在后续请求中发送令牌,请将令牌存储在 浏览器的本地存储。不用担心CSRF漏洞 如果令牌存储在浏览器的本地存储中。 CSRF是一个 将令牌存储在Cookie中时会有所担心。
this之类的帖子强烈主张使用Cookie:
我今天看到的最大的安全犯罪者是我们这些存储 本地存储中的JWT(会话数据)。许多人没有意识到 JWT本质上与用户名/密码相同。
我想创建一个可供SPA和移动应用程序访问的API。
我的理解是SPA可以/应该通过以下方式使用Cookie:
new CookieOptions
{
HttpOnly = true,
SameSite = SameSiteMode.Strict,
Secure = true
}
移动应用会将JWT存储在设备上,并将其添加到每个请求的Authorization标头中,因为它没有cookie的概念。
在以前的项目中,我在SPA中使用jwt-decode来解析令牌中的用户信息(例如角色)。如果我使用的是HttpOnly cookie,因为我无法访问令牌,这将如何工作?
简而言之,将JWT存储在本地存储中是否安全还是应该始终是cookie?如果需要Cookie,如何确定客户端应用程序中用户的角色等?
答案 0 :(得分:0)
使用“ js-cookie”模块设置cookie的确很常见。这是我与jwt一起使用的示例。
setSession(authResult) {
// Set the time that the Access Token will expire at
const expiresAt = authResult.expiresIn * 1000 + new Date().getTime();
// this.accessToken = authResult.accessToken;
this.idToken = authResult.idToken;
this.expiresAt = expiresAt;
Cookies.set("user", authResult.idTokenPayload);
Cookies.set("jwt", authResult.idToken);
Cookies.set("expiresAt", expiresAt);
// navigate to the home route
}
logout() {
Cookies.remove("user");
Cookies.remove("jwt");
Cookies.remove("expiresAt");
const auth = this.auth0;
auth.logout({
returnTo: "",
clientId: "awdf8adsf98blahblah"
});
}