单点登录,英文名 Single Sign-On,简称SSO。它是一种身份验证过程,允许用户通过一次登录过程访问多个相互信任的应用系统或服务。
一、主要作用
核心的作用有三点:
1、提升用户体验:用户无需在每个需要访问的系统或服务中分别进行登录操作。通过单点登录,用户只需在首次登录时进行身份验证,之后就可以无缝访问所有已集成的系统,大大提高了用户的使用便利性和满意度。
2、提高管理效率:对于IT管理员而言,单点登录简化了用户账户和权限的管理。他们可以在一个集中点管理用户的身份信息和访问权限,而无需在每个单独的应用系统中进行配置。 同时,SSO也便于跟踪和审计用户的访问行为,确保合规性。
3、促进系统整合:在企业信息化过程中,随着各种应用系统的不断增加,系统间的整合成为了一个重要的问题。单点登录为系统整合提供了一种有效的身份验证机制,使得不同系统之间的用户认证和数据共享变得更加容易。
现在大部分的互联网企业生态系统都应用了单点登录技术。典型的比如阿里巴巴,阿里旗下的多个网站和应用,如淘宝、天猫、支付宝等。用户只需在其中一个应用上登录,便可在其他应用中自动登录。
二、实现方式
单点登录的实现方式主要有以下几种:
1、基于Cookie+Session的方式
原理:用户登录后,服务器在用户浏览器中创建一个Cookie,用于存储Session ID。当用户访问其他应用时,这些应用通过Session ID与认证服务器进行通信,以验证用户的登录状态。
优点:实现简单,适用于单个服务器或小规模集群环境。
缺点:在分布式系统中,Session同步可能成为一个问题,且Cookie存在被篡改的风险。
2、基于Token的方式
原理:用户登录后,服务器生成一个Token(通常是一个加密的字符串),并将其返回给用户。用户在后续请求中携带这个Token,服务器通过验证Token的有效性来确认用户的登录状态。
优点:Token具有无状态性,便于在分布式系统中使用,且Token可以存储在客户端,减少服务器的存储压力。
缺点:Token的存储和传输需要保证安全性,防止被窃取或篡改。
3、基于JWT(Json Web Token)的方式(具有无状态性和灵活性,最常用!)
原理:
JWT是一种基于JSON的开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),通过"."(点)分隔并编码后形成一个紧凑的URL安全字符串。
头部(Header):包含令牌的元数据,如令牌的类型(通常是JWT)和使用的签名算法(如HMAC SHA256、RSA等)。头部通常是一个JSON对象,经过Base64编码后形成JWT的第一部分。
载荷(Payload):包含声明(Claims),这些声明是关于实体(通常是用户)和其他数据的声明。JWT规范中定义了一些标准字段,如iss(发行者)、exp(过期时间)、sub(主题)等,同时也支持自定义私有字段。载荷部分也是一个JSON对象,经过Base64编码后形成JWT的第二部分。
签名(Signature):是对头部和载荷的签名,用于验证令牌的真实性和完整性。签名需要使用一个密钥(secret)和头部中指定的签名算法来完成。签名完成后,经过Base64编码形成JWT的第三部分。
用户登录后,服务器验证用户身份,生成一个JWT并将其返回给用户。用户在后续请求中携带JWT,服务器通过解析JWT来验证用户的登录状态,无需在服务器端存储Session信息。
优点:
无状态性:JWT自包含用户信息,服务器无需保存会话信息,从而实现了无状态认证。这使得JWT非常适合于分布式系统和微服务架构,因为每个服务都可以独立地验证JWT,而无需共享会话状态。
灵活性:JWT可以包含自定义的声明信息,支持多种用途,如身份验证、信息交换等。同时,JWT的签名机制确保了信息的真实性和完整性,防止了数据篡改。
可扩展性:JWT的紧凑性和自包含性使得它易于在多种平台和语言之间传递和验证。这有助于不同系统之间的集成和交互,提高了系统的可扩展性。
安全性:JWT使用数字签名或加密算法保证令牌的真实性和完整性,避免了传统cookie中cookie劫持和CSRF攻击的问题。
缺点:
令牌有效期管理:JWT一旦签发,在有效期内就会一直有效,除非服务器部署了额外的注销机制。这可能导致安全风险,如令牌被盗用。因此,需要合理设置令牌的有效期,并在必要时提供注销机制。
令牌大小和传输开销:如果JWT中包含了大量信息或使用了复杂的签名算法(如RSA),那么生成的令牌可能会比较大,增加网络传输的负担。
密钥管理:JWT的签名机制依赖于密钥的安全性。如果密钥被泄露,攻击者可以篡改JWT。因此,需要对密钥进行严格的保护和管理。
不支持撤销:JWT本身不支持令牌撤销机制。一旦令牌被签发并分发到客户端,服务器就无法单方面撤销该令牌(除非设置较短的过期时间)。这可能导致在令牌被盗用或用户权限变更时,无法及时阻止令牌的使用。
核心逻辑图:
4、基于分布式Session的方式
原理:在分布式系统中,使用分布式缓存(如Redis)来存储Session信息。用户登录后,服务器将Session信息存储在分布式缓存中,并生成一个Session ID存储在用户的Cookie中。用户在访问其他应用时,这些应用通过Session ID从分布式缓存中获取Session信息来验证用户的登录状态。
优点:解决了分布式系统中Session同步的问题,且分布式缓存具有较高的可用性和可扩展性。
缺点:分布式缓存的引入增加了系统的复杂性和成本,且需要保证分布式缓存的安全性和稳定性。