【问题标题】:JWT authentication and the purpose of refresh tokenJWT认证和刷新token的目的
【发布时间】:2022-02-08 10:34:33
【问题描述】:

我正在努力思考 JWT 身份验证。我已经阅读了很多文章和 SO 问题,但其中一些已经过时了,我仍然没有得到满意的答案。

我已阅读 this SO question 和 José F. Romaniello 的 answer 我了解:

  • 带有刷新令牌的客户端在旧令牌过期之前请求新的访问令牌(这是正常的预期行为)
  • 移动应用令牌永不过期

auth0 上也写着:

您可以请求新的访问令牌,直到刷新令牌位于 拒绝列表。应用程序必须安全地存储刷新令牌,因为它们 本质上允许用户永远保持身份验证。

如果刷新令牌可以永远请求新的访问令牌,那么有时间限制的访问令牌又有什么意义呢?

然后我阅读了this SO question,它引用了上面的 SO 问题。在他的answerqre0ct 中说:

...假设如果 Bob 泄露了刷新令牌,他将 使用它来生成访问令牌(因为访问令牌是唯一的 被授权通过 API 访问资源的事物)。作为 Bob(攻击者)使用新生成的访问令牌请求 因为 Alice(真正的用户)的访问令牌仍然有效,服务器 会将此视为异常,因为对于单个刷新令牌 一次只能是一个授权访问令牌。

如果我们假设客户端在任何时候(如 José F. Romaniello 所说,每小时或每次用户打开 Web 应用程序)请求新的访问令牌是正常的,服务器将如何区分如果是 Alice 或 Bob 正在请求新的访问令牌?为什么这会异常?

另外,很多人说 JWT 身份验证的优点是服务器不进行数据库调用。但是从 auth0 的上述引文中,他们提到了 DenyList。所以我想每个请求都必须有一个数据库调用来检查令牌是否没有被列入黑名单? 没有数据库调用是神话吗?

如果我必须记录列入黑名单的令牌,为什么不使用访问令牌并在必要时将它们列入黑名单?我无法理解拥有两个令牌的好处,因为如果其中一个被盗,小偷可以永远保持登录状态(尤其是在刷新令牌永远持续的移动应用程序环境中)

提前感谢您的耐心和时间。

【问题讨论】:

    标签: authentication jwt refresh-token


    【解决方案1】:

    这里有几个问题...

    从每个令牌类型的意图开始可能最容易回答这个问题 - 实际上有 3 种类型的令牌都有不同的用途:

    • 访问令牌
    • ID 令牌
    • 刷新令牌

    访问令牌用作后端 API 请求的不记名令牌并用于身份验证。它们通常是不包含 PII 的 JWT。如果访问令牌被泄露(例如,如果它用于未加密的请求并被拦截),它通常只有 10-15 分钟的生命周期,因此攻击者可以使用它的时间框架是有限的。

    ID 令牌由公共客户端应用接收,不应离开应用。它们通常是 JWT,可能包含 PII,例如用户名、电子邮件、电话,以便应用可以从 ID 令牌中获取此信息,而无需发出后端请求。

    刷新令牌用于简化后续身份验证的身份验证过程。无需使用用户名和密码/OTP 登录,您只需使用 PIN 或生物识别技术来解锁刷新令牌并对 IDP 执行刷新令牌交换以获得新的访问和 ID 令牌(甚至可能是新的刷新令牌(如果执行刷新令牌轮换)。刷新令牌是不透明的,应该安全地存储在应用程序上。刷新令牌需要更多的安全性,因为它们通常有几个月的生命周期,而单个访问令牌可能只有几分钟的生命周期 - 通常是 10-15 分钟。如果刷新令牌被泄露,它可以用来获取新的访问令牌,直到它最终过期(可能在几个月后)。刷新令牌应该安全地存储在设备上——通常是设备密钥库/链,而不是离开设备。从历史上看,刷新令牌仅用于可以安全存储在设备上的本机应用程序,而不是在基于浏览器的 SPA 中,但我认为随着刷新令牌轮换的出现,这些准则可能会发生一些变化。


    关于使用 JWT 身份验证并且该服务器不进行数据库调用的问题。这里的意思是 JWT auth 是分布式的。可以通过简单地验证数字签名来验证 JWT,而无需发出任何后续网络请求(除了初始延迟加载请求以获取公共签名密钥)。或者使用不透明令牌,您需要每次向某种数据存储发出网络请求以验证令牌。


    WRT 将令牌列入黑名单,一旦颁发了访问令牌,我们通常不会回调 IDP 来验证令牌(这都是分布式身份验证),因此没有将访问令牌列入黑名单的概念。另一方面,刷新令牌可以在 IDP 上被阻止,因此当用户/设备尝试刷新令牌交换(以获取新的访问/ID 令牌)时,如果刷新令牌已被撤销,则 IDP 可以阻止请求。注意:有一些细粒度的 authZ 策略可以在访问令牌在您的后端过期之前阻止它们,但它可能会变得相当复杂。

    【讨论】:

      【解决方案2】:

      睡一觉之后,事情就清楚了(呃)。

      我的问题是我只从安全的角度观察刷新令牌。从这个角度来看,我仍然不明白使用刷新令牌是否/有什么好处。

      我意识到刷新令牌的目的是减少数据库调用 - 而不是检查每个客户端请求是否将访问令牌列入黑名单,仅在请求新的访问令牌时才进行数据库调用(因此每次访问-token-lifetime),验证刷新令牌是否被列入黑名单或是否可以颁发新的访问令牌。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • @taylor.2317 你好,你有什么不明白的?
      • 这不是一个真正的答案:请edit您的问题添加此信息。
      • 这是一个答案...问题是刷新令牌的目的,答案是减少数据库调用。如果您不理解,请说明您不理解的内容...您的 cmets 并没有真正的帮助
      猜你喜欢
      • 2021-08-02
      • 2021-04-26
      • 2017-05-27
      • 2021-04-06
      • 1970-01-01
      • 2020-05-20
      • 2020-10-21
      • 2017-01-14
      • 2020-12-15
      相关资源
      最近更新 更多