无状态登录原理
1.1.什么是有状态?
有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。
例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。
缺点是什么?
服务端保存大量数据,增加服务端压力
服务端保存用户状态,无法进行水平扩展
客户端请求依赖服务端,多次请求必须访问同一台服务器
1.2.什么是无状态?
微服务集群中的每个服务,对外提供的都是Rest风格的接口。而Rest风格的一个最重要的规范就是:服 务的无状态性,即:
服务端不保存任何客户端请求者信息
客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份
带来的好处是什么呢?
客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务
服务端的集群和状态对客户端透明
服务端可以任意的迁移和伸缩
减小服务端存储压力
什么是RSA加密?
RSA称为非对称加密,加密技术是对信息进行编码和解码的技术,编码是把原来可读信息(又称明文)译成代码形式(又称密
文)其逆过程就是解码(解密)
,加密技术的要点是加密算法,RSA会根据你给的 盐值
生成私钥和公钥:
私钥:通过
私钥
加密的数据使用私钥
或者公钥
来解密。公钥:通过
公钥
加密的数据只能使用私钥
来解密。优点:安全,难以破解
缺点:算法比较耗时
什么是JWT?
JWT,全称是Json Web Token
, 是JSON风格轻量级的授权
和身份认证规范
,可实现无状态、分布式的 Web应用授权。
看名知意,其实就是一种加密方式,分为三部分:
-
Header(头部)
:一般只包含两部分信息:声明加密的算法,这里使用的是HS256的加密算法。
声明Token的类型,这里使用的是JWT的风格类型。
Payload(载荷)
:存放一些有效数据比如用户ID、用户名称,解密之后可以获取载荷
中的用户信息,因为采用Base64编码格式,所以可以被解码,不要放敏感信息,例如登录密码之类的。-
Signature(签名)
:Signature由header
和payload
经过 base64 编码后加盐值
得到的。生成Signature的算法如下:
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, '!Q@#$%^%&');
在分布式下完成SSO单点登录
只使用JWT来完成单点登录
有了JWT为什么还需要RSA?
可以发现,每次鉴权都需要访问鉴权中心,系统间的网络请求频率过高,效率略差,鉴权中心的压力较大。
这时就用到了前面说的RSA,我们可以把私钥
留在授权中心,把公钥
给网关或者其他微服务,那么就可以在网关或其他微服务当中直接解密JWT了,这样做的好处是减少了授权中心的压力。
使用JWT+RSA完成单点登录
![image-20201122203444462](D:\第一个月学习内容\java\****博客文章\使用JWT+RSA加密完成分布式下SSO功能\使用JWT+RSA加密完成分布式下SSO功能.assets\image-20201122203444462.png)