JWT, 为什么需要刷新令牌?

作者:是阿雷啊 来源:www.jianshu.com 时间:2022-08-07 12:45

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. 如果用户一直在刷新令牌过期前有操作,理论上可以一直不用输入密码验证,体验会很好。