一图搞懂Web应用的单点登录
单点登录即Signle Sign On,简称SSO。其解决的是用户在多个站点之间跳转时需要频繁登录的问题,比如用户登录了天猫,就应该无需再使用账号登录淘宝,它们之间是可以相互信任的,应该自动同步登录状态。从这点上看单点登录技术的本质是登录状态在多个站点之间的扩散机制。
先来看下单个程序的登录处理流程,这里以Web应用程序为例。在单个Web应用程序中用户通过浏览器提交账号信息到后端服务,后端服务验证账号的有效性,验证通过后在后端创建一个Session,用来维持用户的登录状态,然后向前端返回一个SessionId,前端将这个SessionId保存起来,这个保存操作一般是写入当前域名对应的Cookie,之后每次请求Web页面的时候都要携带这个SessionId,后端服务根据这个SessionId就能识别是哪个用户,然后就可以进行对应的业务处理。具体登录流程如下图所示:

那如何在多个站点之间共享登录状态呢?如果是同一个顶级域名下的不同子域名站点,可以通过共享Cookie的方式,具体操作就是设置Cookie的Domain属性为同一个顶级域名,则各个站点都能获取到这个Cookie,也就能获取到同一个Session,实现登录状态的共享。不过这种方式的普适性不太好,不同的域名之间就做不到,而且共享Cookie安全性上也会有点问题。
本文将介绍一种更通用的单点登录方式,通过引入一个SSO站点,所有的登录请求和登录状态同步请求都交给这个站点来处理。这里假设有两个站点需要同步登录状态:站点A 和 站点B,用户访问站点A时没有登录过,需要在SSO站点先登录,然后登录状态同步到站点A,访问站B时,因为用户已经登录过,所以只需要将登录状态同步到站点B即可。一图胜千言,下面给出详细的时序图,并做一些关键步骤说明,具体过程稍微有些复杂,不过仔细阅读,还是比较容易理解的。

步骤5: 用户在业务站点未登陆时,统一重定向到SSO站点的登录页面。这里有一点需要注意:重定向时需要携带用户访问A站点的地址,这样成功登录后才能跳转回来。
步骤6和步骤27: 重定向到SSO站点时,有两点需要注意:一是要检查来源,如果不是允许的业务站点,则应该拒绝请求,这样比较安全;二是会检查用户在SSO站点的登录状态,如果登录过,浏览器会在HTTP请求头中携带SessionId的Cookie,根据这个SessionId可以判断用户登录状态是否有效,如果有效则给业务站点返回一个Ticket,如果无效则返回登录页面内容,需要用户先通过账号登录成功,然后再给业务站点返回Ticket。
步骤15和步骤30: 业务站点收到SSO站点的Ticket之后,还要使用事先分配好的密钥计算一个签名,这个密钥每个站点应该不同,业务站点后台携带这个Ticket和签名去SSO站点进行验证。Ticket是SSO站点发放的,自然能够验证其有效性;密钥也是SSO站点发放的,根据签名的计算规则再算一遍,对比下就知真伪了。然后告知业务站点你可以登录了,并发送必要的用户信息。之所以会有这个步骤,是因为来源的验证不是那么可靠,密钥每家独一份,安全性就高了很多。
步骤18和步骤33: 业务站点都需要创建自己的用户Session,然后在浏览器写入对应业务站点的SessionId Cookie。这个Session在服务端可以分别存储,如果业务规模不大也可以使用同一份存储,统一存储时登录状态可以统一管理。
当前有很多的站点使用JWT做登录认证,这样有个好处就是分布式环境下不需要集中认证,每个部署节点都拥有完全的认证能力,不过如果需要注销用户的时候,就很难实现同步注销。有一些解决方案,比如认证Token的生存期短一点,再增加一个刷新Token,刷新Token时访问集中的认证服务;或者使用一个高效的黑名单机制,每次都检查黑名单等。如果业务规模不是很大,都不如统一Session的机制简单,比如使用Redis存储Session信息,轻松处理千级万级并发。
以上就是本文的全部内容了,重点就是那张单点登录的时序图,想不明白的时候可以多撸几遍,如有错漏欢迎指正。

