面试题答案
一键面试实现JWT续签机制的一般流程
- 前端发起请求:当JWT即将过期或已经过期时,前端向服务器发送续签请求,一般会携带当前过期或即将过期的JWT。
- 后端验证:
- 服务器接收到续签请求及JWT后,首先验证该JWT的合法性,包括检查签名是否正确、是否在有效期内(对于即将过期的情况)等。
- 若JWT验证通过,从JWT中提取用户身份信息等相关数据。
- 生成新JWT:
- 根据提取的用户信息,使用相同的密钥和算法生成一个新的JWT,新JWT的有效期重新设置为一个合适的值。
- 可以选择将新JWT直接返回给前端,或者结合刷新令牌机制(如果有),先验证刷新令牌,再返回新JWT。
- 前端更新:前端接收到新的JWT后,更新本地存储或缓存的JWT,用于后续的请求认证。
保证安全性的措施 - 防止重放攻击
- 使用刷新令牌:
- 引入刷新令牌,每次续签时,不仅需要提供过期或即将过期的JWT,还需要提供刷新令牌。
- 刷新令牌存储在服务器端,每次使用后进行更新,且刷新令牌具有较长的有效期但只能使用有限次数。
- 当收到续签请求时,服务器验证刷新令牌的合法性、有效性及使用次数等,若验证通过,才生成新的JWT并更新刷新令牌。
- 添加随机数或时间戳:
- 在JWT负载中添加一个唯一的随机数(如UUID)或时间戳。
- 服务器端维护一个已使用随机数或时间戳的列表,当收到续签请求时,检查负载中的随机数或时间戳是否已在列表中。若存在,则判定为重放攻击,拒绝续签;若不存在,则添加到列表并继续续签流程。
- 设置较短的有效期:
- 对于JWT本身,设置相对较短的有效期,例如15分钟或30分钟,这样即使JWT被截获,攻击者利用它进行重放攻击的时间窗口也较短。
- 结合刷新令牌机制,在JWT过期时可通过刷新令牌快速获取新的JWT,不影响用户正常使用。
- 使用HTTPS:
- 确保整个续签过程使用HTTPS协议进行通信,这样可以防止数据在传输过程中被窃取或篡改,降低JWT被截获用于重放攻击的风险。