authentication - JWT 身份验证和刷新 token 的用途

标签 authentication jwt refresh-token

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

我已阅读 this SO question以及来自 José F. Romaniello 的 answer我的理解是:

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

同时在 auth0它说:

You can request new access tokens until the refresh token is on the DenyList. Applications must store refresh tokens securely because they essentially allow a user to remain authenticated forever.

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

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

...assume that if Bob has compromised the refresh token, he would be using it to generate an access token (because access token is the only thing which is authorized to access resources through the APIs). As soon as Bob (attacker) requests with the newly generated access token because Alice's (genuine user) access token is still valid, the server would see this as an anomaly, because for a single refresh token there can be only one authorized access token at a time.

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

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

如果我必须保留列入黑名单的 token 的记录,为什么不直接使用访问 token 并在必要时将它们列入黑名单呢?我无法理解拥有两个 token 的优势,因为如果其中一个被盗,窃贼可以永远保持登录状态(特别是在刷新 token 永远持续的移动应用程序的情况下)

预先感谢您的耐心和时间。

最佳答案

在我睡了一觉之后,事情就变得清晰了(呃)。

我的问题是我完全从安全的角度观察刷新 token 。从这个角度来看,我仍然不明白使用刷新 token 是否会带来/会带来什么优势。

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

关于authentication - JWT 身份验证和刷新 token 的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71010645/

相关文章:

session - 基于 cookie 的 session 管理中的身份验证和加密 key

c# - 在不使用用户 ID 和密码的情况下对 Azure SQL 数据库进行身份验证

django - 使用 Kong 进行身份验证

Symfony 5 Heroku 无法从给定配置创建签名的 JWT

oauth - JWT 和 Bearer Token 有什么区别?

azure - 如何在代码授予流程中检查从 Azure 获取的刷新 token ?

ruby-on-rails - Ruby on Rails 中基于授权或基于角色的权限入门。

Azure AD B2C 图形 API 401 未经授权

java - 如何在 Java 中使用刷新 token 获取访问 token ?

reactjs - 如何在reactjs中使用刷新 token