架构面试-场景题-单点登录(SSO)怎么实现的

概述

单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在多个应用程序和网站上使用一个凭据进行登录, 就是说 允许用户在多个应用或服务中只需进行一次身份验证即可访问所有授权的服务

基于Cookie

利用父域的Cookie机制,在主域名下设置一个共享的Cookie,子域名可以读取这个Cookie来确认用户的身份。
这种方法适用于同主域名下的多个子域名之间的SSO,但如果不同主域名则不适用。
优点: 实现简单,适用于同主域名下的多个子域名之间。
缺点: 不适用于跨主域名的情况,安全性较低,容易受到中间人攻击和跨站脚本(XSS)攻击。

基于Token(OAuth, JWT)

用户在身份提供者处验证后,获得一个Token(例如OAuth中的Access Token或JWT)。
Token被存储在客户端(如Cookie、LocalStorage)或服务器端(如Session),当用户访问其他应用时,应用通过Token验证用户身份。
这种方式支持跨域,且更安全,因为Token可以加密。

优点: 支持跨域,Token可加密传输,提高安全性;Token可以离线存储,减轻服务器负担。
缺点: 需要妥善管理Token的有效期和安全性,防止Token泄露;JWT如果过长可能影响性能。

集中式认证服务 (CAS, SAML)

中心化认证服务作为单一入口,所有应用都依赖它进行身份验证。
用户在CAS/SAML服务器上登录后,CAS/SAML服务器会生成一个Ticket或Assertion传递给应用,应用再使用这个Ticket或Assertion与CAS/SAML服务器通信,确认用户身份。
CAS和SAML是两种广泛使用的集中式认证协议。

优点: 提供标准化的SSO解决方案,易于集成;能够支持多种不同的应用和服务。
缺点: 中心化服务可能成为单点故障;配置和维护较为复杂。

分布式Session:

使用共享的Session存储(如Redis、Memcached),所有应用都可以访问同一个Session存储。
用户在任一应用登录后,Session信息被写入共享存储,其他应用可以通过读取这个共享Session来确定用户状态。

优点: 提高了应用的扩展性和可用性,Session数据可以在集群中共享。
缺点: 增加了对共享存储系统的依赖,存储系统故障会影响整个SSO流程。

轻型目录访问协议(LDAP)

LDAP用于存储和检索网络上的用户和组信息,支持SSO。
应用通过查询LDAP服务器验证用户身份,避免了每个应用单独维护用户信息。

优点: 便于管理和查询用户信息,适用于大型企业环境。
缺点: 配置和维护相对复杂,不适合小型或临时项目。

OAuth 2.0/OIDC

OAuth 2.0是一个授权框架,OpenID Connect(OIDC)建立在OAuth 2.0之上,提供了身份验证功能。
用户在一个授权服务器上登录后,授权服务器向客户端应用颁发令牌,应用使用这些令牌来访问资源服务器或确认用户身份。

优点: 标准化接口,易于第三方应用集成;支持多种授权模式。
缺点: 实现细节较多,需要仔细设计安全措施;可能存在权限过宽的问题。

Kerberos

Kerberos是一种网络认证协议,特别适合企业内部网络环境,支持SSO。
Kerberos使用票证(Ticket)机制来验证用户和服务,用户登录后会收到一系列票证,这些票证可以用于访问网络中的其他服务而无需再次输入密码。

优点: 安全性高,适用于大型企业内部网络;支持多种认证机制。
缺点: 配置复杂,维护成本高;仅限于内部网络,不适用于互联网环境。

相关推荐

  1. 架构面试-场景-登录(SSO)怎么实现

    2024-07-11 21:00:08       24 阅读
  2. sso登录

    2024-07-11 21:00:08       29 阅读
  3. C# OAuth登录实现

    2024-07-11 21:00:08       35 阅读
  4. 登录SSO,Single Sign-On)

    2024-07-11 21:00:08       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 21:00:08       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 21:00:08       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 21:00:08       58 阅读
  4. Python语言-面向对象

    2024-07-11 21:00:08       69 阅读

热门阅读

  1. 深入理解Spring Boot中的事件驱动架构

    2024-07-11 21:00:08       20 阅读
  2. DDD架构面试问题

    2024-07-11 21:00:08       21 阅读
  3. 解析 pdfminer pdfparser.py

    2024-07-11 21:00:08       23 阅读
  4. 解决vue3子组件onMounted中获取不到props的值

    2024-07-11 21:00:08       17 阅读
  5. 关系代数中的八种基本运算

    2024-07-11 21:00:08       22 阅读
  6. Oracle 确认被锁对象

    2024-07-11 21:00:08       19 阅读
  7. 【思考Spring Security框架的相关问题】

    2024-07-11 21:00:08       25 阅读
  8. 在SpringBoot使用AOP防止接口重复提交

    2024-07-11 21:00:08       23 阅读
  9. Spring AOP的几种实现方式

    2024-07-11 21:00:08       19 阅读
  10. pytorch 模型保存到本地之后,如何继续训练

    2024-07-11 21:00:08       23 阅读
  11. 【Spring】springSecurity使用

    2024-07-11 21:00:08       17 阅读