NodeJS:在客户端将 JWT 存储在哪里? sessionStorage、localStorage 还是 cookie?

Posted

技术标签:

【中文标题】NodeJS:在客户端将 JWT 存储在哪里? sessionStorage、localStorage 还是 cookie?【英文标题】:NodeJS: Where to store JWTs on the client side? sessionStorage, localStorage or cookies? 【发布时间】:2015-09-01 01:14:13 【问题描述】:

在使用 NodeJS 和(例如)AngularJS 的 SPA 上存储 JSON Web 令牌以进行身份​​验证的最佳位置是什么?

到目前为止我得到了什么:

可能的地方:

html5 网络存储 (localStorage/sessionStorage) Cookie

网络存储 (localStorage/sessionStorage) 可通过同一域上的 javascript 访问。这意味着您网站上运行的任何 JavaScript 都可以访问网络存储,因此很容易受到跨站点脚本 (XSS) 攻击。

localStorage 有不同的过期时间,sessionStorage 只能在创建它的窗口打开时访问。 localStorage 会一直持续到您将其删除或用户将其删除。

Cookies 与 HttpOnly cookie 标志一起使用时,无法通过 JavaScript 访问,并且不受 XSS 影响。但是,cookie 容易受到跨站请求伪造 (CSRF) 的攻击。

那么存储 JWT 最安全的方式是什么

【问题讨论】:

我在一个相关问题上提供了一个answer,该问题可能包含有关所有可能性的有用附加信息。 【参考方案1】:

不要将 Angular 应用程序中的密钥作为常量。如果您想安全地验证 JWT 令牌,请从 localStorage 中检索 JWT,然后在 $http.get() 调用中的 Authorization 标头中将其发送到服务器。

密钥只能由服务器上的代码查看/访问。当服务器从 Authorization 标头中获取 JWT 时,它可以检查 JWT 有效负载是否已被篡改。如果它已经将某种授权错误返回给 $http.get() 调用。

【讨论】:

【参考方案2】: sessionStorage:如果您希望将令牌存储到页面关闭。 localStorage:用于持久存储。 cookies:帮助令牌在一段时间后过期。

【讨论】:

【参考方案3】:

您可以将 JWT 存储在您想要的任何位置。如果您想保护它,您可以加密令牌并将其存储在 localstorage/cookies 中,并将您的 angularJs 应用程序中的密钥保持为常量;令牌将保持安全,并且只能从您的应用程序中解密。

【讨论】:

以上是关于NodeJS:在客户端将 JWT 存储在哪里? sessionStorage、localStorage 还是 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

当 Laravel 用作客户端时,JWT 存储在哪里进行身份验证?

我应该在哪里保存客户端的 JWT 以供将来请求?

在哪里控制 expireIn JWT

我在哪里可以将 jwt 令牌存储在 localStorage 中?

在哪里存储访问令牌以及如何跟踪用户(在 Http only cookie 中使用 JWT 令牌)

在客户端存储 JWT 令牌的位置以及如何保护它? [复制]