cookie
介绍
cookie 是当前识别用户,实现持久回话的最好方式.最初是由网景公司开发的,但现在所有浏览器都支持它。
cookie 非常重要,而且它定义了一些新的HTTP首部,所以cookie的存在也影响了缓存。
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等参数;
| 浏览器 | 版本号 | 键值对最大存储个数 | 键值对最大长度 |
|---|---|---|---|
| chrome | 50.0.2661.102 | 170 | 4099 |
| safari | 9.1 | 201 | 4141 |
| firefox | 46.0.1 | 150 | 4100 |
| IE | 11、10、9、8 | 50 | 5117 |
总结: 从经过测试,基本上所有的浏览器对于键值对的支持都高于4K即 4096的长度。 在设置cookie的时候,应该保证键值对的长度不应超过 4096,对于国内的大环境而言,IE的用户也同样不是少数,对于cookie的个数也应该控制在50对以内; 对于安全较高的站点,可以在服务端设置 cookie 使用 httpOnly=true, 预防 XSS 攻击,