- 客户端 token 只存简单的数据,如 userId 。永不过期,除非服务端返回 403 状态码。
- 当 token 进来时,校验,解析出 userId ,从缓存(如 redis )获得 userData ,若缓存存在,更新过期时间。
- 若缓存没有命中,从数据库加载返回同时存入缓存,设置过期时间。
- 基于安全考虑,可在 token 中再加入一个 version 字段,在第 2 步时校验该段。当改密码或其它需要将所有已登录的客户端重登时只需更新 version 字段,并清空缓存即可。
以上,客户端无需主动刷新,也无需定期更换 token ,只有在服务端声明 token 无效时抛弃即可,同时里面也不会包含太多的敏感信息( jwt 只是 base64 编码,随手都可以解析数据出来,不应将敏感数据放在此处),数据量少 token 相对也短些,对传输也有好处;服务端可完全控制 token 的有效性,在必要的情况下可自主 revoke 已颁发的 token 。