JWT LocalStorage vs Cookie

时间:2019-06-04 15:33:14

标签: reactjs asp.net-core cookies jwt

我已经阅读了很多有关在何处存储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,如何确定客户端应用程序中用户的角色等?

1 个答案:

答案 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"
});
}