单点登录的原理、实现、以及技术方案比较详解

举报
mikechen的互联网架构 发表于 2024/11/18 16:28:47 2024/11/18
【摘要】 本文详细介绍单点登录(SSO)的定义、原理、实现细节,探讨其在大型网站中的应用,帮助读者理解如何通过分布式Session实现高效的用户认证与授权。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。

关注△mikechen的互联网架构△,10年+BAT架构经验倾囊相授

大家好,我是 mikechen | 陈睿

本篇和大家分享、探讨SSO(单点登录),内容涉及SSO的定义、表现、原理、实现细节等方面的阐述@mikechen

一、单点登录介绍

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。

单点登录SSO(Single Sign On)说得简单点,就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。

二、为什么需要单点登录

单点登录在大型网站里使用得非常频繁,例如,阿A里旗下有淘T宝、天T猫、支付B宝等网站,还有背后的成百上千的子系统,用户一次操作或交易可能涉及到几十个子系统的协作,如果每个子系统都需要用户认证,不仅用户会疯掉,各子系统也会为这种重复认证授权的逻辑搞疯掉。

image.png

所以,单点登录要解决的就是,用户只需要登录一次就可以访问所有相互信任的应用系统。

三、单点登录的来源

1.早期的单机部署:web单系统应用

早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的,所有的功能,所有的业务,后台管理,门户界面,都是由这一个war来支持的,这样的单应用,也称之为巨石应用,因为十分不好扩展和拆分。

在巨石应用下,用户的登录以及权限就显得十分简单,用户登录成功后,把相关信息放入会话中,HTTP维护这个会话,再每次用户请求服务器的时候来验证这个会话即可,大致可以用下图来表示:

image.png

验证登录的这个会话就是session,维护了用户状态,也就是所谓的HTTP有状态协议,我们经常可以在浏览器中看到JSESSIONID,这个就是用来维持这个关系的key。

image.png

2.分布式集群部署

由于网站的访问量越来也大,单机部署已经是巨大瓶颈,所以才有了后来的分布式集群部署。例如:如果引入集群的概念,1单应用可能重新部署在3台tomcat以上服务器,使用nginx来实现反向代理, 此时,这个session就无法在这3台tomcat上共享,用户信息会丢失,所以不得不考虑多服务器之间的session同步问题,这就是单点登录的来源。

image.png

四、单点登录的原理和实现

单点登录的实现方案,一般就包含以下三种:

  • Cookies
  • Session同步
  • 分布式Session方式

目前,大型网站都是采用分布式Session的方式。

我先从cookie的实现谈起,你就能很清楚的知道,为什么需要分布式session方式实现单点登录。

基于Cookie的单点登录

最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验,校验通过则登录当前用户。

不难发现以上方式把信任存储在客户端的Cookie中,这种方式很容易令人质疑:

  • Cookie不安全
  • 不能跨域实现免登

对于第一个问题,通过加密Cookie可以保证安全性,当然这是在源代码不泄露的前提下。如果Cookie的加密算法泄露,攻击者通过伪造Cookie则可以伪造特定用户身份,这是很危险的。

对于第二个问题,不能跨域实现免登更是硬伤。所以,才有了以下的分布式session方案。

五、分布式session方式实现单点登录

例如,阿A里有很多系统分割为多个子系统,独立部署后,不可避免的会遇到会话管理的问题,类似这样的电商网站一般采用分布式Session实现。

再进一步可以根据分布式Session,建立完善的单点登录或账户管理系统。

image.png

流程运行:

  • 用户第一次登录时,将会话信息(用户Id和用户信息),比如以用户Id为Key,写入分布式Session;
  • 用户再次登录时,获取分布式Session,是否有会话信息,如果没有则调到登录页;
  • 一般采用Cache中间件实现,建议使用Redis,因此它有持久化功能,方便分布式Session宕机后,可以从持久化存储中加载会话信息;
  • 存入会话时,可以设置会话保持的时间,比如15分钟,超过后自动超时。

结合Cache中间件,实现的分布式Session,可以很好的模拟Session会话。

六、总结

以上分别从单点登录的原理、来源、实现机制来完整的解读单点登录。

实现单点登录,说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效性,因此要点也就以下两个:

  • 存储信任
  • 验证信任

存储信任建议可以采用分布式文件存储redis来实现。

以上,是单点登录的原理、实现、及技术方案比较的详细解析,欢迎评论区留言交流或拓展。

我是 mikechen | 陈睿 ,关注【mikechen的互联网架构】,10年+BAT架构技术倾囊相授。

新的架构专题内容,第一时间更新至:阿里架构师进阶全部合集

本文已同步我的技术博客 www.mikechen.cc,更新至我原创的《30W+字阿里架构技术合集》中。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。