1. 什么是 SSO

SSO,全称是 Single Sign-On,中文叫 单点登录

它解决的问题是:

用户只需要登录一次,就可以访问多个相互信任的系统。

比如公司内部有这些系统:

  • OA 系统

  • CRM 系统

  • 财务系统

  • 工单系统

  • 数据看板系统

如果没有 SSO,用户访问每个系统都要登录一次,体验很差,账号密码也不好统一管理。

有了 SSO 之后,用户只需要在统一登录中心登录一次,后续访问其他系统时,就可以自动识别登录状态。


2. SSO 的核心思想

SSO 的核心不是“所有系统共用一个 Session”,而是:

所有业务系统都信任同一个认证中心。

这个认证中心一般叫:

  • SSO Server

  • 统一认证中心

  • Identity Provider,简称 IdP

  • 登录中心

业务系统一般叫:

  • Client

  • Service Provider,简称 SP

  • Resource Server

  • 业务应用

简单来说:

  • 用户登录状态由认证中心统一管理

  • 业务系统不直接处理用户名密码

  • 业务系统只校验认证中心签发的登录凭证


3. 普通登录和 SSO 登录的区别

普通登录流程:

  • 用户 -> 系统A -> 输入账号密码 -> 系统A保存登录态

  • 用户 -> 系统B -> 输入账号密码 -> 系统B保存登录态

  • 用户 -> 系统C -> 输入账号密码 -> 系统C保存登录态

SSO 登录流程:

  • 用户 -> 系统A -> 跳转统一登录中心 -> 登录成功

  • 用户 -> 系统B -> 跳转统一登录中心 -> 已登录,直接返回

  • 用户 -> 系统C -> 跳转统一登录中心 -> 已登录,直接返回

区别在于:

对比项

普通登录

SSO

登录入口

每个系统自己登录

统一登录中心

账号管理

各系统独立维护

统一管理

登录状态

各系统独立

认证中心统一维护

用户体验

多次登录

一次登录

安全控制

分散

集中


4. SSO 的基本架构

一个典型的 SSO 架构如下:

这里有三个关键角色:

角色

作用

用户浏览器

保存 Cookie,负责页面跳转

业务系统

提供具体业务功能

SSO 认证中心

负责登录、认证、签发凭证


5. SSO 的常见实现方案

SSO 有多种实现方式,不同场景适合不同方案。

常见方案有:

  1. 同主域 Cookie 共享方案

  2. Token 认证方案

  3. CAS 协议方案

  4. OAuth2 / OpenID Connect 方案

  5. SAML 方案

下面分别说明。


一、同主域 Cookie 共享方案

1. 适用场景

如果多个系统属于同一个主域名,可以通过 Cookie 共享实现简单 SSO。

例如:oa.example.com crm.example.com pay.example.com它们都属于:example.com ,那么登录系统可以把 Cookie 设置到主域:.example.com ,这样多个子系统都能读取这个 Cookie。


2. 登录流程


3. 优点

  • 实现简单

  • 性能好

  • 适合同一个公司内部系统

  • 不需要复杂协议


4. 缺点

  • 只适合同主域名

  • 跨顶级域名不好处理

  • Cookie 泄露风险较高

  • 不适合开放平台和第三方系统

例如下面这种就不好直接共享 Cookie:

system-a.com
system-b.net
system-c.org

二、Token 认证方案

1. 基本思想

用户登录成功后,认证中心生成一个 Token。

业务系统拿到 Token 后,通过以下方式确认用户身份:

  • 本地校验 Token

  • 调用认证中心校验 Token

  • 使用公钥验证 JWT 签名

Token 中一般会包含:

{
  "userId": "10001",
  "username": "zhangsan",
  "roles": ["admin"],
  "expireTime": 1710000000
}

2. 登录流程

sequenceDiagram participant U as 用户 participant A as 业务系统 participant S as SSO认证中心 U->>A: 访问系统 A->>S: 跳转登录 U->>S: 输入账号密码 S->>U: 返回 Token U->>A: 携带 Token 访问 A->>S: 校验 Token S->>A: 返回用户信息

3. Token 可以放在哪里

常见存放位置有:

存放位置

