理解基于会话的认证

超文本传输协议 (HTTP) 是无状态的。因此,所有的 HTTP 请求都是无状态的。这意味着它不记得任何事情或任何我们已经验证过的用户,我们的应用程序也不知道是否是与之前请求的同一个人。因此,我们必须在下一个请求中再次进行身份验证。这并不理想。

因此,引入了基于会话和基于 Cookie 的身份验证(通常仅称为基于会话的身份验证),以便在 HTTP 请求之间存储用户数据,从而消除 HTTP 请求的无状态特性。它们使身份验证过程 “有状态”。这意味着经过身份验证的记录或会话存储在服务器端和客户端。服务器可以将活动会话保存在数据库或服务器内存中,因此称为基于会话的身份验证。客户端可以创建一个 Cookie 来保存会话标识符(会话 ID),因此称为基于 Cookie 的身份验证。

但是,会话和 Cookie 到底是什么呢?让我们在接下来的章节中深入了解它们。

会话是在两个或多个通信设备之间,或在计算机和用户之间交换的一段临时信息。它在特定时间建立,然后在未来的某个时间过期。当用户关闭浏览器或离开网站时,它也会过期。当建立会话时,服务器会在临时目录(或数据库或服务器内存中)中创建一个文件来存储注册的会话值。在访问期间,这些数据在整个网站中都可用,并且浏览器会收到一个会话 ID,该 ID 将通过 CookieGET 变量发送回服务器进行验证。

简而言之,Cookie 和会话只是数据。Cookie 仅存储在客户端计算机上,而会话则存储在客户端和服务器上。会话被认为比 Cookie 更安全,因为数据可以完全保存在服务器上。Cookie 通常在建立会话时创建并保存在客户端计算机上。它们可以是经过身份验证的用户的姓名、年龄或 ID,并且浏览器会将它们发送回服务器以识别用户。让我们在下一节通过一个示例流程来看看它们是如何工作的。

会话认证流程

基于会话和基于 Cookie 的身份验证可以通过以下示例身份验证流程来理解:

  1. 用户从其浏览器上的客户端应用向服务器发送其凭据,例如用户名和密码。

  2. 服务器检查凭据,并向客户端发送一个唯一的令牌(会话 ID)。此外,该令牌将保存在服务器端的数据库或内存中。

  3. 客户端应用将令牌存储在客户端的 Cookie 中,并在每个 HTTP 请求中使用它发送回服务器。

  4. 服务器接收到令牌并验证用户,然后将请求的数据返回给客户端应用。

  5. 当用户注销时,客户端应用会销毁令牌。在注销之前,客户端还可以向服务器发送请求以删除会话,或者会话将根据设置的过期时间自行结束。

在基于会话的身份验证中,服务器承担了所有繁重的工作。它是有状态的。它将会话标识符与用户帐户关联(例如,在数据库中)。基于会话的身份验证的缺点是在大量用户同时使用系统时,其可伸缩性较差,因为会话存储在服务器的内存中,因此涉及大量的内存使用。此外,Cookie 在单个域或子域上运行良好,但通常在跨域共享(跨域资源共享)中被浏览器禁用。因此,当客户端发出由不同域提供的 API 请求时,这会导致问题。但是,这个问题可以通过基于令牌的身份验证来克服,我们将在下一节中介绍。