【问题标题】:What's the most secure way to store a jwt and still be able to access it from javascript?存储 jwt 并且仍然能够从 javascript 访问它的最安全方法是什么?
【发布时间】:2018-12-17 17:43:10
【问题描述】:

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

以下是我的问题:

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

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

【问题讨论】:

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


    【解决方案1】:

    要安全地使用 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 和安全标志。具有讽刺意味的是,由于安全错误,小提琴不能作为堆栈 sn-p 工作。

    【讨论】:

    • 感谢您的评论。如果我要存储一个令牌以供一次性使用,我猜我会在客户端需要它更多。所以,从你的回答中,我知道本地存储可能会很好。但是,本地存储不是容易受到 XSS 攻击吗?而且,如果我们有 XSS 漏洞,CSRF 防御机制也会被击败。这不应该是一个问题吗?如果我理解错了,请纠正我!
    • 我很好奇你们的 CSRF 防御机制是什么?我知道对抗 CSRF 是一个比处理 XSS 更复杂的问题。无论如何,本地存储确实容易受到 XSS 攻击。
    • 我喜欢 CSRF 的 OWASP 指南。但是,如果我要生成一次性令牌,我认为将其存储在 LocalStorage 中并在每次使用时使其无效就足够安全了。你有什么看法?
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2013-02-11
    • 2017-03-09
    • 2021-04-01
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多