哪种 JWT 刷新策略更安全?
Posted
技术标签:
【中文标题】哪种 JWT 刷新策略更安全?【英文标题】:Which JWT Refresh Strategy is safer? 【发布时间】:2018-01-07 18:43:40 【问题描述】:基本思想是用户会话应该很长,并根据用户活动继续/禁用。但是,由于我们无法撤销令牌,因此令牌应该是短期的,例如 15 分钟。如果我们可以在令牌过期后刷新它,那么用户会话可以继续。
经过一番研究,我发现有两种实现方式:
1。具有两个 TTL 的 JWT 令牌。
一个用于刷新过期,一个用于令牌过期。刷新 TTL 比令牌过期 TTL 长。如果客户端发现当前令牌已过期但仍可以刷新,则客户端将调用服务器刷新 API。新令牌将有新的过期时间和刷新过期时间。如果两个 TTL 都过期,则该令牌无效,用户需要再次进行身份验证。 优点 * 不需要额外的身份验证服务器。 * 可以修改token的数据,以便在特定情况下替换会话。 缺点 * 刷新令牌不能被撤销。
2。两个令牌,一个由身份验证服务器持有的刷新令牌,一个用于访问应用程序的访问令牌。
刷新令牌是长期有效的,例如一周。访问令牌(可以在此处使用 JWT)是短暂的,例如 15 分钟。客户端持有这两个令牌,每次发现访问令牌过期(可以从访问令牌的有效负载中读取)时,它都会使用刷新令牌进入身份验证服务器,请求新的访问令牌。
优点
可以撤销刷新令牌,因为它存储在身份验证服务器中。缺点
需要额外的身份验证服务器。问题
假设在选项1中,token过期时间是15分钟,token过期和刷新过期的时间间隔也是15分钟。方案二中访问令牌过期时间为15分钟,刷新令牌过期时间为一周。
普通用户
继续使用应用程序 两个选项都可以很好的刷新token,用户体验是一样的。 登出 选项 1:令牌仍然有效。最多 30 分钟后,令牌失效。 选项 2:立即撤销刷新令牌。访问令牌最多仍可使用 15 分钟。 关闭浏览器而不注销。 选项 1:令牌在最多 30 分钟后失效。 选项 2:刷新令牌最多仍然有效一周。当然它可以记录刷新令牌作为最后一个活动的时间,以缩短这个时间窗口。恶意用户(试图窃取每个令牌)
登出 选项 1:尝试访问刷新 API,以便令牌保持刷新和可用。 选项 2:刷新令牌被解除。访问令牌最多仍可使用 15 分钟。 关闭浏览器而不注销。 选项 1:尝试访问刷新 API,以便令牌保持刷新和可用。 选项 2:尝试使用刷新令牌访问身份验证服务器,因此会保持生成访问令牌。我的问题是,选项 2 是否比选项 1 更安全?
我们的产品目前正在使用分发会话来存储用户信息。我们希望消除对身份验证服务器和会话的使用,但安全性是我们的首要任务。我没有看到选项 2 的太多优势。
我是否误解了某些东西或错过了任何更好的令牌控制策略?任何建议将不胜感激。
【问题讨论】:
【参考方案1】:拥有刷新令牌的唯一目的是允许更新用户会话,而无需用户再次输入密码。
让我们拆分几个用例
高度敏感的应用程序中的短时会话
考虑银行网站、支付网站或公共云中的会话(AWS 管理员令牌可以删除公司的所有基础设施)。
极其敏感的信息。 会议故意限制在很短的时间内(5 分钟到 1 小时)。 用户必须在到期时再次使用密码(和 2FA)登录。不支持续订。 业务应用程序(如 AWS)的会话可能会更长(12 小时 = 一个工作日),以避免员工必须整天不断地进行身份验证。 个人提示:不要太在意失效(或缺乏失效),令牌会在您意识到它们已被盗/泄露并对此采取任何措施之前很久就过期。如果有的话shoulder surfing 在强制用户每 15 分钟重新登录时是一个更大的问题。对于这个用例,如果没有用户再次进行身份验证,就不可能扩展会话,因此刷新令牌没有意义。提供短期访问令牌,根本不提供刷新令牌(可以在 OIDC 提供程序中禁用它们)。
移动应用程序的超长会话
考虑移动应用程序中的会话,可以是游戏,也可以是应用程序(facebook)。
没有敏感信息(人们可能认为他们的 Facebook 敏感,但它不像 gmail 或银行) 会话可能会持续一段时间。 (您是否必须在 facebook 或 tinder 上再次进行身份验证?) 在手机上(重新)输入您的密码是一个巨大的 PITA。 (一定比例的用户在必要时不会回来。他们通常不记得或不想麻烦)。 手机相对安全。即使被盗,小偷通常也无法解锁屏幕或访问设备/应用的存储空间。对于这个用例,最好有可以持续很长时间的会话,但能够取消它们(设备丢失或被盗)很重要。交付一天的访问令牌,交付三个月的刷新令牌。
当应用程序打开时,它可以使用刷新令牌请求新会话,然后使用它。可以通过使刷新令牌无效来撤销设备访问权限(例如,请参阅 facebook/gmail 中的“我的活动设备”)。
唯一的小缺点是如果应用程序数月未使用,用户必须再次进行身份验证,这在我看来是合理的。 (营销/增长部门的观点可能不同,他们可能会要求延长它-无限呢?-。最好不要超过一年)。
我在这里专注于移动应用程序,但网站可能在某种程度上相似。不同之处在于笔记本电脑/台式机上的(浏览器)cookie 非常容易提取,尽管最终用户有大量恶意软件/广告软件可能会将它们吸出。所以环境不是那么值得信赖,这是存储长期令牌的一个问题。
Intranet 中的透明 SSO 和续订会话
TODO:明天添加。写到现在已经花了半个多小时了【讨论】:
以上是关于哪种 JWT 刷新策略更安全?的主要内容,如果未能解决你的问题,请参考以下文章