如何在浏览器中存储 JWT?

Posted

技术标签:

【中文标题】如何在浏览器中存储 JWT?【英文标题】:How to store JWT in browser? 【发布时间】:2017-10-21 03:09:45 【问题描述】:

我是第一次使用 JSON Web Tokens (JWT)。我正在使用 Hydra-Express 框架制作 Node.js 应用程序。我想使用 JWT 进行身份验证。根据文档,我将 JSON 令牌返回到前端。

var tokenData = 
    username: req.body.username,
;

var result = 
    username: req.body.username,
    token: jwt.sign(tokenData, 'secret',  expiresIn: 60 * 60 )
;

res.json(result);

但我不知道如何将此 JSON 令牌保存到我的浏览器标头中,以免它丢失并与标头一起再次发送到后端。 每次向后端发送请求时,如何将其保存在我的浏览器存储中并将其添加到请求标头中?

【问题讨论】:

如果你愿意,你可以使用 cookie、localStorage,甚至是 WebSQL,我猜任何浏览器存储都可以。尽管如此,我还是建议你阅读这篇文章:cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions 【参考方案1】:

基于 Chris 的回答:

    JWT 永远不应存储在您的 localStorage 中 事实上,它们甚至不应该存储在您的 cookie 中除非您能够实施非常严格的 CSRF 保护

Checkout this for motivation

作为 id_token 的 JWT 就像您的用户凭据 JWT 作为 access_token 就像你的会话令牌

最安全的选项是内存中。 Checkout this for a deep dive

【讨论】:

【参考方案2】:

安全建议:

尽量简短: cookie(仅限 http 和安全标志)易受 CSRF 攻击,但不受 XSS 攻击。 本地存储中的 JWT 易受 XSS 攻击,但不受 CSRF 攻击

您能做的最好的事情就是将风险降到最低: 将 JWT 存储在 cookie 中 在本地存储中存储一个 csrf_token

使其无状态: 在 JWT 负载中包含 csrf_token 并检查服务器端是否 JWT csrf_token 和从 localstorage 读取并在 header 中提供的 csrf_token 匹配。

这需要攻击者通过 XSS 获取 csrf_token(例如,您在您的站点中使用了受感染的第 3 方 js 库或未应用卫生设施) 然后他需要用 csrf_token 触发一个 csrf 请求(例如嵌入 img src 标签或网页/电子邮件中的表单)

这种组合使攻击者更难(但并非不可能)。

它提供与使用 csrf_tokens 的基于会话的普通身份验证相同的安全级别,但不需要状态。

【讨论】:

【参考方案3】:

当它回来时,将整个令牌存储在 sessionStorage 中

sessionStorage.token = json.access_token;

要访问有效负载,请将 jwt 令牌拆分为其 header.payload.signature 部分并仅获取有效负载

var enc = json.access_token.split(".")[1];

然后解析base64

var payload = JSON.parse(window.atob(enc));

然后您就可以抓取并使用经过验证的有效载荷数据 payload.sub、payload.role ...等

【讨论】:

【参考方案4】:

您可以使用 HTML5 网络存储cookie 来存储您的 JWT 令牌,并在您想将请求发送到 web api 时从中读取。

此link 将帮助您确定最适合您的应用的匹配项。

希望对你有帮助!!

【讨论】:

以上是关于如何在浏览器中存储 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Axios 将 JWT 存储在 cookie 中?

如何存储 JWT refreshToken cookie 响应

如何使用 fetch 在前端存储和处理 JWT 令牌,以及如何存储它?

根据初始浏览器请求向服务器发送 JWT 令牌(使用本地存储)

拥有 JWT 后如何获取用户的数据

在基于 Web 浏览器的客户端上存储授权(或 JWT)令牌的位置?