验证刷新令牌和颁发新的不记名令牌的工作流程是什么?

Gre*_*Gum 7 security jwt

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

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

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

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

那么当收到刷新令牌时:

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

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

Mvd*_*vdD 2

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

OAuth2为不同类型的客户端定义了许多授权流程(我已在此处进行了描述)。刷新令牌仅适用于机密客户端(例如位于安全服务器上的 Web 应用程序)。

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

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

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