关于Cookie的那些事

1 Cookie简介

Cookie是由W3C组织提出,最早由NetScape社区发展的一种机制。Cookie是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个cookie。其实cookie是一个很小的文本文件,是浏览器储存在用户的机器上的。Cookie是纯文本,没有可执行代码。储存一些服务器需要的信息,每次请求站点,会发送相应的cookie,这些cookie可以用来辨别用户身份信息等作用。cookie可以包含任意的信息,客户端会记录服务器返回来的Set-Cookie首部中的cookie内容。并将cookie存储在浏览器的cookie数据库中,当用户访问同一站点时,在Cookie请求首部发送过去。

2 JavaScript操作cookie

JavaScript 可以使用 document.cookie 属性来创建 、读取、及删除 cookie。
JavaScript 中,创建 cookie 如下所示:

document.cookie="username=John Doe";

您还可以为 cookie 添加一个过期时间(以 UTC 或 GMT 时间)。默认情况下,cookie 在浏览器关闭时删除:

document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT";

您可以使用 path 参数告诉浏览器 cookie 的路径,domain 参数告诉浏览器 cookie 的域名。默认情况下,cookie 属于当前页面。

document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/; domain= .abc.com";

在 JavaScript 中, 可以使用以下代码来读取 cookie:

var x = document.cookie;

document.cookie 将以字符串的方式返回所有的 cookie,类型格式: cookie1=value; cookie2=value; cookie3=value;

3 关于cookie的domain

domain的含义为域。假设有两个域名
域名A a.b.e.f.com.cn
域名B c.d.e.f.com.cn
域名有分级的概念,也就是说域名A与域名B都是f.com.cn的子域名,f.com.cn又是com.cn的子域名
在域名A所使用的服务中,可以设置域名
a.b.e.f.com.cn
b.e.f.com.cn
e.f.com.cn
f.com.cn
在服务端设置domain的时候,设置domain为b.e.f.com.cn或.b.e.f.com.cn没有区别,注意前面的点,即只要是为cookie显式的声明domain,前面带不带点没有区别。这个点的奥妙后面还会提到。
设置其他域名虽然可以在响应头中有set-cookie的头,但是出于安全考虑,该头会被浏览器忽略,并不会产生真实的cookie,有一点注意,虽然在域名上来说,f.com.cn是com.cn的子域,但是浏览器是不会接收domain为com.cn的cookie的,那样互联网就乱套了。
对于域名A下的cookie,域名B可以拿到e.f.com.cn,f.com.cn这两个domain下的cookie,互联网上说的单点登录,就是以这个原理实现的。
如果存在相同名的cookie不同domain呢?
比如域名A设置设置domain为e.f.com.cn的cookie,mykey=myvalue1。
而在域名B中设置domain为c.d.e.f.com.cn的cookie,mykey=myvalue2。
此时在域名B服务端能拿到两个cookie都为mykey=myvalue,并不存在覆盖一说。
注意在域名B中如果设置domain为e.f.com.cn的cookie,mykey=myvalue3.此时会覆盖域为e.f.com.cn的mykey的值,即浏览器中,同一个域,只存在一个名为mykey的cookie。如果不显式设置cookie,默认当前域名这种说法对不对呢? 先说第一个问题,如果不显示设置cookie,那么浏览器会生成一个只针对当前域名的cookie,什么叫只针对当前域名呢?如果有一个域名就是e.f.com.cn,在该域名下设置的cookie如果没有显示domain,在回写浏览器的时候浏览器会特殊处理,如果是火狐,你会发现该cookie的信息,有一个主机项,而域项消失了,在chrome中,虽然有域这个项,但是域的前面少了一个点,就是上面所说的,如果显示声明,不管域中带不带点,到chrome中,都是带点存储的,只有非显式声明域的cookie,浏览器存储才是不带点的,问题就在这,在e.f.com.cn服务主机中生成的cookie,只有e.f.com.cn的服务器能拿到,此时子域名是拿不到这个cookie的。、

扩展

对于前后端涉及到的跨域问题可以查找withCredentials相关资料
面试问题经常问到的关于cookie的问题 cookie与session区别 cookie与 localstorage区别

阅读 216

推荐阅读