说明

Cookie

浏览器自动携带,适合 Web 系统

LocalStorage

前端可控,但有 XSS 风险

SessionStorage

页面关闭后失效

Authorization Header

常用于前后端分离接口

App 本地存储

移动端常见

Web 系统一般更推荐:

HttpOnly + Secure + SameSite Cookie

这样可以减少 XSS 窃取 Token 的风险。


4. JWT 和普通 Token 的区别

Token 可以分为两类:

类型

特点

随机 Token

本身没有业务含义,需要服务端查询

JWT

Token 内部包含用户信息,可本地验签

JWT 的优点是业务系统可以本地校验,不一定每次都请求认证中心。

但是 JWT 也有问题:

  • 一旦签发,在过期前不容易主动失效

  • Token 太长会增加传输成本

  • 权限变更后,旧 Token 可能还有效

  • 不适合放太敏感的信息

所以实际项目中经常会这样设计:

短期 Access Token + 长期 Refresh Token

三、CAS 协议方案

1. CAS 是什么

CAS,全称是 Central Authentication Service,是一个经典的单点登录协议。

它的核心思想是:

认证中心负责登录,业务系统通过票据确认用户身份。

CAS 里面有几个重要概念:

概念

说明

TGC

Ticket Granting Cookie,登录中心的全局 Cookie

TGT

Ticket Granting Ticket,用户在认证中心的登录凭证

ST

Service Ticket,发给某个业务系统的一次性票据

Service

业务系统地址


2. CAS 登录流程

sequenceDiagram participant U as 用户浏览器 participant A as 业务系统 participant C as CAS认证中心 U->>A: 访问业务系统 A->>C: 跳转到登录中心 U->>C: 输入账号密码 C->>U: 写入TGC并返回ST U->>A: 携带ST访问业务系统 A->>C: 校验ST C->>A: 返回用户身份 A->>U: 建立本地会话

3. CAS 的特点

优点:

  • 协议成熟

  • 适合传统 Web 系统

  • 对后端应用友好

  • 支持单点登录和单点退出

缺点:

  • 对前后端分离、移动端支持没有 OAuth2 / OIDC 自然

  • 生态相对偏传统

  • 接入第三方开放平台时不如 OAuth2 通用


四、OAuth2 / OpenID Connect 方案

1. OAuth2 和 OIDC 的关系

很多人会把 OAuth2 当成登录协议,其实严格来说:

  • OAuth2 主要解决授权问题

  • OIDC 在 OAuth2 基础上解决认证登录问题

也就是说:

协议

解决什么问题

OAuth2

授权,允许第三方访问资源

OpenID Connect

登录认证,确认用户是谁

如果要做标准化 SSO,更推荐使用:

OAuth2 + OpenID Connect

2. OIDC 里的核心 Token

OIDC 常见 Token 有三个:

Token

作用

Authorization Code

授权码,用于换 Token

Access Token

访问资源接口

ID Token

表示用户身份,通常是 JWT

Refresh Token

用于刷新 Access Token

其中最关键的是:

  • ID Token 用来证明用户是谁

  • Access Token 用来访问接口资源


3. 标准授权码流程

sequenceDiagram participant U as 用户 participant A as 业务系统 participant I as 认证中心 U->>A: 访问系统 A->>I: 跳转授权登录 U->>I: 登录并授权 I->>A: 返回 Authorization Code A->>I: 用 Code 换 Token I->>A: 返回 ID Token 和 Access Token A->>U: 建立登录态

4. 为什么推荐授权码模式

在 Web 系统中,尤其是后端参与登录流程的系统,推荐使用:

Authorization Code Flow

原因是:

  • Token 不直接暴露在浏览器地址栏

  • 可以通过后端安全保存 Client Secret

  • 适合传统 Web 和前后端分离架构

  • 是目前主流 SSO 实现方式

如果是纯前端 SPA 应用,则通常使用:

Authorization Code Flow + PKCE

PKCE 可以防止授权码被截获后滥用。


5. OIDC 方案的优点

  • 标准化程度高

  • 生态成熟

  • 支持 Web、App、小程序、第三方平台

  • 可以和企业身份系统集成

  • 适合微服务、前后端分离和开放平台

