游戏中通常会有一个游戏大厅,在进入游戏大厅的时候会获取很多玩家的一些道具数据或者其他数据,这个数据通常是查询mysql然后存到redis里面,最近在看JWT,发现了JWT里有一些弊端,譬如,撤销令牌并不怎么方便也很反人类,但是,如果把JWT的自描述和redis结合起来呢,就可以实现下面的构想:
- 把用户部分非隐私数据放到JWT里面,譬如,一些道具信息,关卡进度,至于放多少,包体大小的控制需要不断的压测去定义 ,找寻一个最佳值。
- 保证每个用户只有一个有效的JWT,把JWT和用户id关联起来放到redis,这样既可以控制JWT的撤销又能提高安全性,性能上,部分信息可以从JWT的自描述中获取不需要再去查询redis
- 在相关字段更新的时候重新构造JWT下发给客户端,记录JWT的更新次数或者更新时间,同时写入JWT和redis,等客户端下次传递过来JWT的时候,可以校验是否为最后一次生成的有效包体
- 这里的JWT不局限于登陆,完全可以做通用参数传递,减少数据库和缓存查询
- 安全性思考:
- 服务端用私钥加密,可以保证包体不被篡改
- 私钥可以通过配置中心或者动态获取,杜绝研发人员直接接触私钥
- redis里存储了最新版本的JWT,可以保证只有一个最新版本的JWT生效
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章