1.1.6 有状态和无状态的HTTP
HTTP作为一种无状态协议,其在请求间并不保留任何跟踪信息。然而,在Web应用程序中,为确保用户能获得持续且一致的体验,Web 服务器有必要记录与客户端的HTTP 会话中的部分信息。例如,当用户登录账户并把若干项目添加至购物车时,Web应用程序需追踪终端用户购物车状态。否则,一旦用户浏览到其他Web页面,购物车将会被清空。
有状态连接使得服务器能够追踪客户端的操作、配置文件、图像、偏好等信息。此类连接采用名为Cookie的小型文本文件在客户端存储数据。Cookie可能保存站点特定设置、安全设置以及身份验证相关信息。与此同时,服务器通常会将数据存储在自身、缓存或后端数据库中。为了维持会话,浏览器会在请求中携带存储的Cookie。然而,在黑客攻击Web应用程序时,攻击者有可能通过窃取或伪造Cookie冒充终端用户。
在保持服务器与客户端有状态连接的过程中,存在一定的扩展限制。这种连接关系仅在创建状态时存在于特定的浏览器与服务器之间。若用户从一台计算机的浏览器切换至移动设备上的浏览器,客户端需要重新进行身份验证,并与服务器重新建立连接。此外,有状态连接要求客户端持续向服务器发送请求。当众多客户端与同一服务器维持状态时,服务器所能处理的计算资源便成为一大挑战。此类问题可通过无状态应用程序解决。
无状态通信不需要管理会话所需的服务器资源。在无状态通信中,服务器不保存会话信息,因此发送的每个无状态请求都必须包含足够的信息,使Web服务器能够判断请求者是否具备访问特定资源的权限。这类无状态请求可包含一个密钥或某种形式的授权标头,以实现与有状态连接相近的体验。与Web应用程序服务器上的会话数据不同,这些连接利用后端数据库来保存相关信息。
在购物车示例中,一种无状态应用程序可以通过修改包含特定令牌的请求所对应的数据库或缓存来追踪用户购物车的内容。虽然终端用户体验并未发生变化,但Web服务器处理请求的方式却有显著差异。由于维持了状态,每个客户端发出的请求所需的信息都可以在不丢失有状态连接中的信息的前提下,实现无状态应用程序的扩展。反之,只要请求中包含所有必要的信息,并且这些信息可以在后端数据库中查找,便可使用任意数量的服务器来处理请求。
在黑客攻击API时,攻击者可能通过窃取或伪造终端用户的令牌来实现冒充。API通信具有无状态特性,这是下一章将详细探讨的主题。