JWT, 为啥需要刷新令牌?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JWT, 为啥需要刷新令牌?相关的知识,希望对你有一定的参考价值。
参考技术A JWT(JsonWebToken),刷新令牌存在的意义是当客户端异常时,也只会在访问令牌过期时间内异常,换取新的访问令牌时,服务端可以介入重新验证客户端身份,它不是解决了安全问题,而是降低了安全风险。客户端和服务端的交互通常是这样的:
1. 用户输入用户名和密码,调登录 API, 返回访问令牌(access_token:假设10分钟过期)和刷新令牌(refresh_token:假设3天过期).
2. 登录后10分钟没有操作,需要使用刷新令牌换取新的访问令牌和新的刷新令牌(此时重新计算3天过期时间),然后用新的访问令牌调业务API.
3. 然后3天没有换过新的访问令牌,此时刷新令牌也过期了,重新请求业务API服务端会返回401,前端跳登录页,用户再次输入密码验证身份。
回到刷新令牌的作用
假设用户登录后(登录接口同时记录了用户的IP地址),黑客截获了访问令牌和刷新令牌,此时黑客只能在访问令牌过期前做破环,因为当黑客用自己的IP地址拿着刷新令牌换访问令牌时,服务端很容易甄别(IP变化), 此时服务端返回 401,让用户重新输入密码验证身份。
假设用户登录后,每秒1000次调用某个业务API,这显然也是不合理的(机器人),那么服务端最多允许它在访问令牌过期前这么干,换令牌时可以做拉黑处理。
问:你说只用访问令牌也能做到这个,把访问令牌过期时间设置的短一点不就行了
显而易见,这样需要频繁验证用户身份,让用户多次输入密码,不仅增加了密码泄露的几率,而且体验会很差,另外访问令牌的过期时间设置多久也是个问题,长了,增加了客户端攻击的时间段,短了,用户不断输密码更不安全,而且还烦。
所以双 token 机制
1. 允许你掌控,根据操作的安全等级,设置不同的过期时间也是一种办法,服务端可以灵活的控制。
2. 如果用户一直在刷新令牌过期前有操作,理论上可以一直不用输入密码验证,体验会很好。
为啥我们需要在 JWT 中刷新令牌
【中文标题】为啥我们需要在 JWT 中刷新令牌【英文标题】:Why do we need refresh tokens in JWT为什么我们需要在 JWT 中刷新令牌 【发布时间】:2020-12-03 13:51:55 【问题描述】:我刚刚在 nodejs 中学习 JWT,我发现了刷新令牌。
据我了解,用户获得访问令牌和刷新令牌。访问令牌过期后,会发出包含刷新令牌的请求以获取新的访问令牌。为了获取新的访问令牌,服务器检查接收到的刷新令牌是否包含在数据库中。如果刷新令牌被盗,可以很容易地从数据库中删除并防止进一步刷新。
我的问题是:为什么我们不让访问令牌表现得像刷新令牌一样?即我们将它们存储在数据库中,并在发出请求时检查它们是否存在,当受到攻击时我们只是删除它们?
【问题讨论】:
【参考方案1】:回答您的问题的关键要素是:您需要在交付给客户的访问令牌上添加到期日期。这是刷新令牌的主要目的。
想象一下,有人盗用了您的 access_token,而您却没有让它过期:这意味着只要您没有发现您的 access_token 被盗,您实际上就是在向拥有它的人提供终身免费通行证。
有了刷新令牌和可过期的access_tokens,你就知道漏洞的窗口真的很小。
现在你的第二个问题:为什么我们不让 access_tokens 表现得像 refresh_tokens ?
这里的关键思想是将您的 refresh_token 保存在安全的地方,并且只公开 access_tokens。
顺便说一下,refresh_tokens 有一个工作:携带信息以生成新的 access_tokens,而 access_tokens 有自己的工作:携带必要的信息,让您可以直接访问资源。
如果您关注大多数严肃的网站,它们都有一个集中的身份验证服务器来提供 access_tokens。
【讨论】:
我理解让访问令牌过期的想法。但我仍然不明白,刷新令牌如何比访问令牌更安全地保存?它们都被发送到客户端,唯一的区别是每个请求都会发送访问令牌,并且每 15 分钟左右发送一次刷新令牌。提前致谢!以上是关于JWT, 为啥需要刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章