【问题标题】:What is the workflow for validating a refresh token and issuing a new bearer token?验证刷新令牌和发布新的不记名令牌的工作流程是什么?
【发布时间】:2018-11-05 22:16:03
【问题描述】:

这不是一个编码问题,而是一个关于正确处理和处理刷新令牌的概念问题。

我有一个单页应用程序,它在登录时会发出一个 jwt 令牌。该令牌工作得很好。现在,我想将过期时间设置为较低的值,并使用刷新令牌来刷新不记名令牌。

问题是,刷新令牌中应该存储哪些声明?在发布新令牌之前应该执行哪些步骤来验证刷新令牌?

例如,现在我的刷新令牌是一个存储过期时间的 jwt,因此客户端知道刷新令牌何时过期,以及用户名声明,以便我知道刷新令牌与哪个用户相关联。

那么当收到刷新令牌时:

  1. 检查它是否未过期。
  2. 检查它是否未被撤销。
  3. 使用刷新令牌中的用户名来颁发新的短期持有者令牌。

这是正确的工作流程吗?我只是想确保我没有错过任何安全检查。

【问题讨论】:

    标签: security jwt


    【解决方案1】:

    如果您的应用程序是单页应用程序,则不应使用长期存在的刷新令牌,因为您无法安全地存储它们。

    OAuth2 为不同类型的客户端 (which I've described here) 定义了许多授权流。刷新令牌仅适用于机密客户端(例如安全服务器上的 Web 应用程序)。

    您的刷新令牌与访问令牌一样容易被盗,因为两者都是存储在客户端上的不记名令牌。

    一些 OAuth 库允许 SPA 或其他非机密客户端通过使用 cookie 中的会话令牌与授权服务器的令牌端点对话来获取新的访问令牌。只要 cookie 有效,用户就可以获得新的访问令牌。之后,用户将需要重新进行身份验证。当然 cookie 可以被标记为安全和仅 http,这使得它们更难被窃取。

    如果您从使用访问令牌的同一服务端点发出 JWT 令牌,您可以让客户端在令牌请求中包含一个随机数,您可以散列并作为声明包含在令牌中。客户端可以在 Authorization 标头中发送 JWT,在自定义标头中发送 nonce。您的令牌验证将再次散列随机数并将其与 JWT 中的声明进行比较。这样,如果你的代币被盗,没有随机数价值就很难使用。当然,在有针对性的攻击中,你的 nonce 也可能被盗。

    【讨论】:

    • 注入的javascript确实可以窃取localStorage,但是cookie也可以这样说,所以不知道cookie是不是更好。 https 的本地存储只能从其他 https 获得,因此在这方面它也同样安全。我们当然会使用 https,并且还将 IP 与刷新令牌相关联。因此,如果 IP 发生更改,则令牌将失效。因此,即使刷新令牌被盗,也无法从其他 IP 使用。虽然即使这样也可以被欺骗,但安全系数大约是您在不转向双重身份验证的情况下可以获得的最高水平。
    • 您评论的第一行不正确。无法通过 XSS 窃取 HttpOnly cookie(请参阅 owasp.org/index.php/HttpOnly)。服务器设置的任何 cookie 都应设为 HttpOnly 和 HTTPS only(安全)。
    • 好的,我阅读了关于 httpOnly 的文章,我同意你的看法。但是在使用 ajax 时如何包含 httponly cookie?
    • 在我提到的JWT库中,授权服务器在用户认证后设置cookie。当 cookie 有效时,AJAX 应用程序可以回来刷新 JWT。对授权服务器的任何请求都会自动包含 cookie,但 SPA 中的 JavaScript 无法访问 cookie(因此不会丢失它)。
    • 在发出 JWT 令牌时,还要设置一个 httpOnly 和安全 cookie。使用来自 localStorage 的 JWT 令牌。刷新 JWT 令牌时,验证 cookie 中的信息。
    猜你喜欢
    • 2020-08-19
    • 2020-01-09
    • 2021-09-17
    • 2016-04-30
    • 2020-07-07
    • 2021-08-23
    • 2020-10-23
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多