Cookie 的规范介绍
目前有以下几种 Cookie 规范:
- Netscape cookie 草案:是最早的 cookie 规范,基于 rfc2109。尽管这个规范与 rc2109 有较大的差别,但是很多服务器都与之兼容。
- rfc2109, 是 w3c 发布的第一个官方 cookie 规范。理论上讲,所有的服务器在处理 cookie( 版本 1) 时,都要遵循此规范。遗憾的是,这个规范太严格了,以致很多服务器不正确的实施了该规范或仍在使用 Netscape 规范。
- rfc2965 规范定义了 cookie 版本 2,并说明了 cookie 版本 1 的不足。
rfc2965 规范的使用,目前并不多。rfc2109 规范相应要严格得多,在实际应用上,并不是所有的浏览器和 Web 服务器都严格遵守。因此相比较而言,Netscape cookie 草案倒是一个比较简洁和被广泛支持的 Cookie 规范,因此我们在这里以 Netscape cookie 草案为基础进行讨论,对于其他两种规范,我们的讨论和代码具有相同的意义。关于 Netscape cookie 草案的细节,大家可以参照 Netscape 官方站点,这里我们列举一些和我们讨论有关的内容。
根据 Netscape cookie 草案的描述,Cookie 是 Web 服务器向用户的浏览器发送的一段 ASCII 码文本。一旦收到 Cookie,浏览器会把 Cookie 的信息片断以"名 / 值"对 (name-value pairs) 的形式储存保存在本地。这以后,每当向同一个 Web 服务器请求一个新的文档时,Web 浏览器都会发送之站点以前存储在本地的 Cookie。创建 Cookie 的最初目的是想让 Web 服务器能够通过多个 HTTP 请求追踪客户。有些复杂的网络应用需要在不同的网页之间保持一致,它们需要这种会话状态的保持能力。
浏览器与 Web 服务器通过 HTTP 协议进行通讯,而 Cookie 就是保存在 HTTP 协议的请求或者应答头部(在 HTTP 协议中,数据包括两部分,一部分是头部,由一些名值对构成,用来描述要被传输数据的一些信息。一部分是主体 (body),是真正的数据(如 HTML 页面等))进行传送的。
在 HTML 文档被发送之前,Web 服务器通过传送 HTTP 包头中的 Set-Cookie 消息把一个 cookie 发送到用户的浏览器中。下面是一个遵循 Netscape cookie 草案的完整的 Set-Cookie 头:
Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com;
expires= Wednesday, 19-OCT-05 23:12:40 GMT; [secure]
|
Set-Cookie 的每个属性解释如下:
- Customer=huangxp 一个"名称=值"对,把名称 customer 设置为值"huangxp",这个属性在 Cookie 中必须有。
- path=/foo 控制哪些访问能够触发 cookie 的发送。如果没有指定 path,cookie 会在所有对此站点的 HTTP 传送时发送。如果 path=/directory,只有访问 /directory 下面的网页时,cookie 才被发送。在这个例子中,用户在访问目录 /foo 下的内容时,浏览器将发送此 cookie。如果指定了 path,但是 path 与当前访问的 url 不符,则此 cookie 将被忽略。
- domain=.ibm.com 指定 cookie 被发送到哪台计算机上。正常情况下,cookie 只被送回最初向用户发送 cookie 的计算机。在这个例子中,cookie 会被发送到任何在 .ibm.com 域中的主机。如果 domain 被设为空,domain 就被设置为和提供 cookie 的 Web 服务器相同。如果 domain 不为空,并且它的值又和提供 cookie 的 Web 服务器域名不符,这个 Cookie 将被忽略。
- expires= Wednesday, 19-OCT-05 23:12:40 GMT 指定 cookie 失效的时间。如果没有指定失效时间,这个 cookie 就不会被写入计算机的硬盘上,并且只持续到这次会话结束。
- secure 如果 secure 这个词被作为 Set-Cookie 头的一部分,那么 cookie 只能通过安全通道传输(目前即 SSL 通道)。否则,浏览器将忽略此 Cookie。
一旦浏览器接收了 cookie,这个 cookie 和对远端 Web 服务器的连续请求将一起被浏览器发送。例如 前一个 cookie 被存入浏览器并且浏览器试图请求 URL http://www.ibm.com/foo/index.html 时,下面的 HTTP 包头就被发送到远端的 Web 服务器。
GET /foo/index.html HTTP/1.0
Cookie:customer=huangxp
在了解了 Cookie 协议的一些基本内容之后,让我们看看一次典型的网络浏览过程中浏览器如何识别和处理 Cookie:
-
浏览器对于 Web 服务器应答包头中 Cookie 的操作步骤:
1. 从 Web 服务器的应答包头中提取所有的 cookie。
2. 解析这些 cookie 的组成部分(名称,值,路径等等)。
3. 判定主机是否允许设置这些 cookie。允许的话,则把这些 Cookie 存储在本地。 -
浏览器对 Web 服务器请求包头中所有的 Cookie 进行筛选的步骤:
1. 根据请求的 URL 和本地存储 cookie 的属性,判断那些 Cookie 能被发送给 Web 服务器。
2. 对于多个 cookie,判定发送的顺序。
3. 把需要发送的 Cookie 加入到请求 HTTP 包头中一起发送。