⽆状态 vs 有状态
有状态、⽆状态是什么
- 有状态:服务器端需要保存请求的相关信息,每个请求可以默认地使⽤以前的请求信息
- ⽆状态:服务器端不记录请求的相关信息,服务器处理的内容完全来⾃请求所携带的信息,以及其他服务器端⾃身所保存的、并且可以被所有请求所使⽤的公共信息
有状态
使⽤粘性会话,即:对相同IP的请求,NGINX总会转发到相同的Tomcat实例,这样就就⽆需图中的Session Store了。不过这种⽅式有很多缺点:⽐如⽤户断⽹重连,刷新⻚⾯,由于IP变了,NGINX会转发到其他Tomcat实例,⽽其他实例没有Session,于是就认为⽤户未登录。这让⽤户莫名其妙,⽤得越来越少了。
⽆状态
- 解密Token即可拿到⽤户信息;事实上要看你项⽬的具体实现;有时候Token⾥不⼀定带有⽤户信息;⽽是利⽤Token某个地⽅查询,才能获得⽤户信息
- 客户端传过来的也不⼀定是Token,⽽是⼀个Cookie
有状态 vs ⽆状态
外部⽆状态,内部有状态”⽅案
外部依然针对于Token进行传递到API网关服务,之后进行相关的微服务执行处理,并且后端采用的是将统一化的Session Store的存储介质,之后,可以实现即使是无状态化的服务架构,这个目前使用的较多。
外部⽆状态,内部有状态”⽅案(新老服务兼容)
通过将请求头,可以实现将有状态和无状态的服务均一视同仁,采用head的头进行分析和转发处理新服务和老服务。
⽹关认证授权,内部裸奔”⽅案
⽅案对⽐与选择
授权
访问控制模型
- Access Control List (ACL)
- Role-based access control (RBAC)
- Attribute-based access control (ABAC)
- Rule-based access control
- Time-based access control
RBAC
用户模型、角色模型、权限模型
JWT
JWT全称Json web token,是⼀个开放标准(RFC 7519),⽤来在各⽅之间安全地传输信息。JWT可被 验证和信任,因为它是数字签名的。
JWT由三部分组成:第⼀部分是Header,第⼆部分是Payload,第三部分是Signature
- Token = Base64(Header).Base64(Payload).Base64(Signature)
- Signature = Header指定的签名算法(Base64(header).Base64(payload), 秘钥)