RFC6265,HTTP State Management Mechanism
保存在客户端、由浏览器维护、表示应用状态的HTTP头部:
浏览器有很多厂商,每种浏览器又有很多版本,因此RFC会对浏览器是有个要求的:
RFC规范对浏览器使用Cookie的要求
代理服务器传递cookie时会有限制,因为cookie是放在http头部的,很多代理服务器会限制http头部大小,4k、8k、Nginx默认32k
方案:
源服务器生成cookie时限制大小
token代替cookie,即JWT形式
session的工作原理:接受cookie携带的session ID,验证合法性;
session是建立的cookie之上,使用session的优点:
cookie vs token
JWT(JSON Web Token)
优劣势:
koa-session
HttpOnly:请注意,没有HttpOnly属性的cookie,在浏览器中可以使用document.cookie上访问,如果设置了 HttpOnly 属性,document.cookie就读取不到。
domain:存储的域名,cookie是不跨域的,并且存储在主域名中子域名是可以访问到的,但是如果存在子域名中那么主域名是无法访问的
。所以这里一般是存在主域名,避免子域名访问不到cookie。
path:在domain下的哪个资源地址中使用cookie,一般指定根路径。
maxAge:有效期(毫秒)
expires=
secure:只有在https的情况下才能使用cookie
singed:设置cookie是否签名
size:cookie的大小
默认情况下,cookie 在用户关闭会话时即关闭浏览器时过期。要持久化cookie,我们可以通过expires或Max-Age属性
注意:Max-Age优先于expires。
expires (绝对时间)
max-age (相对时间)过期时间
注意:
服务器的Set-Cookie只能设置在同域下,但是在浏览器的一个域下Application里却看到了多个域的cookie,这是因为这个页面用到了其他域的内容。
例如上面的new.qq.com,理论上都是qq.com域名下的内容,但是看到有.ipinyou.com的域,这是因为new.qq.com这个页面用了其他域名下的内容,且其他的那个域名需要cookie信息,所以才会在Application中展示出来。
测试1:
// 访问test.com
res.writeHead(200, {
'Content-Type': 'text/html',
'Set-Cookie': ['id1=123; max-age=15', 'id3=111', 'id4=222; domain=test.com']
})
结论1:
测试2:
// 访问test.com
res.writeHead(200, {
'Content-Type': 'text/html',
'Set-Cookie': ['id1=123; max-age=15', 'id3=111', 'id4=222; domain=a.test.com'],
'Set-Cookie': ['domain=test2.com']
})
结论2:
测试3:
// 访问a.test.com
res.writeHead(200, {
'Content-Type': 'text/html',
'Set-Cookie': ['hh=hhh2;', 'ii=iii; domain=test.com']
})
结论:
整体总结:
下面的二级域名都可以想象为子域名。