这里要基本理解的是HTTP是一个无状态协议,即从客户端到服务器建立一个连接,客户端发出请求,服务器给出响应,之后连接被终止并“被遗忘”。凭借 HTTP 本身,一个请求中的任何内容都不会转移到其他请求。
会话是一种绕过 HTTP 基本限制的方法,一种将不同请求关联起来形成一种涉及许多请求的“对话”的方法。通过使用某种会话,客户端告诉服务器“嘿,我是之前和你说话的那个人”,服务器记住“是的,我记得你,让我们从离开的地方继续”。看起来微不足道,但 HTTP 没有这样做的自然方式。
例如,实现会话的一种非常常见的方式是使用 cookie。在第一次连接时,服务器向客户端发送一个 cookie,然后客户端在所有后续请求中发送相同的 cookie,以便服务器知道谁在说话。登录令牌、本地存储中的数据甚至隐藏的 HTML 字段也是建立会话的可能方式。这样的会话允许网络拥有登录页面并返回登录状态。这也是为什么删除 cookie 会踢出网站,服务器不再知道你是谁。
所以,现在要回答具体问题:
我想知道什么是独特的 HTTP 客户端?
不同客户端的唯一指示是“会话”。服务器只知道告诉他们分开或假设他们是相同的。如果会话标识符相同(例如 cookie),则服务器假定它是返回的客户端。如果没有提供 id,服务器会认为它是一个新客户端。
- 在同一个浏览器中打开一个新选项卡会生成不同的客户端吗?
通常情况下,不,它是同一个。不同的选项卡共享 cookie 和本地存储,因此服务器将看到相同的标识符并将新选项卡链接到第一个选项卡。事实上,服务器对选项卡(甚至浏览器)一无所知,只是查看发送的请求。
例外:私人标签故意将 cookie 与普通标签隔离开来,不会发送它们。这就是为什么您需要在私人标签中再次登录。进入那里将创建第二个不同的会话标识符,服务器会将它们视为单独的。
另一个例外:一些浏览器,本机或通过插件,也将 cookie/本地存储与某些选项卡隔离,正是为了实现多次登录。
- 打开不同的浏览器会产生不同的客户端吗?
是的。浏览器不共享它们的内部状态,服务器不会从另一个浏览器获取会话 ID。除非您手动将 cookie 从一个复制到另一个。
- 服务器定义不同 HTTP 客户端的规则是否适用于所有类型的服务器、客户端计算机和操作系统?
唯一“普遍”的事情是识别客户端的唯一基础是会话的概念,但它们的具体实现可能非常不同。会话 cookie 非常常见,通常由应用程序框架提供,但远非通用。由于 HTTP 本身不定义状态,因此由每个应用程序来定义它。