JWT的问题研究和解决方案
JWT:
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。由三部分组成
- 头信息(签名算法和填充等)
- 负载内容(认证信息)
- 签名数据(基于签名算法对数据的处理后的结果)
优点:
- 轻量级
- 无状态
- 多服务端解析(跨服务端,可以在多服务之间进行认证)
- 携带主要认证信息(可以直接从token中拿到一些信息)
缺点:
- 改密
- 续签
- 退出登录
- 包含认证信息(认证信息直接base64编码,敏感信息容易被获取到)
基于上面的优缺点,衍生出来了以下的一些问题,所以需要对认证的流程进行改造:
- 续签:因为浏览器断不进行存储所以对于续签操作无法进行只能重新获取
- 改密和退出:导致了退出和改密之后的token仍可使用,有被重放攻击的危险
- 登陆有效期的问题: 可以根据freshToken维护一个登录的有效期,在该期间可以直接认证
一、认证流程图
1.正常流程
2.改进流程
二、续签流程
按照jwt的协议,没有续签的能力,只能重新获取票据
- 客户端根据过期时长,(eg:2小时),即将过期之前进行重新获取一次票据
- 后端根据已经过期,然后根据携带的freshToken进行续签
三、改密和退出登录问题
四、验签流程
五、注意事项
- token中不能存入敏感信息(建议userId标识)
- jwt生成的时候可以采用对称/非对称加密(密钥难度建议安全系数高)
- 认证接口进行限流(防止重新调用接口,进行试错)
- token和refreshToken需要进行一一对应绑定(建议refreshToken用加密算法实现)