首页 > 代码库 > Cookies

Cookies

cookie分为会话cookie和持久cookie。
会话cookie:临时cookie,记录了用户访问站点时的设置和偏好,用户退出浏览器时,会话cookie就被删除。持久cookie:存储在硬盘上,浏览器退出,计算机重启时它们任然存在。

会话cookie和持久cookie的唯一区别就是它们的过期时间。

cookie的工作原理

用户首次访问Web站点时,Web服务器会给用户指定一个独有的cookie,这样当用户再次访问该站点时就可以识别出这个用户了。
客户端发起请求:
GET /index.html HTTP/1.0
Host: www.joes-hardware.com
服务器响应,并带上cookie信息:
HTTP/1.0 200 OK
Set-cookie: id="34294";domain="joes-hardware.com"
Content-type: text/html
Content-length: 1903
...
浏览器会记住从服务器返回的Set-cookie或Set-cookie2首部中的cookie内容,并将cookie集存储在浏览器的cookie数据库中。当客户端再次访问同一站点时,浏览器会挑中那个服务器贴到用户上的cookie,并在一个cookie请求首部中将其传回去:
GET /index.html HTTP/1.0
Host: www.joes-hardware.com
Cookie: id="34294"

浏览器的cookie

浏览器要负责存储cookie信息,并在每次访问服务器时将这些信息提供给它,不同的浏览器以不同的方式来存储cookie。
下面以Internet Explorer的cookie为例。
IE的Cookie可以通过下面的方式查看到:在IE图标点击右键,打开右键菜单,打开属性对话框,打开“常规->浏览历史记录->设置”,点击“Intenet临时文件->查看文件”,就可以打开cookie存储的目录,该目录下以“cookie:”开头的文件就是IE保存的cookie文件。
每个文件中包含了多个cookie信息,每个cookie的格式如下:
__utma
81379588.14306528498.1377831180.1418116396.1418271853.95
book.douban.com/
160
395949120
30560825
4211534380
30414064
第一行是cookie的变量名,下一行是变量的值,第三行是域和路径,剩下的行就是一些特有的数据。

站点和cookie关联

cookie中提供了属性用于将cookie匹配到不同的站点,包括域属性和路径属性。

域属性

域属性(Domain)用于控制哪些站点可以看到那个cookie,在HTTP的响应首部Set-cookie中指定:
Set-cookie: user="mary17"; domain="airtravelbargains.com"
这里的domain属性是告诉浏览器将cookie: user="mary17"发送给域".airtravelbargains.com"中的所有站点。

路径属性

路径属性允许用户将cookie与部分Web站点关联起来。
Set-cookie: pref=compact; domain="airtravelbargains.com";path=/autos/
这样浏览器只有访问域".airtravelbargains.com"中的站点,并且访问的路径中包含/autos/时才会将cookie: pref=compact;发送过去。

cookie首部

cookie规范目前有两个版本,版本0和版本1,版本1是对版本0的扩展,版本0使用的更广。

cookie版本0

服务端响应的Set-cookie一般看起来如下:
Set-cookie: name=vaule[; expires=date][; path=path][; domain=domain][; secure]
下面看每个属性的含义。
属性:NAME=VALUE
是否强制:是
描述:NAME和VALUE都是字符序列,Web服务器可以创建任意的NAME=VALUE关联,在后继对站点的访问中会将其送回给Web服务器


属性:Expires
是否强制:否
描述:cookie的有效日期,如果没有指定Expires,cookie就会在用户会话结束时过期


属性:Domain
是否强制:否
描述:见“站点和cookie关联”


属性:Path
是否强制:否
描述:见“站点和cookie关联”


属性:Secure
是否强制:否
描述:如果包含这一属性,就只有在HTTP使用SSL安全连接时才会发送cookie


客户端发送请求时,会将所有与域、路径和安全过滤器相匹配的未过期cookie都发送给这个站点:
Cookie: session-id=002-1145265-8016838; session-id-time=1007884800

cookie版本1

cookie版本1(RFC 2965)引入了Set-cookie2首部和Cookie2首部。Set-cookie2首部的属性包括:


属性:NAME=VALUE
是否强制:是
描述:NAME和VALUE都是字符序列,Web服务器可以创建任意的NAME=VALUE关联,在后继对站点的访问中会将其送回给Web服务器


属性:Version
是否强制:是
描述:值为1,表示cookie规范的版本


属性:Comment
是否强制:否
描述:用于说明服务器准备如何使用这个cookie,这个值必须采用UTF-8编码


属性:CommentURL
是否强制:否
描述:提供一个URL指针,指向详细描述了cookie的目地及策略的文档


属性:Discard
是否强制:否
描述:如果提供该属性,在客户端程序终止时将放弃这个cookie


属性:Domain
是否强制:否
描述:见“站点和cookie关联”


属性:Max-age
是否强制:否
描述:整数,设置以秒为单位的cookie生存期,当cookie的试用期超过了Max-age时,客户端就应该将这个cookie丢弃,如果Max-age值为0,则应该立即将这个cookie丢弃


属性:Path
是否强制:否
描述:见“站点和cookie关联”


属性:Port
是否强制:否
描述:一个或者多个端口,由逗号分隔(Port="80,81,8080"),表示只能向端口与端口列表中的端口相匹配的服务器提供cookie,如果值为空,则只能向当前响应服务器的端口号提供cookie


属性:Secure
是否强制:否
描述:如果包含这一属性,就只有在HTTP使用SSL安全连接时才会发送cookie


版本1的客户端会带回与传送的每个cookie相关的附加信息。客户端发起请求时,可以以Cookie2首部告知服务器自己所支持的cookie标准版本:
Cookie2: $Version="1"
如果服务器能够识别出Cookie2首部,就会在响应首部中发送Set-cookie2(而不是Set-cookie)。

Cookies