基本思想是用户会话应该很长并且可以根据用户活动继续/禁用。但是,因为我们无法撤销令牌所以令牌应该是短期的,例如15分钟。如果我们可以在令牌过期后刷新令牌,则可以继续用户会话。
经过一番研究,我发现有两种实现方式可以用于此目的:
一个用于刷新到期,一个用于令牌到期。刷新TTL比令牌到期TTL长。如果客户端发现当前令牌已过期但仍可刷新,则客户端将调用服务器刷新API。新令牌将具有新的到期时间和刷新到期时间。如果两个TTL都已过期,则该令牌无效,并且用户需要再次进行身份验证。 赞成 *不需要额外的auth服务器。 *可以修改令牌的数据,以便在特定情况下替换会话。 缺点 *无法撤消刷新令牌。
刷新令牌是长寿命的,例如一周。访问令牌(这里可以使用JWT)是短暂的,例如15分钟。客户端每次发现访问令牌过期(可以从访问令牌的有效负载中读取)时,都会持有这两个令牌,它会通过刷新令牌进入auth服务器,要求获取新的访问令牌。
赞成
缺点
假设在选项1中,令牌到期时间为15分钟,令牌到期和刷新到期之间的时间间隔也为15分钟。在选项2中,访问令牌到期时间为15分钟,刷新令牌到期时间为一周。
我的问题是,选项2比选项1更安全吗?
我们的产品目前仅用于存储用户信息的分发会话。我们希望消除使用auth服务器和会话,但安全性是我们的首要任务。我没有看到选项2的优点。
我是否误解了错过的某些内容或更好的令牌控制策略?任何建议将不胜感激。
答案 0 :(得分:1)
拥有刷新令牌的唯一目的是允许更新用户会话,而无需让用户再次输入密码。
让我们拆分一些用例
考虑在银行网站,支付网站或公共云中进行会话(AWS管理员令牌可以删除下面的所有公司)。
对于此用例,必须在没有用户再次验证的情况下扩展会话,因此刷新令牌没有意义。提供短暂的访问令牌,根本不提供刷新令牌(可以在OIDC提供程序中将其禁用)。
考虑在移动应用程序中进行会话,可以是游戏,也可以是应用程序(facebook)。
在此用例中,会话可以生存很长时间会很好,但是重要的是能够取消会话(设备丢失或被盗)。一天交付访问令牌,并交付3个月刷新令牌。
打开应用程序后,可以请求带有刷新令牌的新会话,然后使用它。可以通过使刷新令牌无效来撤消设备访问权限(例如,参见facebook / gmail中的“我的活动设备”)。
只有很少的缺点是,如果几个月没有使用该应用程序,则用户必须再次进行身份验证,这在我看来是合理的。 (营销/增长部门的观点可能会有所不同,他们可能会要求将其延长-无限期?-。最好不要将其延长超过一年)。
我在这里专注于移动应用程序,但是网站在某种程度上可以相似。区别在于,尽管最终用户有大量的恶意软件/广告可能会把它们吸引出去,但笔记本电脑/台式机上的(浏览器)Cookie非常容易提取。因此,环境不太值得信赖,这是存储长期令牌的一个问题。