单点登录SSO
一、什么是单点登录(SSO)
定义:在多个相互信任的独立系统/微服务中,用户只需要登录一次,即可访问所有互信子系统,无需重复登录。
解决核心问题:微服务、多子系统架构下,多系统重复登录、会话不统一的问题。
二、单点登录整体优缺点 🔴
1. 优点
-
用户体验好:一次登录、全站免登,不用反复输入账号密码
-
统一权限管控:所有系统登录、鉴权、权限收敛,方便统一维护
-
安全性更高:集中登录校验、风控拦截、登录限流、密码策略统一管控
-
解耦业务系统:子系统无需关心登录逻辑,专注业务开发
2. 缺点
-
单点故障风险:登录认证服务挂掉,所有子系统全部无法登录
-
实现复杂度更高:需要处理跨域、会话共享、续签、注销同步、超时机制
-
并发压力集中:所有登录、鉴权请求汇聚到认证中心,容易成为性能瓶颈
三、核心问题 🔴
-
单点故障:认证中心必须集群部署、做负载均衡,保证高可用
-
登录态续签:用户长期操作不退出,需要无感续期,避免频繁掉线
-
注销同步:一处退出,所有子系统全部退出,不能存在残留登录态
-
安全性:防止token被盗、重放攻击、XSS/CSRF攻击、设置过期时间
-
跨域问题:多子系统域名不同,需要处理跨域Cookie、跨域鉴权
-
权限收敛:统一角色、菜单、接口权限,避免各系统权限混乱
四、三种主流单点登录方案 🟠
方案一:Redis共享Session(传统最稳、企业内部系统首选)
1. 流程
-
用户登录认证成功,服务端生成 Session,存入 Redis
-
返回 SessionId 写入浏览器 Cookie
-
访问任意子系统,请求携带 Cookie 的 SessionId
-
子系统拦截器根据 SessionId 查询 Redis,校验登录态
-
校验通过放行,失败拦截跳转登录页
2. 优点
-
简单稳定、易懂、调试方便
-
支持主动注销:直接删除Redis数据,登录态立刻失效
-
服务端可控性极强、安全性高
3. 缺点
-
依赖Cookie,存在跨域限制
-
每次请求都要查Redis,有一定网络IO开销
-
不适用于APP、小程序、第三方跨端场景
4. 适用场景
企业内部后台、管理系统、运维平台、OA、账务后台(你金融项目最常用)
方案二:JWT令牌登录(无状态、前后端分离首选)
1. 流程
-
用户登录成功,服务端生成 JWT 令牌(包含用户信息、过期时间、签名)
-
前端存储在 localStorage / Cookie
-
每次请求 Header 携带 Token
-
拦截器校验签名合法性、是否过期,合法则放行
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. 优缺点
优点:安全性极高、标准化、通用跨平台
缺点:流程复杂、适合第三方授权,不适合纯内部后台
五、生产最终选型标准 🟠
-
内部管理系统、账务、后台系统:优先 Redis共享Session,可控、安全、可注销
-
对外用户系统、多端、高并发:优先 JWT + Redis黑名单 + 双Token续签
-
第三方登录、跨企业授权:OAuth2.0 授权码模式
六、概述 🟠
单点登录主要解决微服务多系统重复登录问题,主流有三种实现。
内部系统一般使用Redis共享Session,可控性强、支持主动注销;对外多端系统采用JWT无状态令牌,跨域适配性好,配合Redis黑名单和双Token解决无法作废和续签问题;第三方授权场景使用OAuth2.0授权码模式。落地时主要需要考虑认证中心高可用、登录态续签、注销同步、跨域处理和接口安全问题。