【发布时间】: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