提问者:小点点

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


我正在使用Flask和restfulAPI来处理我的用户管理调用。示例场景:假设我正在使用JWT来保护我的重置密码endpoint。我尝试了一种不太安全的方法,目前,我从前一个endpoint获取令牌作为响应的一部分,并将其作为不记名令牌传递,但我仍然碰巧收到401未经授权的错误。虽然,我可以从客户端调试中看到令牌正在标头中传递。理想情况下,我想发送带有授权HTTP标头和不记名身份验证方案的post请求,并从httponly cookie传递此令牌。

以下是我的问题:

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

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


共1个答案

匿名用户

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

如果客户端最需要您的数据,那么切换到本地存储是因为它的优势。它不需要与每个网络请求一起使用。您不需要担心数据过期。您必须显式删除它。好还是坏?根据您自己的用例决定。它尊重同源策略。由于您将令牌放在请求的标头中,因此我没有看到任何要求要求您必须将它们存储在cookie中。您可以从本地存储中读取令牌,并将其放在每个网络请求的不记名令牌中。

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

本地存储与Cookie
如果您可以解码JWT它们如何安全?
在Cookie或标头中存储身份令牌?

我将在后续注释中放置一个jsfiddle,这样您就可以看到创建、读取、更新和删除cookie的代码。这就是您能够阅读并在auth标头中使用它所需的全部。然而,我没有设置httponly和安全标志。具有讽刺意味的是,由于安全错误,小提琴不能作为堆栈片段使用。