Cookie 是 Web 服务器向用户的浏览器发送的一段 ASCII 码文本。一旦收到 Cookie,浏览器会把 Cookie 的信息片断以"名 / 值"对 (name-value pairs) 的形式储存保存在本地。这以后,每当向同一个 Web 服务器请求一个新的文档时,Web 浏览器都会发送之站点以前存储在本地的 Cookie。浏览器与 Web 服务器通过 HTTP 协议进行通讯,而 Cookie 就是保存在 HTTP 协议的请求或者应答头部(在 HTTP 协议中,数据包括两部分,一部分是头部,由一些名值对构成,用来描述要被传输数据的一些信息。一部分是主体 (body),是真正的数据(如HTML 页面等))进行传送的。
在 HTML 文档被发送之前,Web 服务器通过传送 HTTP 包头中的 Set-Cookie 消息把一个 cookie 发送到用户的浏览器中。例如:
Set-Cookie:customer=zyr;path=/foo; domain=.163.com;
expires= Wednesday, 19-OCT-0523:12:40 GMT; [secure]
Set-Cookie 的每个属性解释如下:
- Customer=zyr 一个"名称=值"对,把名称 customer 设置为值"zyr",这个属性在 Cookie 中必须有。
- path=/foo 控制哪些访问能够触发 cookie 的发送。如果没有指定 path,cookie 会在所有对此站点的 HTTP 传送时发送。如果 path=/directory,只有访问 /directory 下面的网页时,cookie 才被发送。在这个例子中,用户在访问目录 /foo 下的内容时,浏览器将发送此 cookie。如果指定了 path,但是 path 与当前访问的 url 不符,则此 cookie 将被忽略。
- domain=.163.com 指定 cookie 被发送到哪台计算机上。正常情况下,cookie 只被送回最初向用户发送 cookie 的计算机。在这个例子中,cookie 会被发送到任何在 .163.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.163.com/foo/index.html时,下面的 HTTP 包头就被发送到远端的 Web 服务器。
GET/foo/index.html HTTP/1.0
Cookie:customer=zyr
一次典型的网络浏览过程
在了解了cookie协议的一些基本内容之后,我们来看一次典型的网络浏览过程中浏览器如何识别和处理 Cookie:
- 浏览器对于 Web 服务器应答包头中 Cookie 的操作步骤:
1. 从 Web 服务器的应答包头中提取所有的 cookie。
2. 解析这些 cookie 的组成部分(名称,值,路径等等)。
3. 判定主机是否允许设置这些 cookie。允许的话,则把这些 Cookie 存储在本地。 - 浏览器对 Web 服务器请求包头中所有的 Cookie 进行筛选的步骤:
1. 根据请求的 URL 和本地存储 cookie 的属性,判断那些 Cookie 能被发送给 Web 服务器。
2. 对于多个 cookie,判定发送的顺序。
3. 把需要发送的 Cookie 加入到请求 HTTP 包头中一起发送。
例如,如下所示是901项目nginx中userid的配置(User ID模块可发布cookie),
指令userid 表示是否启用发出cookie;userid_name 设置cookie的名称;userid_domain 指定cookie的域名;userid_path 设置cookie路径;userid_expires 设置cookier 过期时间。
上述配置表示,如果名叫usertrack的cookie在本地主机存下后(365天后过期),那么客户端浏览器只要访问study.163.com,就会在HTTP请求头里面包含usertarck的cookie并发送给服务器。当然你也可以设置userid_path,比如userid_path /res;那么只有在访问study.163.com/res才会发送cookie。
最后说一下,使用cookie的注意事项:
1、当前设置的cookie不是立即生效的,而是要等到下一个页面时才能看到。这是由于在设置的这个页面里cookie由服务器传递给客户端浏览器,在下一个页面浏览器才能把cookie从客户的机器里取出传回服务器的原因。
2、cookie限制是在客户端的。一个浏览器能同时存储的Cookie数量最多为300个,并且每个不能超过4KB(但我通过浏览器控制台看到有些cookie超过这些值,不解),每个WEB站点能设置的Cookie总数不能超过20个。
3、不同浏览器对cookie的处理机制不一样。