存储 jwt 并且仍然能够从 javascript 访问它的最安全的方法是什么?

What's the most secure way to store a jwt and still be able to access it from javascript?

我正在使用 Flask 和 restful API 来处理我的用户管理调用。 示例场景: 假设我正在使用 JWT 来保护我的重置密码 end-point。 我尝试了一种不太安全的方法,目前,我从前一个端点获取令牌作为响应的一部分,并将其作为不记名令牌传递,我仍然碰巧遇到 401 Unauthorized 错误。虽然,我可以从 client-side 调试中看到,令牌正在 header 中传递。理想情况下,我想发送一个带有 Authorization HTTP header 和 Bearer Authentication 方案的 post 请求,并从 httponly cookie 传递此令牌。

以下是我的疑问:

我应该将令牌存储在 HttpOnly Cookie 还是 Localstorage 中? 如果我使用的是 HttpOnly cookie,如何从 ajax 调用中访问我的令牌? 除了身份验证之外,将 JWT 用于 user-related 功能(如重置密码、电子邮件确认等)的最佳方式是什么?

我想确保在完成这一切的同时我不会在安全标准上妥协。

要安全地使用 JWT,您必须使用安全套接字层来保护它在网络上传输(您知道,https 连接,而不是普通的 http)。您也可以加密 JWT 的内容,但将其存储在 cookie 中就足够安全了,仅通过加密通道发送它们,标记为仅 http,并标记为安全。我相信这是有关 cookie 安全性的标准做法。请注意,cookie 会在 header 秒内随每个请求一起发送。它确实是一种服务器端技术。此外,http only cookie 无法在任何现代浏览器中通过脚本读取,只能在某些浏览器中写入。

如果您的数据主要在客户端使用,那么请切换到本地存储以发挥其优势。它不需要与每个网络请求一起使用。您无需担心数据过期。您必须明确删除它。是好是坏?决定你自己的用例。它尊重同源政策。由于您将令牌放在请求的 header 中,因此我看不到任何要求必须将它们存储在 cookie 中。您可以只从本地存储中读取令牌并将其放入每个网络请求的不记名令牌中。

在撰写本文时,Cookie 存储 4KB,本地存储最多 5MB。要获得更多信心,请阅读以下内容:

Local Storage vs Cookies
If you can decode JWT how are they secure?
Store Auth-Token in Cookie or Header?

我会在后续评论中放一个 jsfiddle,这样您就可以看到创建、读取、更新和删除 cookie 的代码。这就是您能够阅读并在 auth header 中使用它所需要的全部内容。但是我没有设置 httponly 和 secure 标志。具有讽刺意味的是,由于安全错误,fiddle 不能用作堆栈片段。