Cookie
HTTP 状态管理机制(State Management Mechanism)定义了 HTTP 头字段 Cookie 和 Set-Cookie,以及如果通过这两个头字段去实现状态管理。
HTTP 状态管理机制虽然使用了 HTTP 头字段,但并不属于 HTTP 协议范畴。它关注的是,使用 HTTP 协议的通信实体之间如何实现状态管理,所以个人认为它是 HTTP 之上的解决方案。
HTTP 状态管理机制的主逻辑其实比较简单。服务器通过 HTTP 响应头字段 Set-Cookie 把状态信息传送给用户代理(User agent,比如浏览器),用户代理把状态信息存起来,下次发送请求的时候自动把合法的状态信息通过请求头字段 Cookie 传送给服务器。由于 Unix 系统中有个类似功能的东西叫做 Magic cookie,发明这套机制的人就把这些状态信息叫做 Cookie。除了使用 HTTP 头字段,用户代理也会提供 non-HTTP 接口(比如 HTML 的 document.cookie)和 Cookie 管理界面来读写 Cookie
// HTTP 头示例
// Server -> User Agent
Set-Cookie: STATE=31d4d96e407aad42
// User Agent -> Server
Cookie: STATE=31d4d96e407aad42
在 HTTP 头字段 Set-Cookie 中,除了可以设置 Cookie 的名称和值外,还可以设置 Cookie 属性,
比如 Expires、Max-Age、Domain、Path、Secure 和 HttpOnly。这些属性用来控制用户代理对 Cookie 的存储和访问行为。这些属性都会被用户代理保存起来。除此之外,用户代理还会保存 creation-time、last-access-time 等信息。
HTTP 头字段 Cookie 则不包含这些属性,只有键和值,因为这些属性对服务器没有意义,不需要传送给服务器。
cookie 更新
一个小问题是,如何自动删除一个已有的 Cookie 呢?把 Cookie 的 Expires 设置成一个过去的时间,该 Cookie 就会被用户代理删除。
cookie 的删除其实特别简单,也是对此 cookie 重新赋值,将 expries 设为一个过去的时间或将 max-age 设为 0,都可以删除 cookie。同时也要特别注意此 cookie 的 domain、path 要与原来保持一致。
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
document.cookie = "username=; max-age=0";
用户代理对 Cookie 的存储有容量限制,规范在这方面的要求是:
- 每个 Cookie 最小 4 KB 大小(包括 Cookie 的名称、值和属性)
- 每个域最少 50 个 Cookie