单点登录SSO

一、什么是单点登录(SSO)

定义:在多个相互信任的独立系统/微服务中,用户只需要登录一次,即可访问所有互信子系统,无需重复登录。

解决核心问题:微服务、多子系统架构下,多系统重复登录、会话不统一的问题。

二、单点登录整体优缺点 🔴

1. 优点

  • 用户体验好:一次登录、全站免登,不用反复输入账号密码

  • 统一权限管控:所有系统登录、鉴权、权限收敛,方便统一维护

  • 安全性更高:集中登录校验、风控拦截、登录限流、密码策略统一管控

  • 解耦业务系统:子系统无需关心登录逻辑,专注业务开发

2. 缺点

  • 单点故障风险:登录认证服务挂掉,所有子系统全部无法登录

  • 实现复杂度更高:需要处理跨域、会话共享、续签、注销同步、超时机制

  • 并发压力集中:所有登录、鉴权请求汇聚到认证中心,容易成为性能瓶颈

三、核心问题 🔴

  1. 单点故障:认证中心必须集群部署、做负载均衡,保证高可用

  2. 登录态续签:用户长期操作不退出,需要无感续期,避免频繁掉线

  3. 注销同步:一处退出,所有子系统全部退出,不能存在残留登录态

  4. 安全性:防止token被盗、重放攻击、XSS/CSRF攻击、设置过期时间

  5. 跨域问题:多子系统域名不同,需要处理跨域Cookie、跨域鉴权

  6. 权限收敛:统一角色、菜单、接口权限,避免各系统权限混乱


四、三种主流单点登录方案 🟠

方案一:Redis共享Session(传统最稳、企业内部系统首选)

1. 流程

  1. 用户登录认证成功,服务端生成 Session,存入 Redis

  2. 返回 SessionId 写入浏览器 Cookie

  3. 访问任意子系统,请求携带 Cookie 的 SessionId

  4. 子系统拦截器根据 SessionId 查询 Redis,校验登录态

  5. 校验通过放行,失败拦截跳转登录页

2. 优点

  • 简单稳定、易懂、调试方便

  • 支持主动注销:直接删除Redis数据,登录态立刻失效

  • 服务端可控性极强、安全性高

3. 缺点

  • 依赖Cookie,存在跨域限制

  • 每次请求都要查Redis,有一定网络IO开销

  • 不适用于APP、小程序、第三方跨端场景

4. 适用场景

企业内部后台、管理系统、运维平台、OA、账务后台(你金融项目最常用)


方案二:JWT令牌登录(无状态、前后端分离首选)

1. 流程

  1. 用户登录成功,服务端生成 JWT 令牌(包含用户信息、过期时间、签名)

  2. 前端存储在 localStorage / Cookie

  3. 每次请求 Header 携带 Token

  4. 拦截器校验签名合法性、是否过期,合法则放行

2. 优点

  • 无状态:服务端无需存储会话,减轻Redis压力

  • 天然跨域、跨端,适配Web、APP、小程序

  • 分布式、微服务适配性极强,不用共享存储

3. 致命缺点 🟠

  • 无法主动作废:Token 签发后到期前一直有效,服务端无法单方面失效

  • payload 是 Base64编码,可解码、不可存敏感信息

  • 续签复杂,需要额外刷新令牌机制

4. 生产优化方案

  • 引入 Redis黑名单,存放注销未过期的Token,实现强制失效

  • 双Token机制:AccessToken(短期)+ RefreshToken(长期),实现无感续签

5. 适用场景

对外C端项目、用户量大、前后端分离、多端统一登录系统


方案三:OAuth2.0 授权登录(第三方SSO)

1. 核心场景

用于第三方登录、跨企业系统授权(微信登录、钉钉登录、企业统一认证)

2. 四种授权模式(前两种用的多)🟠

  • 密码模式:信任度高、内部系统互信使用,简单直接
  • 授权码模式(主流):安全性最高、标准第三方登录方案,外网统一使用
  • 简化模式 / 隐式授权模式(Implicit)
  • 客户端模式(Client Credentials)

3. 优缺点

优点:安全性极高、标准化、通用跨平台

缺点:流程复杂、适合第三方授权,不适合纯内部后台


五、生产最终选型标准 🟠

  1. 内部管理系统、账务、后台系统:优先 Redis共享Session,可控、安全、可注销

  2. 对外用户系统、多端、高并发:优先 JWT + Redis黑名单 + 双Token续签

  3. 第三方登录、跨企业授权:OAuth2.0 授权码模式

六、概述 🟠

单点登录主要解决微服务多系统重复登录问题,主流有三种实现。

内部系统一般使用Redis共享Session,可控性强、支持主动注销;对外多端系统采用JWT无状态令牌,跨域适配性好,配合Redis黑名单和双Token解决无法作废和续签问题;第三方授权场景使用OAuth2.0授权码模式。落地时主要需要考虑认证中心高可用、登录态续签、注销同步、跨域处理和接口安全问题。