cookie的特点:
- 对于绑定好的域名,当向这个域名发起请求时,http头部都会包含 cookie 信息
- 每个域的cookie的数量和占用的磁盘空间都是有限的
(原因:cookie是存在客户端的,所以加入了这个限制,来确保cookie不会被恶意使用)
cookie的组成
cookie是由服务端添加在响应头 Set-cookie 里,它包括几块信息,这些信息以 分号和空格分隔开。
-
cookie 名称和值:必须经过URL 编码处理用
encodeURLComponent()
-
domain 域 : 设定cookie对于哪个域是有效的 指定完后即所有向这个域发送的请求都会带上这个cookie信息
-
path 路径:指定了的路径,向服务器请求时都会带上该cookie
-
expires: cookie的失效日期 ,是GMT格式的日期
注:默认浏览器会话结束时cookie删除;则可通过该字段设其过期日期;
若设的失效日期是以前的时间,则cookie会被立即删除。
【设置cookie的过期时间:设置Set-cookie里的expires ;
设置cookie无效的小技巧:设置Set-cooike里的expires为过去的时间,即可让cookie失效】 -
secure: 安全标志,一旦加上这个,则 cookie 只能在 https 下传输
【注:这是cookie中唯一一个不是key-value形式的,需要限制时直接加一个英文单词 secure】
当服务端将通过Set-cookie 将cookie发送给浏览器后,浏览器会进行保存, 等下次向cookie里设定的域进行请求时,都会在 http 头带上相关的 cookie 信息
但是注意: 浏览器向服务端发送cookie时: 只有名称和值才会被发送
cookie的使用
浏览器端
通过document.cookie
这个接口,但是它在不用的方式下有不同的行为。
- 当用来获取属性时: document.cookie 返回的是当前页面所有的 cookie 字符串,是一系列由分号隔开的 ;
注:名称和值都是经过URL 编码的,得用decodeURLComponent()
来解码
- 当设置值时:document.cookie 可用来设置一个新的 cookie 字符串,它会加入到已经有的cookie的集合中,并不会覆盖 cookie,除非cookie的名称已经存在
例如:
document.cookie = encodeURLComponent("name") + "=" + encodeURL("fishCrush")
// 设置了名称为name,值为fishCrush的cookie字符串
注:由于cookie在浏览器只有一个接口documen.cookie,不方便读取和设置,所以经常会封装 读取cookie和 设置cookie 的函数
服务器端
- 写cookie:把 cookie 字符串 加入响应头的 Set-Cookie字段中
- 读cookie:解析 http 请求头的 Cookie 中的键值对
额外:服务端对 cookie的 进一步设置以确保其安全性
-
signed
当设 signed 为true 时,服务端会设两个 Set-cookie字段:
一个是正常下的,
附加的另一个是 名称以 .sig 为后缀,值被加密的cookie,用来验证cookie在传输过程有无被篡改 -
httpOnly
加入这个字段后,禁止用 JS 操纵这个 cookie字段
好处:当遇到XSS 攻击时,黑客没法拿到设置了 httpOnly 的 cookie的信息
网站性能优化方面谈 cookie
传输过程 cookie 是在请求头里的, 会占用一定的带宽。
对于同站内的静态资源,这时候不需要 cookie,但是由于浏览器每次同域请求时都会在http头带上cookie,无形中就浪费了带宽
解决:
可以将静态资源 放到独立的域名中,以此来避免无用cookie的浪费
网友评论