摘要

  • 1994 年的 marketplaceMCI 需要在多次网页请求之间保留订单、账单和配送信息。MCI 否决了 Netscape 最初将状态留在服务器上的提议,要求把状态存到客户端。
  • Netscape 把客户需求扩展成通用浏览器功能:服务器发送一个状态值,浏览器在之后符合范围的请求中带回该值。但它本身不能证明操作浏览器的人是谁。
  • 1997 年的 RFC 2109 试图把已经进入代码和兼容实践的机制写成标准。它也明确承认用户控制、值可读和传输不受保护等边界。

购物车让“协议不记事”变成产品问题

Web 常见的请求—响应模式有一个实际缺口:HTTP 请求索取资源并收到响应,下一次请求却不会自动带上应用此前的进度。商家可以把记录留在服务器,但这意味着服务器要管理状态,也要处理浏览器离开后遗留的数据。

MCI 正在建设 marketplaceMCI,一个在线购物环境。计划中的系统包括 MCI 品牌的浏览器、Web 服务器、负责接单和履约的商户服务器,以及用于技术支持和商户账户管理的后台系统。实际难题很具体:如何让订单、账单、配送信息在一连串请求中保持关联。

这项设计决策出现在后来的法院记录里,而非“孤胆发明家”的传奇叙事中。1994 年 8 月 10 日的一次会议上,MCI 拒绝了 Netscape 最初提出的服务器端状态方案,要求把信息存到客户端电脑。法院称双方对这项总体要求没有争议,同时指出部分技术细节仍有分歧。

这一要求改变了应用短期记忆的位置:浏览器要在与服务器的交互之间保存一个小型状态对象。Netscape 程序员 Lou Montulli 负责解决这个问题。他后来回忆,自己在当年夏天受命处理购物车以及 HTTP 无会话状态的问题,但不记得具体客户就是 MCI。Marc Andreessen 作证说,MCI 项目最终促成 Cookie,而 Netscape 又把它扩展为通用机制。这些证词把客户需求与产品决策联系起来,但没有让设计过程的每个细节都变成定论。

浏览器开始携带应用状态

保存下来的 Netscape 规范用很简单的方式描述这个机制:服务器可以在 HTTP 响应中附带一个状态对象。浏览器将它保存下来,在之后 URL 符合 Cookie 范围的请求中再附上。状态值由服务器端应用选择并解释;浏览器负责保存和送回。

这样,购物车引用、注册信息或用户偏好就能跨越多次请求。HTTP 并没有因此变成持续连接协议。网页也不必把每位访问者的购物车都写进页面本身,这对 Web 缓存很重要。服务器仍可能保留数据:它可以把收到的状态值当作索引,在别处查找记录。

这份 Netscape 文档自称“初步规范”,并提醒读者谨慎使用。早期规则划定了主机或域、路径、过期时间与安全传输等边界,决定浏览器在何时返回状态。它们并不能证明访问者的姓名、同意或持续在场。

法院记录称,Netscape 源代码仓库在 1994 年 10 月 3 日或 4 日已有 Cookie 草稿代码,之后 10 月 6 日和 13 日又有修改。诉讼双方对“何时完成实际实现”的精确日期存在争议。稳妥的时间线是:夏季出现客户需求并展开设计,法院所述的仓库证据显示 10 月初已有代码,随后 Cookie 功能被推广为 Netscape 浏览器的一般能力。不存在一个双方都承认的唯一“发明日”。

浏览器提案之后才有标准

1997 年 2 月,David Kristol 与 Montulli 发布 RFC 2109《HTTP 状态管理机制》。它描述 Set-Cookie 响应头与 Cookie 请求头,并尝试规定其语法。文档还特意用一节处理与 Netscape 最初方案的兼容问题。标准化也就成了对已有代码和实际行为的协调。

RFC 2109 清楚写出了机制的限制:用户代理要让用户控制 Cookie 是否发送、是否保留;头部在传输中没有保护,敏感值可能暴露或被篡改。对浏览器而言,Cookie 值是“不透明”的,但文档承认它可能可读。规范的登录示例先让用户通过表单表明身份,服务器随后返回一枚反映该身份的 Cookie。Cookie 延续的是完成身份步骤后的应用状态,它本身不是独立的身份校验。

这一区分很关键。浏览器保存的值可以对服务有用,却无法单独说明由谁持有。如果应用把“拥有这个值”当作权限,它就创建了类似持票凭证的会话能力。获得该值的人可能在有效期和适用范围内重用它。安全性取决于应用如何签发、保护、过期和撤销该值;基础的 Cookie 交换本身不会替应用回答这些问题。

Cookie 的历史没有名字听起来那么神秘。一次购物流程迫使产品团队决定连续性应存在哪里。浏览器成了服务器所选状态的搬运者,一个客户需求变为可重复使用的功能,后来的标准则记录了与已部署实践的兼容性。Web 应用因此能在彼此分开的请求之间记住一笔交易;浏览器却从未因此成为能证明背后人类身份的见证者。

来源与证据边界