大家好,我是雷布斯。
在平时的面试中,对于工作年限不长的同学,我比较喜欢问:“说说你们系统中是怎么维护登录态的?”,“还有其他的方式实现登录吗?”等问题,主要考察大家对登录常用技术方案的了解。
登录鉴权是互联网信息交互中常见的话题,我们会分两篇文章,介绍几种常用的登录方案:
今天先来介绍 Cookie + Session 登录
、Token 登录
以及SSO 单点登录
。
大家都知道,HTTP 是一种无状态的协议。
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求返回数据,但不会记录任何信息。
为了解决 HTTP 无状态的问题,出现了 Cookie。
Cookie 是服务器端发送给客户端的一段特殊信息,这些信息以文本的方式存放在客户端,客户端每次向服务器端发送请求时都会带上这些特殊信息。
在 B/S 系统中,登录功能通常都是基于 Cookie
来实现的。当用户登录成功后,服务端会将登录状态记录到 Session
中,同时需要在客户端保存一些信息(SessionId
),并要求客户端在之后的每次请求中携带它们。
在这样的场景下,使用 Cookie
无疑是最方便的,因此我们一般都会将 SessionId
保存到 Cookie
中,当服务端收到请求后,通过验证 Cookie
中的 SessionId
来判断用户的登录信息。
Cookie
+ Session
的登录方式是目前最经典的一种登录方式,现在仍然有大量的场景在使用。
具体可以采用以下步骤:
Session
。Session
是一种服务器端保存用户会话信息的机制,用于识别多次请求之间的逻辑关系。Session ID
(通常是一个随机的字符串)返回给前端,并通过 Cookie 的方式将Session ID
保存在浏览器中。这样就可以保证当用户再次发送请求时,后端可以通过该 Session ID
来识别用户身份,并完成相关的操作。Cookie
信息发送到后端进行验证,如果 Session ID
有效,则返回相应的数据。如果 Session ID
失效或者不存在,则需要重新登录获取新的 Session ID
。Session
信息,以保证安全性。需要注意的是,Cookie
和 Session
方案也存在一些安全问题。例如,如果攻击者可以获取到 Cookie 信息,则可以模拟用户身份进行恶意操作。因此,在实现时需要考虑添加一些安全措施,如:
HttpOnly
属性为 true,以防止脚本获取到 Cookie 信息。当然,它也存在一些缺点:
Session ID
存储在 Cookie
中,如果攻击者获取到该 Cookie
信息,则可以模拟用户身份进行恶意操作。为了解决这个问题,需要采取一些安全措施,如使用 HTTPS
协议加密通信内容、设置 Cookie
的 HttpOnly
属性为 true
等。Cookie
只能在同域名下共享,因此跨域访问时无法访问到对应的 Cookie
信息。这时,可能需要采用一些其他的跨域解决方案,如 JSONP、CORS
等。Session
信息存储在服务器端,当系统扩展到多台服务器时,需要采用一些集中式的 Session
管理方案,否则会出现 Session
不一致或者丢失等问题。Session
信息存储在服务器端,因此每次请求都需要从服务器读取 Session
信息,这可能会导致性能问题。为了解决这个问题,可以采用一些缓存方案来提高访问速度。Cookie
和 Session
机制,这会导致无法正常登录。为了解决 Cookie
+ Session
机制暴露出的诸多问题,我们可以使用 Token
的登录方式。
Token 是通过服务端生成的一串字符串,以作为客户端请求的一个令牌。当第一次登录后,服务器会生成一个 Token 并返回给客户端,客户端后续访问时,只需带上这个 Token 即可完成身份认证。
Token 登录方案是一种常用的前后端分离技术,具体流程如下:
LocalStorage
或者SessionStorage
中。需要注意的是,由于 Token 信息存储在客户端,因此不同于 Session 机制,它可以轻松地跨域使用,而且不需要考虑 Session 共享、分布式管理等问题。同时,由于 Token 机制不依赖服务器端的资源,因此在大规模高并发访问时,它具有更好的性能表现。
然而,由于 Token 信息存储在客户端,因此存在一定的安全风险,例如 Token 被盗用、被篡改等问题。为了保证安全性,需要采取一些安全措施,如:
Token 的生成方式通常有以下几种:
无论采用哪种方式生成 Token,都需要结合实际业务场景和安全需求来选择,并且需要对 Token 进行加密或者数字签名等操作来保障其安全性。同时,在 Token 的过期时间、密钥管理、Token 注销等方面都需要考虑相应的安全措施。
SSO(Single Sign-On,单点登录)是一种在多个应用程序(比如 Web 服务)中实现认证和授权的方法。它允许用户只需登录一次,就可以访问多个应用程序,大大提高了用户体验和工作效率。
该实现方式将 Token 存储在 Cookie 中,并通过浏览器的同源策略来共享 Token 信息。由于 Cookie 只能在同域名下共享,因此该方式仅适用于同域名下的应用程序。
该实现方式将 Token 信息存储在服务器端的 Session 中,并通过 Session ID 来共享 Token 信息。由于 Session 机制通常需要依赖某种中心化的 Session 管理系统,因此实现较为复杂。
认证中心就是一个专门负责处理登录请求的独立的 Web 服务。用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token
写入 Cookie
。(注意这个 Cookie
是认证中心的,应用系统是访问不到的)。
应用系统检查当前请求有没有 Token
,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心进行登录。由于这个操作会将认证中心的 Cookie
自动带过去,因此,认证中心能够根据 Cookie
知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL ,并在跳转前生成一个 Token
,拼接在目标 URL 的后面,回传给目标应用系统。
应用系统拿到 Token
之后,还需要向认证中心确认下 Token
的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token
写入 Cookie
,然后给本次访问放行。(这个 Cookie
是当前应用系统的,其他应用系统是访问不到的)当用户再次访问当前应用系统时,就会自动带上这个 Token
,应用系统验证 Token
发现用户已登录,于是就不会有认证中心什么事了。
此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。
该实现方式采用 OAuth 协议来实现用户身份验证和授权。OAuth 是一个开放标准,用于在不同域名下的应用程序之间安全地共享资源和授权访问。该实现方式具有良好的兼容性和可扩展性,但需要额外的授权服务器和令牌管理机制。
该实现方式是在 OAuth2.0 协议上构建的一个开放标准,用于实现用户身份验证和授权。它继承了 OAuth 的优点,并提供了更丰富的身份认证和授权机制。该实现方式具有较高的兼容性和安全性,但需要额外的授权服务器和令牌管理机制。
Cookie + Session
、Token
、SSO单点登录
是常见的身份认证和授权方案,它们各有特点:
需要注意的是,根据具体业务需求和安全要求,可以选择不同的身份认证和授权方案,并在实现时结合一些安全措施来保障用户信息的安全性。同时,在使用 Token 和 SSO 单点登录方案时,还需要对 Token 和认证中心进行管理和维护,以保证其正常运行和可靠性。
给大家留一个思考题:PC 端的扫码登录,是如何实现的呢?
另外,还给“前端面试题宝典”的辅导服务打下广告,目前有面试全流程辅导、简历指导、模拟面试、零基础辅导和付费咨询等增值服务,感兴趣的伙伴可以联系小助手(微信号:interview-fe)了解详情哦~