极客时间-如何降低用户鉴权的流量压力

背景

内容是极客时间-徐长龙老师的高并发系统实战课的个人学习笔记,欢迎大家学习!https://time.geekbang.org/column/article/596644

使用Session方式实现用户的用户鉴权

优点

信息都在服务端储存,对客户端不暴露任何用户敏感的数据信息

缺点

  1. Session Cache空间会变得很大
  2. Session Cache和各个子系统的耦合度极高,全站的请求都会对这个缓存至少访问一次

使用jwt登陆和token校验

用户登陆之后会将用户信息放到一个加密签名的token中,每次请求都把这个串放到header或者cookie内带到服务端。服务端解开这个token即可获取用户的信息

token=header+payload+signature

header: 保存加密算法类型

payload: 自定义的内容(用户昵称,uid,过期时间等等)

signature: 防篡改签名

解密

token,第一段和第二段通过base64编码

验证是否过期,其中的过期时间和本地时间对比一下即可

流程图

缺点

如果用户被拉黑了,客户端最快也要在token过期之后才能推出登陆,时效性较低

token的更换和离线

一般使用两种token=refresh_token+access_token

refresh_token用于更换access_token,有效期是30天;

access_token用于保存当前用户信息和权限信息,每隔15分钟更换一次

如果用户中心请求失败,APP处于离线状态,只要检测到本地的refresh_token没有过期,系统仍可以继续工作,直到refresh_token过期为止。

流程图

总结

个人理解:

其实Session和token的方式完全可以结合起来用

  1. Session 耦合性高,实时性高
  2. Token 耦合性不高,实时性低

问题

使用base64加密是不是不太安全?这样不是很容易知道你用什么加密算法了

这个算法重点并不是这个payload区,payload这里只是附带的数据,只是为了方便业务使用,事实上这个核心在于签名和过期时间,由于密钥是只有服务端有,所以签名是不能伪造的,如果到子业务这里验证签名是正确的密钥加密的,那么代表token的payload的内容肯定是服务器发放的,传输的用户无法更改,如果更改了就会和签名核对不上,通过这个方式就已经能够保证数据的安全了。至于base64内放的数据普遍是可以公开的信息,如果有不能公开的信息可以再做一层加密后再放入payload

用户如果更换了昵称,如何快速更换 token 中保存的用户昵称呢?

  1. 客户端可以缓存修改后的昵称,直到更换了access token再清除缓存,类似弹幕本地先发送让用户自己认为发送成功
  2. 有些为了业务方便,token可以有额外的信息放在结尾,如果这个信息用户常修改则不应该放在token里面,单独弄个接口不是直接解决问题。
相关推荐
TDengine (老段)8 分钟前
TDengine 开发指南—— UDF函数
java·大数据·数据库·物联网·数据分析·tdengine·涛思数据
键盘林11 分钟前
分布式系统简述
java·开发语言
可儿·四系桜12 分钟前
如何在 Java 中优雅地使用 Redisson 实现分布式锁
java·开发语言·分布式
bobz96518 分钟前
源码编译 libvirt
后端
道友小小怪19 分钟前
Spring Bean的生命周期及常见问题
后端·spring·面试
Java微观世界21 分钟前
让你秒懂字符集与编码:详解ASCII、GB2312、Unicode和UTF-8
后端
sszdzq27 分钟前
SpringCloudGateway 自定义局部过滤器
java·spring boot
消失的旧时光-194334 分钟前
Android 开发中配置 USB 配件模式(Accessory Mode) 配件过滤器的配置
android·java
IDRSolutions_CN41 分钟前
如何在网页里填写 PDF 表格?
java·经验分享·pdf·软件工程·团队开发
aiopencode42 分钟前
WebDebugX 如何助力跨平台 WebView 页面调试?开发者实战拆解
后端