cookie

介绍

cookie 是当前识别用户,实现持久回话的最好方式.最初是由网景公司开发的,但现在所有浏览器都支持它。

cookie 非常重要,而且它定义了一些新的HTTP首部,所以cookie的存在也影响了缓存。

cookie 的类型可以笼统的将 cookie 分为两类: 会话 cookie 和持久 cookie 。

会话 cookie 是一种临时的 cookie ,它记录了用户访问站点时的设置和偏好,用户退出浏览器时,会话的 cookie 就被删除了。

持久 cookie 的生存时间更长一些,他们存储在硬盘上,浏览器退出,计算机重启时他们依然存在。通常会持久 cookie 维护某个用户会周期性访问的站点的配置文件或登录名

//chrome 存储在本地的一条 cookie
//注:存储格式并不等于使用的格式
data = {
    "domain": ".example.com", // (例如 'example.com','.example.com' (包括所有子域名), 
    //注:这里的时间指的是过期时间,使用 cookie 时应该转为UTC形式;exprise=Date.toUTCString();
    "expirationDate": 1479202705.602381,
    "hostOnly": false,
    "httpOnly": true,
    "name": "__cfduid",		//键
    "path": "/",				//(例如 '/','/tools')如果没有定义,默认为当前文档位置的路径。
    "secure": false,			// (例如;secure)  cookie只通过https协议传输
    "session": false,
    "storeId": "0",
    "value": "d22c935116f142a4d89eb2e0e8a90d73d1447666705",//值
    "w": 0
}

也可以使用浏览器内置的面板查看 cookie

cookie使用

在浏览器中,我们可以这样设置 cookie

document.cookie = 'a=1';

除了正文部分,我们还有以下5个可选属性。 domain,path,exprise,max-age,secure

domain

设置了 domain 之后只能在该域的指定域下使用 cookie

// 只能在 http://test.hawk.cn/**/*下使用cookie
document.cookie = 'a=1;domain=test.hawk.cn'

path

增加 path, 设置了 path 之后只能够在该域名的 /tools 路径下以下使用这一条 cookie

document.cookie = 'b=2;path=/tools';

expire

过期时间,指定该 cookie 的过期时间,如果不指定,默认会话结束自动删除该 cookie

document.cookie = 'c=4;' + new Date().toUTCString();

max-age 是exprise的补充,在低版本的IE不支持,所以一般不单独使用。

//存储一个保持1分钟的cookie,max-age值的单位 秒
document.cookie = 'd=4;max-age=60'

以上是在浏览器端的使用方式,在服务器也可以通过发送请求头的方式,往客户端浏览器写 cookie

secure

如设置了 secure , 该 cookie 只能在HTTPS 下使用

//在node下,通过writeHead设置
response.writeHead(200, {
    'Set-cookie': 'f=456;secure;'
});

httpOnly

httpOnly :设为 true 后,该 cookie 只能通过 HTTP 访问,不能通过 document.cookie 获取 httpOnly 值为 true 的键值。防止 xss 读取 cookie。

//在node下,通过writeHead设置
response.writeHead(200, {
    'Set-cookie': 'f=456;httpOnly=true;'
});
//浏览器
document.cookie // ""

在console里面无法输出 httpOnly=true 的 cookie , 可以通过调试面板查看. 获取 Cookie 时,首先要检查 Domain 匹配性,其次才检查 path 、secure 、httponly 等属性的匹配性。如果 hostOnly 为 true 时,只有当前域名与该 Cookie 的 Domain 属性完全相等才可以进入后续流程; hostOnly 为 false 时,符合域规则的域名都可以进入后续流程。

//在node下,通过writeHead设置
response.writeHead(200, {
    'Set-cookie': 'g=888;hostOnly=true;'
});
//浏览器
document.cookie // "g=888"

实际中的运用

cookie 这个东西大多数人也都听过,用过,但由于不同的浏览器实现方式不太一样,所以在开发中也会遇到各种各样的问题,比如常见的两个问题

单个键值对最大的长度 每个浏览器最大所支持的键值对数 注:键值对的长度,包括了键、值、=、path等参数;

浏览器版本号键值对最大存储个数键值对最大长度
chrome50.0.2661.1021704099
safari9.12014141
firefox46.0.11504100
IE11、10、9、8505117

总结: 从经过测试,基本上所有的浏览器对于键值对的支持都高于4K即 4096的长度。 在设置cookie的时候,应该保证键值对的长度不应超过 4096,对于国内的大环境而言,IE的用户也同样不是少数,对于cookie的个数也应该控制在50对以内; 对于安全较高的站点,可以在服务端设置 cookie 使用 httpOnly=true, 预防 XSS 攻击,

参考资料

最后更新时间: