本文章整理自:阮一峰Cookie 参考「每日一题」简述 Cookie 是什么
Cookie 是服务器保存在浏览器的一小段文本信息。浏览器每次向服务器发出请求,就会自动附上这段信息。
不推荐使用Cookie作为客户端存储,原因:
客户端储存应该使用 Web storage API 和 IndexedDB。
Cookie 包含以下几方面的信息:
(3/4/5是cookie的属性)
举例来说:
浏览器的同源政策规定,两个网址只要域名相同和端口相同,就可以共享 Cookie(参见《同源政策》一章)。注意,这里不要求协议相同。也就是说,http://example.com
设置的 Cookie,可以被https://example.com
读取
服务器如果希望在浏览器保存 Cookie,就要在 HTTP 回应的头信息里面,放置一个Set-Cookie
字段.
Set-Cookie:foo=bar
上面代码会在浏览器保存一个名为foo
的 Cookie,它的值为bar
。
(设置的格式为:<键(名)>=<值>
)
HTTP 回应可以包含多个Set-Cookie
字段,即在浏览器生成多个 Cookie。下面是一个例子。
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[page content]
除了 Cookie 的值,Set-Cookie
字段还可以附加 Cookie 的属性。
一个Set-Cookie
字段里面,可以同时包括多个属性,没有次序的要求。
下面是设置一个Cookie的例子:除了名与它的值,还包含Domain
属性Secure
属性和HttpPnly
属性:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
除了键=值
来设置cookie的名字和值之外,还可以设置属性。
Expires
,Max-Age
用来设置cookie持续时间Domain
,Path
设置发送http请求时那些域名和路径需要附带这个CookieSecure
属性指定浏览器只有在加密协议 HTTPS 下才能发送HttpOnly
属性指定该 Cookie 无法通过 JavaScript 脚本拿到浏览器向服务器发送 HTTP 请求时,每个请求都会带上相应的 Cookie。也就是说,把服务器早前保存在浏览器的这段信息,再发回服务器。这时要使用 HTTP 头信息的Cookie字段。
Cookie: foo=bar
上面代码会向服务器发送名为foo的 Cookie,值为bar。
Cookie字段可以包含多个 Cookie,使用分号(;)分隔。
Cookie: name=value; name2=value2; name3=value3
下面是一个Http请求的例子。
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
服务器收到浏览器发来的 Cookie 时,有两点是无法知道的(因为这些Cookie的属性只保存在浏览器上)。
document.cookie
读写当前网页的Cookie读取的时候,它会返回当前网页的所有 Cookie,前提是该 Cookie 不能有HTTPOnly
属性。
document.cookie // "foo=bar;baz=bar"
document.cookie
属性是可写的,可以通过它为当前网站添加 Cookie。
等号两边不能有空格
document.cookie = 'fontSize=14';
但是,document.cookie
一次只能写入一个 Cookie,而且写入并不是覆盖,而是添加。
document.cookie = 'test1=hello';
document.cookie = 'test2=world';
document.cookie
// test1=hello;test2=world
写入 Cookie 的时候,可以一起写入 Cookie 的属性。
document.cookie = "foo=bar; expires=Fri, 31 Dec 2020 23:59:59 GMT";
各个属性的写入注意点如下。
path
属性必须为绝对路径,默认为当前路径。
domain
属性值必须是当前发送 Cookie 的域名的一部分。比如,当前域名是example.com
,就不能将其设为foo.com
。该属性默认为当前的一级域名(不含二级域名)。
max-age
属性的值为秒数。
expires
属性的值为 UTC 格式,可以使用Date.prototype.toUTCString()
进行日期格式转换。
document.cookie
写入 Cookie 的例子如下。
document.cookie = 'fontSize=14; '
+ 'expires=' + someDate.toGMTString() + '; '
+ 'path=/subdirectory; '
+ 'domain=*.example.com';
Cookie 的属性一旦设置完成,就没有办法读取这些属性的值。
删除一个现存 Cookie 的唯一方法,是设置它的expires
属性为一个过去的日期。
document.cookie = 'fontSize=;expires=Thu, 01-Jan-1970 00:00:01 GMT';
上面代码中,名为fontSize
的 Cookie 的值为空,过期时间设为1970年1月1月零点,就等同于删除了这个 Cookie。