Cookie 概述
HTTP 协议本质上是无状态的,这意味着服务器无法天然识别请求来源。用户每次访问站点时,服务端都像是在面对一个陌生人,既不知道他是谁,也无法判断这是否是他之前的访问记录。早期曾尝试过 IP 跟踪或 URL 嵌入等方式,但都未能从根本上解决问题。
Cookie 机制的出现,恰好填补了这一空白。当浏览器首次访问 Web 站点时,服务端会通过 Set-Cookie 响应头返回一组键值对(Key/Value)。浏览器收到后将其存储,并在后续符合规则的请求中自动携带这些信息回传给服务端。这样,服务端就能通过读取这些键值信息来识别当前用户身份。
Cookie 分类
根据生命周期不同,Cookie 主要分为两类:
- 会话 Cookie:临时存在,未设置有效期。一旦用户关闭浏览器,数据即刻被清除。
- 持久 Cookie:设置了明确的过期时间(Expires)或最大年龄(Max-Age)。即使关闭浏览器或重启机器,数据仍保留在硬盘上,直到过期或被手动删除。
Cookie 规范演进
目前主要涉及两个版本的规范:Cookie 版本 0 和 Cookie 版本 1。版本 1 是对版本 0 的扩展,虽然两者具备互操作性,但版本 0 在实际应用中更为广泛。
版本 0 属性
版本 0 定义了基础的 Set-Cookie 响应头和 Cookie 请求头。
Set-Cookie 响应头 服务端用于下发 Cookie 信息,基本语法如下:
Set-Cookie: key=value;expires=date;domain=domain;path=path;secure
key/value:服务端用于跟踪和识别用户的键值对。expires:指定过期日期。若未指定,Cookie 将在浏览器会话结束时失效。domain:限制 Cookie 可发送的域名。默认值为生成 Cookie 的服务器主机名。浏览器会根据此字段将 Cookie 路由到对应域名。path:限定 Cookie 生效的请求路径。默认为生成 Cookie 的 URL 路径。secure:仅在使用 SSL/TLS 安全连接时才发送 Cookie。若不设置则无传输限制。
示例:
Set-Cookie: member_id=1496800101;expires=Tuesday 16-Aug-01 22:10:11 GMT;domain="abc.com";path=/member;secure
Cookie 请求头 浏览器向服务端发起请求时携带已存储的 Cookie:
Cookie: key1=value1;key2=value2;key3=value3...
示例:
Cookie: member_id=1496800101
版本 1 属性
版本 1 引入了 Set-Cookie2 和 Cookie2 首部,增加了更多控制选项:
- 支持解释性文本(Comment),说明 Cookie 用途。
- 允许在浏览器退出时忽略过期时间直接销毁(Discard)。
- 使用相对秒数(Max-Age)设置生存周期。
- 增加端口限制(Port),结合 domain 和 path 共同控制生效范围。
- 请求头中会回传 domain、path 和 port 等附加信息。
- 引入版本号以实现互操作。
- 使用
$前缀标识服务端返回的属性。
Set-Cookie2 响应头语法:
Set-Cookie2: key=value;Version="1";Comment=Comment;CommentURL=CommentURL;Discard;Max-Age=age;domain=domain;path=path;Port=Port;secure


