Cookie 是服务器保存在浏览器的一小段文本信息,每个 Cookie 的大小一般不能超过4k。浏览器每次向服务器发起请求,就会自动附上这段信息。
Cookie 主要用来分辨两个请求是否来自同一个浏览器,以及用来保存一些状态信息。他的常用场合有以下:
- 对话(session)管理:保存登陆、购物车等需要记录的信息
- 个性化:保存用户的偏好,比如网页的字体大小、背景色等到
- 追踪:记录和分析用户行为
Cookie 包含以下信息:
- Cookie 的名字
- Cookie 的值(真正的数据写在这里面)
- 到期时间
- 所属域名(默认是当前域名)
- 生效的路径(默认是当前网址)
浏览器可以设置不接受 Cookie,也可以设置不向服务器发送 Cookie。window.navigator.cookieEnabled
属性返回一个布尔值,表示浏览器是狗打开 Cookie 功能。
// 浏览器是否打开 Cookie 功能
window.navigator.cookieEnabled // true
document.cookie
返回当前网页的Cookie
一、Cookie 和 HTTP 协议
Cookie 由 HTTP 协议生成,业主要提供 HTTP 协议使用
HTTP 回应:Cookie 的生成
服务器如果希望在浏览器保存 Cookie,就要在 HTTP 回应的头部信息里面,放置一个 Set-Cookie
字段。
Set-Cookie:foo = bar
如果服务器想改变一个早先设置的 Cookie,必须同时满足四个条件:Cookie 的key
,domain
,path
,secure
都匹配。
Http 请求:Cookie的发送
浏览器向服务器发送 HTTP 请求时,每个请求都会带上相应的 Cookie。也就是说,把服务器早前保存在浏览器的这段信息,再发回服务器。这时要使用 HTTP 头信息的Cookie字段。
服务器收到浏览器发来的 Cookie 时,有两点是无法知道的。
-
Cookie 的各种属性,比如何时过期。
-
哪个域名设置的 Cookie,到底是一级域名设的,还是某一个二级域名设的。
二、Cookie的属性
Expires, Max-Age
Expires
属性指定一个具体的到期时间,到了指定时间以后,浏览器就不再保留这个 Cookie。他的值是 UTC 格式,可以使用 Date.prototype.toUTCString()
进行格式转换。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
如果不设置该属性,或者设为null,Cookie 只在当前会话(session)有效,浏览器窗口一旦关闭,当前 Session 结束,该 Cookie 就会被删除。另外,浏览器根据本地时间,决定 Cookie 是否过期,由于本地时间是不精确的,所以没有办法保证 Cookie 一定会在服务器指定的时间过期。
Max-Age
属性指定从现在开始 Cookie 存在的秒数,比如60 * 60 * 24 * 365
(即一年)。过了这个时间以后,浏览器就不再保留这个 Cookie。
如果同时指定了Expires
和Max-Age
,那么Max-Age的值将优先生效。
Domain,Path
Domain
属性指定浏览器发出 HTTP 请求时,哪些域名要附带这个 Cookie。
Path
属性指定浏览器发出 HTTP 请求时,哪些路径要附带这个 Cookie。
Secure, HttpOnly
Secure
属性指定浏览器只有在加密协议 HTTPS 下,才能将这个 Cookie 发送到服务器。另一方面,如果当前协议是 HTTP,浏览器会自动忽略服务器发来的Secure属性。该属性只是一个开关,不需要指定值。如果通信是 HTTPS 协议,该开关自动打开。
HttpOnly
属性指定该 Cookie 无法通过 JavaScript 脚本拿到,主要是document.cookie
属性、XMLHttpRequest
对象和 Request API 都拿不到该属性。