1. 分布式系统的定义
分布式系统是由需求的变化由单体架构迭代而来,具有分布式架构的系统叫分布式系统,分布式系统的运行通常依赖网络,它将单体结构的系统分为若干服务,服务之间通过网络交互来完成用户的业务处理,当前流行的微服务架构就是分布式系统架构
以一个电商系统为例:
分布式系统的基本特点:
- 分布性:每个微服务都可以独立部署,服务之间的通信通过网络,比如:订单服务,商品服务
- 伸缩性:每个微服务都可以以集群方式部署,并可针对部分节点进行硬件及软件的扩容,具有一定的伸缩能力
- 共享性:每个服务都可以作为共享资源对外提供服务,多个服务可能有操作共享资源的情况
- 开放性:每个服务根据需求都可以对外发布共享资源的访问接口,并允许第三方系统访问
2. 分布式系统的认证需求
分布式系统的每个服务都有认证、授权的需求,如果每一个服务都实现一套认证授权逻辑会非常冗余,考虑分布式系统共享性的特点,需要由独立的认证服务处理系统认证授权的请求,不仅对系统内部服务提供认证,对第三方系统也要提供认证
1)统一认证授权
1.提供独立的认证服务,统一处理认证授权,无论是不同类型的用户,还是不同种类的客户端(web端,H5,APP),均采用一致的认证、权限、会话机制实现统一认证授权
2.统一认证授权的方式必须也是可拓展的,支持各种认证需求,比如:用户密码认证、短信验证码、二维码、人脸识别等认证方式,并可以实现灵活切换
2)应用接入认证
应用提供拓展和开发能力,提供安全的系统对接机制,并对开发部分API给予接入第三方使用,一方应用(内部系统服务)和三方应用(第三方应用)均采用统一机制接入
3. 分布式系统的认证方案
3.1 基于Session认证方案
在分布式的环境下,基于session的认证会出现一个问题,每个应用服务都需要在session中存储用户身份信息,通过负载均衡将本地的请求分配到另一个应用服务器需要将session信息带过去,否则需要重新认证
通常解决session共享问题的几种方式:
- session复制:使用tomcat的插件可以实现多台应用服务器之间的session同步
- IP请求负载:使用Nginx的iphash负载策略,使用同一个IP请求负载到同一台服务器上
- session的集中化存储:使用第三方的存储工具,如:redis,统一获取session
基于session的认证方式,可以更好的在服务端对会话进行控制,且安全性较高,但是session机制方式基于cookie,在复制的移动客户端上不能有效使用,并且无法跨域,另外随着系统的拓展性需求提高session的这些共享策略的容错性
3.2 基于Token的认证方式
基于Token的认证方式,服务端不用存储认证数据,易维护拓展强,客户端可以把token存在任意地方,并且可以实现web和app统一认证机制,其明显缺点就是由于自包含信息,因此一般数据量较大,并且每次请求都需要传递,因此比较占网络。另外token的签名验签操作会给cpu带来额外的处理负担
2.3 基于token的技术方案
在现在的前后端分离项目的技术选型中,都采用Token的认证方式
优点:
- 服务端无需存储会话信息,减轻服务端的压力
- 适合统一认证的机制、客户端、三方应用都遵循一致的认证机制
- token认证方式对第三方应用接入更适合,因为它更开放,可使用当前流行开放协议OAuth2.0,JWT等
token技术方案图:
Comments | NOTHING