沉默是金,总会发光
大家好,我是沉默
单点登录(Single Sign-On,简称SSO)就像企业应用的万能钥匙,让用户用一组账号密码,一次登录,就能畅游多个相关系统,不用反复输入密码。对于有多个应用的企业,这不仅极大提升用户体验,还能降低管理密码的麻烦和风险。
今天,我们用最通俗的语言,深度剖析几种主流SSO方案,帮你选对技术,快速落地!
-01-
基于Cookie-Session的传统SSO
原理:
想象一下,你在公司大厦大门口登记进去了,门卫给你发了个带有编号的腕带(Session ID)。你走进不同的办公室时,只要出示腕带,保安都知道你是合法员工,不用再重新登记。
技术上,用户登录SSO服务器后,服务器保存登录状态在服务端Session里,并把Session ID放进顶级域名下的Cookie。这样,所有子系统都能读取这个Cookie,判断你已经登录。
代码示例:
- 服务端:登录时创建Session,设置Cookie,标记用户身份。
- 客户端:每次请求都检查是否有SSO Session Cookie,如果没有跳转登录,验证后创建本地Session。
// 服务器端创建Session并设置Cookie,Cookie域名为 .example.com,实现跨子域共享
Cookie cookie = new Cookie("SSO_SESSION_ID", session.getId());
cookie.setDomain(".example.com");
cookie.setHttpOnly(true);
cookie.setSecure(true);
response.addCookie(cookie);
优缺点:
- 优点
- 简单易实现,符合传统Web开发习惯
- 服务端可控,会话失效能即时生效
- 缺点
- 只能同一顶级域名下用(子域共享Cookie)
- Cookie受限于浏览器,移动端支持有限
- 有一定CSRF风险,需要额外防护
-02-
基于 JWT 的无状态现代SSO
原理:
JWT(JSON Web Token)就像是一张“数字通行证”,上面写满了你的身份信息和签名。认证服务器发给你这个通行证,你去哪个系统都能凭它证明身份,无需每次都去服务端查状态。
代码示例:
- 登录后,认证服务生成签名过的JWT,包含用户ID、角色等信息。
- 各客户端接收JWT,后续请求都带着它,后端通过验证签名确认用户身份。
- 不需要服务端保存会话状态,完全无状态。
服务端登录生成JWT:
String jwt = jwtUtil.generateToken(user);
String jwt = jwtUtil.generateToken(user);
客户端携带JWT访问各系统:
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
优缺点:
- 优点
- 跨域无障碍,特别适合微服务架构和前后端分离
- 不依赖Cookie,减少CSRF攻击风险
- 支持各种客户端:Web、移动APP、API调用
- 缺点
- 令牌无法即时撤销(除非加黑名单)
- JWT体积相对较大,网络传输成本增加
- 需要在客户端做好令牌安全管理和刷新机制
-03-
企业级OAuth 2.0 + OpenID Connect
原理:
OAuth 2.0 是授权框架,OpenID Connect(OIDC)是在OAuth基础上的认证层。它就像银行的“统一身份认证中心”,支持复杂的授权流程和第三方接入,安全性和灵活性都很高。
代码示例:
- 搭建授权服务器,支持多种授权模式(密码模式、授权码模式、刷新令牌等)。
- 资源服务器负责保护各业务接口。
- 客户端通过标准协议进行认证授权,拿到访问令牌后访问资源。
授权服务器配置:
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {// 配置客户端、令牌生成与增强
}
客户端配置:
spring:security:oauth2:client:registration:custom:client-id: web-clientclient-secret: secretauthorization-grant-type: authorization_coderedirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
优缺点:
- 优点
- 最成熟的行业标准,安全性高
- 令牌撤销机制完善,支持多租户和多客户端
- 认证与授权职责明确,扩展性极强
- 缺点
- 实现复杂,学习成本高
- 小型项目可能“杀鸡用牛刀”
-04-基于 Spring Session 的分布式 SSO
原理:
Spring Session 就像一个大家共用的会话仓库,把会话数据放到Redis等共享存储。不同应用访问时,都从同一个地方读取用户会话,实现统一登录状态。
代码示例:
- 引入Spring Session + Redis依赖
- 配置统一的Session存储和Cookie策略
- 各应用配置统一认证过滤器,验证共享Session
@EnableRedisHttpSession
public class SessionConfig {@Beanpublic LettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory(redisConfig);}
}
优缺点:
- 优点
- 与Spring生态无缝集成,开发简单
- 共享Session支持复杂会话信息
- 缺点
- 依赖Redis等中央存储
- Cookie机制仍需依赖,限制非Web应用场景
-05- 如何选?
Cookie-Session | 同域名小型应用,简单需求 | 跨域、多端、移动App |
JWT | 分布式微服务,跨域,移动端 | 需要即时令牌撤销的高安全场景 |
OAuth 2.0/OIDC | 企业级、多租户,第三方集成 | 小型快速开发,资源受限 |
Spring Session | Spring生态,中型企业应用 | 异构技术栈,非Web应用 |
总结:
单点登录的世界里,没有万能钥匙,只有最适合的那把。
- 想快速落地、简单管理,同域Cookie-Session就够用。
- 追求分布式、跨端无状态,JWT轻装上阵。
- 需要企业级安全保障和第三方扩展,OAuth2.0/OIDC是首选。
- 使用Spring生态的企业,中型应用可优先考虑Spring Session方案。
选对方案,不仅提升用户体验,更能保证系统安全与维护便利。
希望本文能帮你少走弯路,打造稳定、高效的SSO体系!
热门文章
一套能保命的高并发实战指南
架构师必备:用 AI 快速生成架构图
-05-粉丝福利
我这里创建一个程序员成长&副业交流群,
和一群志同道合的小伙伴,一起聚焦自身发展,
可以聊:
技术成长与职业规划,分享路线图、面试经验和效率工具,
探讨多种副业变现路径,从写作课程到私活接单,
主题活动、打卡挑战和项目组队,让志同道合的伙伴互帮互助、共同进步。
如果你对这个特别的群,感兴趣的,
可以加一下,微信通过后会拉你入群,
但是任何人在群里打任何广告,都会被我T掉。