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

时间:2018-07-10 00:33:30

标签: ajax jwt flask-restful flask-jwt-extended

我正在使用Flask和Restful API处理我的用户管理调用。 示例方案: 假设我正在使用JWT来保护我的重置密码端点。 我尝试了一种不太安全的方法,目前,我从前一个端点获取令牌作为响应的一部分,并将其作为承载令牌传递,但我仍然碰到了401未经授权的错误。尽管从客户端调试中可以看到,令牌已在标头中传递。理想情况下,我要发送带有Authorization HTTP标头和Bearer Authentication方案的发布请求,并从httponly cookie中传递此令牌。

以下是我的问题:

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

我想确保在完成所有这些工作时,我不会在安全标准上妥协。

1 个答案:

答案 0 :(得分:3)

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

如果在客户端最需要数据,则可以使用本地存储以获取其优势。不需要处理每个网络请求。您无需担心数据过期。您必须明确删除它。是好是坏?确定自己的用例。它遵循相同的原产地政策。由于您将令牌放在请求的标头中,因此我看不到要求您必须将其存储在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标头中。但是,我没有设置httponly和secure标志。具有讽刺意味的是,由于安全错误,小提琴不能作为堆栈片段使用。