基本思想是用户会话应该长时间存在,并根据用户活动继续/禁用。但由于我们无法撤销令牌,因此令牌应该是短期的,例如15分钟。如果令牌过期后可以刷新,则用户会话可以继续。
经过一些研究,我发现有两种实现方法:
1. 具有两个TTL的JWT令牌。
一个用于刷新到期,一个用于令牌到期。刷新TTL比令牌到期TTL更长。如果客户端发现当前令牌已过期但仍可刷新,则将调用服务器刷新API。新令牌将具有新的到期时间和刷新到期时间。如果两个TTL都过期,则该令牌无效,需要重新进行身份验证。
优点: *不需要额外的认证服务器。 *令牌数据可以被修改,因此可以在特定情况下替换会话。
缺点: *无法撤销刷新令牌。
2. 两个令牌,一个由认证服务器持有的刷新令牌,一个用于访问应用程序的访问令牌。
刷新令牌是长期的,例如一周。访问令牌(JWT可以在此处使用)是短期的,例如15分钟。客户端持有两个令牌,每次发现访问令牌过期(可以从访问令牌的有效载荷中读取),它都会使用刷新令牌向认证服务器请求新的访问令牌。
优点: *刷新令牌可以被撤销,因为它存储在认证服务器中。
缺点: *需要额外的认证服务器。
问题:
假设在选项1中,令牌到期时间为15分钟,令牌到期和刷新到期之间的时间间隔也为15分钟。在选项2中,访问令牌到期时间为15分钟,刷新令牌到期时间为一周。
普通用户:
两个选项都可以很好地刷新令牌,用户体验相同。
选项1:令牌仍然有效。最多30分钟后,令牌将变为无效。
选项2:立即撤销刷新令牌。访问令牌仍可使用,最多15分钟。
选项1:令牌最多在30分钟后失效。
选项2:刷新令牌最多在一周后仍然有效。当然,它可以记录刷新令牌用作最后活动时间,以缩短此时间窗口。
恶意用户(试图窃取每个令牌):
选项1:尝试访问刷新API,以使令牌保持刷新并可用。
选项2:刷新令牌被解除。访问令牌仍可使用,最多15分钟。
经过一些研究,我发现有两种实现方法:
1. 具有两个TTL的JWT令牌。
一个用于刷新到期,一个用于令牌到期。刷新TTL比令牌到期TTL更长。如果客户端发现当前令牌已过期但仍可刷新,则将调用服务器刷新API。新令牌将具有新的到期时间和刷新到期时间。如果两个TTL都过期,则该令牌无效,需要重新进行身份验证。
优点: *不需要额外的认证服务器。 *令牌数据可以被修改,因此可以在特定情况下替换会话。
缺点: *无法撤销刷新令牌。
2. 两个令牌,一个由认证服务器持有的刷新令牌,一个用于访问应用程序的访问令牌。
刷新令牌是长期的,例如一周。访问令牌(JWT可以在此处使用)是短期的,例如15分钟。客户端持有两个令牌,每次发现访问令牌过期(可以从访问令牌的有效载荷中读取),它都会使用刷新令牌向认证服务器请求新的访问令牌。
优点: *刷新令牌可以被撤销,因为它存储在认证服务器中。
缺点: *需要额外的认证服务器。
问题:
假设在选项1中,令牌到期时间为15分钟,令牌到期和刷新到期之间的时间间隔也为15分钟。在选项2中,访问令牌到期时间为15分钟,刷新令牌到期时间为一周。
普通用户:
两个选项都可以很好地刷新令牌,用户体验相同。
选项1:令牌仍然有效。最多30分钟后,令牌将变为无效。
选项2:立即撤销刷新令牌。访问令牌仍可使用,最多15分钟。
选项1:令牌最多在30分钟后失效。
选项2:刷新令牌最多在一周后仍然有效。当然,它可以记录刷新令牌用作最后活动时间,以缩短此时间窗口。
恶意用户(试图窃取每个令牌):
选项1:尝试访问刷新API,以使令牌保持刷新并可用。
选项2:刷新令牌被解除。访问令牌仍可使用,最多15分钟。
- 选项一:尝试访问刷新API,以便令牌得以刷新并保持可用。
- 选项二:使用刷新令牌尝试访问认证服务器,从而保持访问令牌的生成。
我的问题是,选项2比选项1更安全吗?
我们的产品目前仅使用分布式会话存储用户信息。我们希望消除认证服务器和会话的使用,但安全性是我们的首要任务。我没有看到选项2的很多优势。
我是否有什么误解或是错过了更好的令牌控制策略?任何建议将不胜感激。