JWT LocalStorage 与 Cookie
Posted
技术标签:
【中文标题】JWT LocalStorage 与 Cookie【英文标题】:JWT LocalStorage vs Cookie 【发布时间】:2019-10-20 04:07:24 【问题描述】:我已经阅读了很多关于在哪里存储 JWT 的文章,并且似乎有很多人支持本地存储与 cookie 争论的双方。
Microsoft 表示 this 关于基于令牌的身份验证:
要在后续请求中发送令牌,请将令牌存储在 浏览器的本地存储。不要担心 CSRF 漏洞 如果令牌存储在浏览器的本地存储中。 CSRF 是一个 关注令牌何时存储在 cookie 中。
虽然this 等帖子强烈主张使用cookies:
我今天看到的最大的安全违规者是我们这些存储 本地存储中的 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,我如何在客户端应用程序中为用户确定角色等?
【问题讨论】:
Randall Degges 的帖子说它不安全,因为XSS
。但据我所知,如果有人能够将 js 脚本注入您的网站,那么他也能够完成真实用户可以完成的大部分工作。在这种情况下,没有什么是安全的,包括 cookie。 Cookie & Session 有时会起作用。但问题是,如果我们有多个需要共享这些 Cookie 和会话的服务器怎么办?我相信 Jonathan Gros-Dubois 的评论很棒。
【参考方案1】:
用“js-cookie”模块设置你的cookies真的很常见。这是我如何将它与 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"
);
【讨论】:
我使用jsonwebtoken、js-cookie、auth0-js一起处理认证。以上是关于JWT LocalStorage 与 Cookie的主要内容,如果未能解决你的问题,请参考以下文章
sessionStorage 与 cookie 中的 JWT 令牌?
sessionStorage 与 cookie 中的 JWT 令牌?
使用 Http 和 Secure 将 Jwt 令牌存储在 Cookie 中,而不是 Javascript 中的 LocalStorage