HTTP 的 Cookie 字段是由 RFC 6265 规定的。浏览器访问某个网站时,通过 HTTP 头部的 Set-Cookie 字段,服务器可以在浏览器中设置一个 cookie:
Set-Cookie: name=value
然后,浏览器下次访问该网站时的每个页面的时候,将会通过如下方式将前面的 cookie传回给服务器:
Cookie: name=value
当然,我们也可以设置多个 cookie,此时只需要将它们用分号隔开,例如:
Set-Cookie: name1=value1; name2=value2
在 Set-Cookie 字段中,还有其它的选项可以使用,包括这些(选项名不区分大小写):
- Path:设置该 cookie 对哪些路径下的页面生效。例如设置 Path=/auth 表示浏览器访问 /auth 路径下的页面时才发送该 cookie。
- Domain:设置该 cookie 对哪些域名生效。例如在 abc.example.com 里设置 Domain=example.com 表示访问 example.com 及其所有子域名时都发送该 cookie。
- Expires:设置该 cookie 的过期时间。例如设置 Expires=Sun, 09 Jun 2013 15:58:05 GMT 表示在该时间之后删除该 cookie。
- Max-Age:用 Expires 设置过期时间比较麻烦,因此 RFC 的规范中后来增加了 Max-Age 选项。例如设置 Max-Age=3600 表示在 1 小时后删除该 cookie。但是这个选项 IE 不支持(即使是 IE9)。
- HttpOnly:设置这个选项表示禁止通过 JavaScript 访问该 cookie。
- Secure:设置这个选项表示仅在 HTTPS 连接时才发送该 cookie。
例如:一个包含多个选项的 Set-Cookie 例子如下:
Set-Cookie:token=eae41f6e; Path=/auth; Domain=example.com; Expires=Mon, 10 Jun 2013 01:50:58 GMT; Max-Age: 3600; HttpOnly; Secure
如果要修改 cookie,可以再次使用 Set-Cookie 字段,但需要保证 cookie 的名称,Path,Domain 和 Secure 选项相同。 例如:
Set-Cookie:token=737cfe5b; Path=/auth; Domain=example.com; Secure
此时,我们将前面 cookie 中的 token 的值改为了 737cfe5b。如果要删除 cookie,可以将 Expires 设置为过去的时间,例如:
Set-Cookie:token=737cfe5b; Path=/auth; Domain=example.com; Expires=Sat, 02 May 2009 23:38:25 GMT; Secure
在 JavaScript 中,利用 document.cookie,我们可以设置和删除 cookie。
通过 Cookie,服务器可以区分判别用户是否之前已经访问过该网站,也经常用于实现 HTTP 的用户会话。
参考资料:
[1] RFC 6265 - HTTP State Management Mechanism
[2] HTTP cookie - Wikipedia, the free encyclopedia
[3] HTTP cookies - Web Development | MDN
[4] Yummy cookies across domains - GitHub Blog
[5] HTTP cookies explained | NCZOnline
[6] Cookies and security | NCZOnline
[7] HTTP Cookies: What's the difference between Max-age and Expires?
[8] Internet Explorer Cookie Internals (FAQ) - MSDN Blogs
[9] document.cookie - Web API reference | MDN
[A] Quirksmode - JavaScript - Cookies