收获更多架构知识,请关注公众号 萤火架构。原创内容,转载请注明出处。
一图搞懂Web应用的单点登录的更多相关文章
- 一张图搞懂Spring bean的完整生命周期
一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任何一个环节怎么操作bean的生成及修饰是非常有帮助的. ...
- 一篇文章彻底弄懂CAS实现SSO单点登录原理
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web ...
- 八幅漫画理解使用JSON Web Token设计单点登录系统
用jwt这种token的验证方式,是不是必须用https协议保证token不被其他人拦截? 是的.因为其实只是Base64编码而已,所以很容易就被解码了.如果你的JWT被嗅探到,那么别人就可以相应地解 ...
- 八幅漫画理解使用 JSON Web Token 设计单点登录系统
原文出处: John Wu 上次在<JSON Web Token – 在Web应用间安全地传递信息>中我提到了JSON Web Token可以用来设计单点登录系统.我尝试用八幅漫画先让大家 ...
- [转]八幅漫画理解使用JSON Web Token设计单点登录系统
上次在<JSON Web Token - 在Web应用间安全地传递信息>中我提到了JSON Web Token可以用来设计单点登录系统.我尝试用八幅漫画先让大家理解如何设计正常的用户认证系 ...
- 使用JSON Web Token设计单点登录系统
用户认证八步走 所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时间内让用户访问网站时可以使用其账户,而不需要再次登录的机制. 小知识:可别把用户认证和用户授权(Aut ...
- 使用JSON Web Token设计单点登录系统--转
原文地址:https://leon_lizi.gitbooks.io/json-web-token/content/chapter2.html 用户认证八步走 所谓用户认证(Authenticatio ...
- 身份认证系统(二)多WEB应用的单点登录
随着互联网的发展,web应用的复杂度也一直在提升,慢慢的单一的web应用已经不能满足复杂的业务需求.例如百度的搜索.新闻.百科.贴吧,其实本质上都是不同的网站.当用户使用这些平台的时候,我们当然不希望 ...
- 一张图搞懂容器所有操作 - 每天5分钟玩转 Docker 容器技术(26)
前面我们已经讨论了容器的各种操作,对容器的生命周期有了大致的理解,下面这张状态机很好地总结了容器各种状态之间是如何转换的. 如果掌握了前面的知识,要看懂这张图应该不难.不过有两点还是需要补充一下: 可 ...
随机推荐
- node环境变量配置
1.Node.js 官方网站下载:https://nodejs.org/en/ 2.打开安装,傻瓜式下一步即可,然后配置环境变量 3.因为在执行例如npm install webpack -g等命令全 ...
- iOS UIWebview 长按图片,保存到本地相册
我们所要解决的问题如题目所示:ios中,长按Webview中的图片,将图片保存到本地相册.解决方案:对load的html网页,执行js注入,通过在webview中执行js代码,来响应点击事件,通过js ...
- Mysql的索引调优详解:如何去创建索引以及避免索引失效
在正式介绍Mysql调优之前,先补充mysql的两种引擎 mysql逻辑分层 InnoDB:事务优先(适合高并发操作,行锁) MyISAM:性能优先(表锁) 查看使用的引擎: show variabl ...
- 【JAVA】【JVM】内存结构
虽然jvm帮我们做了内存管理的工作,但是我们仍需要了解jvm到底做了什么,下面我们就一起去看一看 jvm启动时进行一系列的工作,其中一项就是开辟一块运行时内存.而这一块内存中又分为了五大区域,分别用于 ...
- linux查询健康状态,如何直观的判断你的Linux系统是否健康
一提到对于查看系统运行的健康状况,可能大多数朋友考虑到的就是查看进程或者打开任务管理器,但是对于应用在真实生产环境中服务器的linux系统来说,以上两种方式都不是***效的查看方式,那么今天就给大家推 ...
- Spring Boot中使用Redis
一.定义工程 创建一个spring boot模块 二.修改pom文件 在pom文件中添加Spring Boot与Redis整合依赖 <dependencies> <!--spring ...
- 【Linux】【Shell】【Basic】数组
1. 数组: 变量:存储单个元素的内存空间: 数组:存储多个元素的连续的内存空间: 数组名:整个数组只有一个名字: 数组 ...
- 【Spark】【RDD】从本地文件系统创建RDD
练习作业 完成任务从文件创建三个RDD(math bigdata student) cd ~ touch math touch bigdata touch student pwd 启动Spark-sh ...
- Mysql资料 Binlog
目录 一.简介 二.开启binlog及相关参数 开启 相关操作 三.查看binlog日志 使用mysqlbinlog自带查看命令法 mysql加载方式查询 四.恢复数据 五.命令参数 一.简介 MyS ...
- GIT基本使用理解
基本区域介绍 git是一种代码管理工具,所以我们需要知道代码所在位置.分为4个区域: Workspace:工作区 Index / Stage:暂存区 Repository:本地仓库 Remote:远程 ...