我对基于令牌的授权相当陌生。我试图找出自定义过期/令牌刷新方案中的缺陷。
我在 Express API 中有一个基本的 JWT 身份验证设置;我将 JWT 到期时间设置为 1 小时;但是,JWT 会检查相对于令牌发布时间的令牌过期时间。我希望在每次成功的 api 调用后重置过期时间。如果我的用户正在积极使用该应用程序超过一个小时,我不希望他们必须重新登录以刷新令牌(并且可能会丢失他们正在处理的任何数据。)
另一方面,如果令牌超过一个小时没有响应,我确实希望令牌过期。
我想出了以下方法:
在每个成功的 API 请求期间,发出一个新的 JWT 并将其发送到自定义响应标头中。我的客户端代码负责检查此 JWT 响应标头并将其值用作新的默认授权请求标头。因此,如果超过 1 小时没有来自用户的 API 请求,则令牌将过期并且不会被刷新。然后需要登录。此外,将存储令牌的原始发行日期(登录身份验证的时间戳),以便在 24 小时后强制执行令牌的“硬过期”。
这看起来相当简单且相当安全,但我在 JWT 研究中没有看到任何提及它的内容。有没有更好的方法来实现相同的目标?我是否错过了这种方法的主要安全漏洞?
更新: 在考虑了一段时间后,我意识到这样做的问题是它打开了重放无法被令牌过期阻止的攻击的大门。所以绝对应该有一个“硬到期”检查:硬到期将使令牌在发行日期后的某个时间失效,无论最近的用户活动如何。