撤销 JWT 且不过期

dc1*_*115 1 authentication oauth-2.0 jwt

我希望为移动应用程序采用基于令牌的身份验证,只要用户未注销,该应用程序就可以保持用户登录状态。我的方法是在用户登录/注册时创建 JWT 刷新令牌;此令牌永不过期,并持续刷新 20 分钟访问令牌。

当他们注销时就会出现问题。我读过解决此问题的最佳方法是将 Redis 上的 JWT 列入黑名单以存储已撤销的密钥。但是,由于 JWT 永不过期,因此该记录永远无法从 Redis 中删除,并且可能会开始占用我的大量内存。

我应该担心这个吗?或者 Redis 在这方面内存效率高吗?有没有更好的方法来撤销 JWT 且不会过期?

小智 6

JWT 令牌是一个自包含令牌。这意味着它会独立存在,直到过期并且无法撤销。因此根据定义它必须过期。因为当它落入坏人之手时,它将允许您访问您的资源而无法撤销它。所以是的,您应该担心这个实现。

这里的问题是您信任刷新令牌本身,因为它是 JWT。事实上你应该信任服务器。不是因为 JWT 不可信,而是因为刷新令牌不必是 JWT。

将刷新令牌保存在内存中,包括过期时间。您可以从内存中删除过期的令牌。这意味着只有内存中存在的令牌才能用于请求新的访问令牌。为了安全起见,请使用一次性刷新令牌。

流程大概是这样的:

  1. 用户登录,收到 JWT 访问令牌(5 分钟)和刷新令牌 1 代码(48 小时)。刷新令牌 1 保存在服务器上。
  2. 五分钟后:访问令牌过期
  3. 使用刷新令牌 1 请求新的访问令牌。
  4. 用户收到新的访问令牌(5 分钟)和刷新令牌 2 代码(48 小时)。令牌 1 从内存中删除,令牌 2 添加到内存中。
  5. 这持续了几个小时。
  6. 用户两天没有使用该应用
  7. 50小时后:由于两个令牌都已过期,用户必须重新登录。重置流量。

注销时从内存中删除刷新令牌。如果您同时希望撤销访问权限。只需从内存中删除刷新令牌即可。5 分钟内用户必须再次登录。