JWT的问题研究和解决方案

JWT的问题研究和解决方案

个人博客传送门


JWT:

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。由三部分组成

  1. 头信息(签名算法和填充等)
  2. 负载内容(认证信息)
  3. 签名数据(基于签名算法对数据的处理后的结果)

优点:

  1. 轻量级
  2. 无状态
  3. 多服务端解析(跨服务端,可以在多服务之间进行认证)
  4. 携带主要认证信息(可以直接从token中拿到一些信息)

缺点:

  1. 改密
  2. 续签
  3. 退出登录
  4. 包含认证信息(认证信息直接base64编码,敏感信息容易被获取到)

基于上面的优缺点,衍生出来了以下的一些问题,所以需要对认证的流程进行改造:

  1. 续签:因为浏览器断不进行存储所以对于续签操作无法进行只能重新获取
  2. 改密和退出:导致了退出和改密之后的token仍可使用,有被重放攻击的危险
  3. 登陆有效期的问题: 可以根据freshToken维护一个登录的有效期,在该期间可以直接认证
一、认证流程图
1.正常流程
客户端 服务端 JwtBuilder 登录 验证身份信息 生成token 携带关键信息生成token 返回生成的token 返回给客户端进行缓存 认证失败(账号或密码错误) alt [身份验证成功] [身份验证失败] 客户端 服务端 JwtBuilder
2.改进流程
客户端 服务端 JwtBuilder Redis 登录 验证身份信息 生成token 携带关键信息生成token 返回生成的token 对当前的token生成对应的refresh Token 将生成的token和refresh Token对应存储 返回给客户端进行缓存 认证失败(账号或密码错误) alt [身份验证成功] [身份验证失败] 客户端 服务端 JwtBuilder Redis

二、续签流程

按照jwt的协议,没有续签的能力,只能重新获取票据

  1. 客户端根据过期时长,(eg:2小时),即将过期之前进行重新获取一次票据
  2. 后端根据已经过期,然后根据携带的freshToken进行续签
客户端 服务端 Redis JwtBuilder 定时任务进行倒计时 调用刷新接口重新获取refreshToken和token 返回服务器端 判断token是否过期 返回过期的返回值,前端进行捕捉 调用刷新接口重新获取refreshToken和token alt [前端主动记录时间] [后端返回过期结果] 验证token和refreshToken的合法性 返回验证结果 将旧的过期的token加入到黑名单(并且设置过期时长) 调用生成token和refreshToken 返回生成的token和refreshToken 将生成的token和refresh Token对应存储 返回给客户端进行缓存 客户端 服务端 Redis JwtBuilder

三、改密和退出登录问题
客户端 服务端 Redis 发送退出/改密请求 判断token是否有效 改密/退出操作 将当前的token加入到黑名单中 返回业务操作的结果 返回业务操作的结果 alt [有效] [无效/过期] 客户端 服务端 Redis

四、验签流程
客户端 微服务网关 Redis 应用 服务端 发送接口请求 判断是否存在黑名单中 解析token放行 访问应用 返回应用的结果 返回验签失败的提示 alt [不存在] [存在] 客户端 微服务网关 Redis 应用 服务端

五、注意事项
  • token中不能存入敏感信息(建议userId标识)
  • jwt生成的时候可以采用对称/非对称加密(密钥难度建议安全系数高)
  • 认证接口进行限流(防止重新调用接口,进行试错)
  • token和refreshToken需要进行一一对应绑定(建议refreshToken用加密算法实现)

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值