沉默是金,总会发光
大家好,我是沉默
单点登录(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);
客户端携带JWT访问各系统:
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-client
client-secret: secret
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
优缺点:
-
优点
-
最成熟的行业标准,安全性高
-
令牌撤销机制完善,支持多租户和多客户端
-
认证与授权职责明确,扩展性极强
-
缺点
-
实现复杂,学习成本高
-
小型项目可能“杀鸡用牛刀”
**-**04-
基于 Spring Session 的分布式 SSO
原理:
Spring Session 就像一个大家共用的会话仓库,把会话数据放到Redis等共享存储。不同应用访问时,都从同一个地方读取用户会话,实现统一登录状态。
代码示例:
-
引入Spring Session + Redis依赖
-
配置统一的Session存储和Cookie策略
-
各应用配置统一认证过滤器,验证共享Session
@EnableRedisHttpSession
public class SessionConfig {
@Bean
public 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体系!
热门文章
**-**05-
粉丝福利
我这里创建一个程序员成长&副业交流群,和一群志同道合的小伙伴,一起聚焦自身发展,可以聊:技术成长与职业规划,分享路线图、面试经验和效率工具,探讨多种副业变现路径,从写作课程到私活接单,主题活动、打卡挑战和项目组队,让志同道合的伙伴互帮互助、共同进步。如果你对这个特别的群,感兴趣的,可以加一下,微信通过后会拉你入群,但是任何人在群里打任何广告,都会被我T掉。