常见产品包括:

  • Keycloak

  • Authing

  • Okta

  • Auth0

  • Azure AD

  • Spring Authorization Server


五、SAML 方案

1. SAML 是什么

SAML,全称是 Security Assertion Markup Language

它也是一种单点登录协议,常见于企业级系统,尤其是国外 SaaS 和传统企业软件。

SAML 里面有两个核心角色:

角色

说明

IdP

Identity Provider,身份提供方

SP

Service Provider,服务提供方


2. SAML 的特点

优点:

  • 企业级系统支持广泛

  • 适合和传统 IAM 系统集成

  • 很多海外 SaaS 支持 SAML 登录

缺点:

  • XML 格式较重

  • 对现代前后端分离应用不如 OIDC 轻便

  • 实现和调试复杂度较高

如果是新系统,一般优先考虑 OIDC。

如果要接入老牌企业系统或国外 SaaS,SAML 仍然很常见。


六、不同方案如何选择

可以简单按场景选择:

场景

推荐方案

同一个主域名下多个系统

Cookie 共享

公司内部传统 Web 系统

CAS

前后端分离系统

OAuth2 + OIDC

移动端、App、小程序

OAuth2 + OIDC + PKCE

接入第三方开放平台

OAuth2

企业 SaaS 对接

SAML 或 OIDC

微服务体系

OAuth2 + OIDC + JWT

简单后台系统

Session + 统一登录中心

如果是新项目,比较推荐:

OAuth2 + OpenID Connect

这是目前兼容性、扩展性和标准化程度都比较好的方案。


七、一个推荐的 SSO 落地架构

对于企业内部系统,可以设计成下面这样:

flowchart TD U["用户"] --> G["统一网关"] G --> A["业务系统 A"] G --> B["业务系统 B"] G --> C["业务系统 C"] G --> I["认证中心"] I --> R["Redis会话"] I --> DB["用户与权限库"]

核心组件包括:

组件

作用

认证中心

负责登录、登出、签发 Token

用户中心

维护用户、组织、角色、权限

Redis

存储 Session、Refresh Token、黑名单

网关

统一鉴权、路由、限流

业务系统

只处理业务逻辑

权限系统

控制用户能访问哪些资源


1. 登录流程设计

推荐流程:


2. Token 设计

推荐使用:

Access Token + Refresh Token

Access Token:

有效期短,比如 15 分钟到 2 小时
用于访问接口

Refresh Token:

有效期长,比如 7 天到 30 天
用于刷新 Access Token
需要服务端存储和可撤销

这样既能提升安全性,也能保证用户体验。


3. 登录态设计

认证中心维护全局登录态:

SSO Session

业务系统可以维护自己的本地登录态:

Local Session

这样做的好处是:

  • 认证中心负责统一登录

  • 业务系统不需要频繁请求认证中心

  • 每个系统可以有自己的会话控制

  • 单点退出时可以统一通知业务系统


八、单点退出如何实现

SSO 不仅要解决“单点登录”,还要考虑“单点退出”。

否则会出现:

  • 用户从系统 A 退出了

  • 但是系统 B 仍然是登录状态

单点退出常见方式有三种。


1. 前端跳转退出

认证中心退出后,依次跳转各个业务系统的退出地址。

优点:

  • 简单

  • 容易理解

缺点:

  • 依赖浏览器跳转

  • 某个系统失败可能影响后续退出

  • 用户体验一般


2. 后端通知退出

认证中心退出后,服务端调用各个业务系统的退出接口。

SSO Server -> System A logout
SSO Server -> System B logout
SSO Server -> System C logout

优点:

  • 可靠性更好

  • 用户无感知

  • 适合企业内部系统

缺点:

  • 业务系统需要提供退出接口

  • 需要处理接口失败和重试

  • 退出接口要保证安全性


3. Token 黑名单

如果使用 JWT,可以在退出时把 Token 加入黑名单。

业务系统校验 Token 时,同时检查黑名单。

优点:

  • 可以让 JWT 提前失效

  • 适合分布式系统

缺点:

  • 需要额外存储

  • 每次校验可能要访问 Redis

  • 黑名单需要设置过期时间


