基本思想是用户会话应该很长并且可以根据用户活动继续/禁用 . 但是,因为我们无法撤销令牌所以令牌应该是短期的,例如15分钟 . 如果我们可以在令牌过期后刷新令牌,则可以继续用户会话 .

经过一些研究,我发现有两个实现用于此目的:

1.带有两个TTL的JWT令牌 .

一个用于刷新到期,一个用于令牌到期 . 刷新TTL比令牌到期TTL长 . 如果客户端发现当前令牌已过期但仍可刷新,则客户端将调用服务器刷新API . 新令牌将具有新的到期时间和刷新到期时间 . 如果两个TTL都已过期,则该令牌无效,并且用户需要再次进行身份验证 . 优点*不需要额外的auth服务器 . 可以修改令牌的数据,以便在特定情况下替换会话 . 缺点无法撤消刷新令牌 .

2.两个令牌,一个由auth服务器保存的刷新令牌,一个用于访问应用程序的访问令牌 .

刷新令牌是长寿命的,例如一周 . 访问令牌(这里可以使用JWT)是短暂的,例如15分钟 . 每次发现访问令牌过期时(可以从访问令牌的有效负载中读取),客户端都会持有这两个令牌,它会通过刷新令牌进入auth服务器,要求获取新的访问令牌 .

优点

  • 刷新令牌可以被撤销,因为它存储在auth服务器中 .

缺点

  • 需要额外的auth服务器 .

问题

假设在选项1中,令牌到期时间为15分钟,令牌到期和刷新到期之间的时间间隔也是15分钟 . 在选项2中,访问令牌到期时间为15分钟,刷新令牌到期时间为一周 .

普通用户

继续使用应用程序

  • 两个选项都可以很好地刷新令牌,用户体验是相同的 .

登出

  • 选项1:令牌仍然有效 . 最多30分钟后,令牌变为无效 .

  • 选项2:立即撤销刷新令牌 . 访问令牌仍然可以使用最多15分钟 .

关闭浏览器而不注销 .

  • 选项1:令牌在最多30分钟后失效 .

  • 选项2:刷新令牌最多有效一周 . 当然,它可以记录何时将刷新令牌用作最后一个活动以缩短此时间窗口 .

恶意用户(试图窃取每个令牌)

登出

  • 选项1:尝试访问刷新API,以便保持令牌的刷新和可用 .

  • 选项2:刷新令牌被解除 . 访问令牌仍然可以使用最多15分钟 .

关闭浏览器而不注销 .

  • 选项1:尝试访问刷新API,以便保持令牌的刷新和可用 .

  • 选项2:尝试使用刷新令牌访问auth服务器,以便保持生成访问令牌 .

My question is, is option 2 more secure than option1?

我们的产品目前仅用于存储用户信息的分发会话 . 我们希望消除使用auth服务器和会话,但安全性是我们的首要任务 . 我没有看到选项2的优点 .

我错过了什么或者错过了任何更好的令牌控制策略吗?任何建议将不胜感激 .