九、SSO 实现中的安全问题

SSO 是登录入口,一旦出问题,影响所有系统,所以安全设计非常重要。

1. 防止 Token 泄露

建议:

  • Access Token 有效期要短

  • 敏感 Token 不要放在 URL 中

  • Web 场景优先使用 HttpOnly Cookie

  • 开启 HTTPS


2. 防止 CSRF

如果使用 Cookie 维护登录态,需要考虑 CSRF。

常见措施:

  • SameSite Cookie

  • CSRF Token

  • 验证 Origin / Referer

  • 重要操作二次确认


3. 防止 XSS

如果 Token 存在 LocalStorage,一旦页面出现 XSS,Token 可能被直接读取。

所以要注意:

  • 避免直接拼接 HTML

  • 对用户输入做转义

  • 设置 CSP

  • Token 尽量放 HttpOnly Cookie


4. 防止重放攻击

授权码、票据、临时 Token 要满足:

  • 一次性使用

  • 短时间有效

  • 使用后立即失效

比如 CAS 的 ST,OIDC 的 Authorization Code,都应该是短期一次性凭证。


5. Redirect URI 白名单

SSO 登录经常涉及跳转,例如:

https://sso.example.com/login?redirect_uri=https://oa.example.com/callback

认证中心必须校验 redirect_uri 是否在白名单中。

否则可能出现开放重定向漏洞,攻击者可以诱导用户登录后跳转到恶意网站。


十、实际开发中的接口设计

可以设计这些核心接口:

接口

作用

/login

登录页面

/logout

退出登录

/authorize

发起授权

/token

使用授权码换 Token

/userinfo

获取用户信息

/check_token

校验 Token

/refresh_token

刷新 Token

/introspect

Token 状态查询

/jwks

获取公钥,用于 JWT 验签

如果是 OIDC 标准实现,还会有:

/.well-known/openid-configuration

这个接口用于暴露认证中心的配置信息。


十一、数据库表设计参考

一个简单的 SSO 系统,可以有这些表:

表名

作用

user

用户表

role

角色表

permission

权限表

user_role

用户角色关联

role_permission

角色权限关联

client_app

接入的业务系统

sso_session

单点登录会话

oauth_code

授权码

access_token

访问 Token

refresh_token

刷新 Token

login_log

登录日志

其中 client_app 表一般保存:

字段

说明

client_id

应用 ID

client_secret

应用密钥

app_name

应用名称

redirect_uri

回调地址

scope

授权范围

status

应用状态


十二、SSO 和权限系统的关系

SSO 主要解决的是:你是谁。

权限系统主要解决的是:你能做什么。

两者不能混为一谈。

登录成功之后,系统只知道用户身份。至于用户能不能访问某个菜单、按钮、接口,还需要权限系统判断。

常见权限模型有:

模型

说明

RBAC

基于角色的权限控制

ABAC

基于属性的权限控制

ACL

访问控制列表

企业系统中最常见的是:RBAC:用户 -> 角色 -> 权限


十三、总结

SSO 单点登录的本质是:

通过统一认证中心,让多个业务系统共享同一套身份认证能力。

常见实现方案中:

方案

适合场景

Cookie 共享

同主域简单系统

Token

前后端分离、接口系统

CAS

传统企业 Web 系统

OAuth2 + OIDC

现代标准化 SSO

SAML

企业 SaaS、传统 IAM 集成

  • 如果是新项目,推荐优先考虑:OAuth2 + OpenID Connect + Authorization Code + PKCE

  • 如果是公司内部多个后台系统,也可以基于统一认证中心实现:SSO Server + Redis Session + JWT + 网关鉴权

最后要记住一点:

SSO 不只是“登录一次”,更重要的是统一身份、统一安全策略、统一账号生命周期管理。

真正成熟的 SSO 系统,不只是能登录,还要支持:

  • 单点退出

  • Token 刷新

  • 权限控制

  • 多端登录管理

  • 登录日志审计

  • 账号禁用

  • 密码策略

  • MFA 多因素认证

  • 第三方应用接入

  • 安全风控

这样才能支撑企业级系统的统一身份认证体系。