简介
-
cookie机制
在客户端保持状态的方案,浏览器通过扩展http协议自动发送给服务器:浏览器会检查所有存储的cookie,若某个cookie的作用范围>=将要请求的资源所在的位置,则将该cookie附在http请求头上发送给服务器。
(1)会话cookie:保存在内存,生命周期是浏览器会话期间;
(2)持久cookie:保存在硬盘,生命周期是设置的过期时间expires;
浏览器筛选cookie规则:按照与当前请求url的域名或父域名下+当前路径或父路径下筛选—通过document.cookie返回与当前请求url可用的所有字符串;
Cookie图解
-
session机制
在服务端保持状态的方案,需要借助cookie机制在客户端保存一个标识(sessionID);当程序为某个客户端请求创建一个session时,服务器首先检查这个客户端请求是否已包含了一个session id,若有,则按id检索出来使用;若没有,服务器会为客户端创建一个session并生成一个session id返回给客户端,客户端借助cookie保存;
区别
- 存储的位置
- cookie存于客户端,临时文件夹中;
- session存在服务器内存中,一个session域对象为一个用户浏览器服务;
- 安全性
- cookie通过加密后存入客户端;
- session本身存于服务器内存中,安全性好;
- 网络传输量
- cookie会传递给服务器;
- session本身在服务器,不存在传送流量;
- 生命周期(以20min为例)
- cookie生命周期是累计的,从创建时开始计时,20min后cookie生命期结束过期;
- session生命周期是间隔的,从创建时开始计时,20min内未访问则session被销毁,若在20min内访问,则重新计时;Session可以手动配置失效时间;
- 关机会造成session生命期的结束,对cookie没影响;
cookie的生成与应用
- 服务器生成cookie:因为http是无状态的协议,用它记录服务器和客户端之间的状态—res.setHeader('Set-Cookie', ['k1=v1;[可选参数]', 'k2=v2;[可选参数]']):Set-Cookie: k1=v1; Set-Cookie: k2=v2;/ res.setHeader('Set-Cookie', 'k1=v1;[可选参数]');
- path:cookie影响到的路径,当前访问的路径不满足该匹配,浏览器不发送这个cookie(同源策略);
- Expires(何时过期)/Max-Age(多久过期):告知浏览器这个Cookie何时过期,若不设置,浏览器会丢弃这个cookie,若设置了过期时间,浏览器会将cookie内容写入磁盘中并保存;
- HttpOnly:该cookie再document.cookie中不可见(js脚本无法读取cookie信息),浏览器不能通过document.cookie去更改这个cookie值,但是在http请求的过程中,依然会发送这个Cookie到服务器端,防止xss攻击;
- 客户端:发送请求时http报文中携带:Cookie: key=value;key=value;
- 性能优化
- 减小cookie的大小;
-
为静态组件使用不同的域名:在域名的根节点设置cookie,子域名下的请求都会携带这些cookie,而静态文件不关心状态,不需要这些cookie信息,因此cookie对静态资源是无用的;
(1)好处:- 减少无效cookie的传输;
- 浏览器下载线程数翻倍(同一域名下请求最大连接数是5);
(2)坏处 - 多一个域名多一次CDN查询;
4.cookie应用:广告投放和在线统计领域—通过嵌入第三方的广告和统计脚本,将cookie和当前页面绑定,标识用户,得到用户的浏览行为,就可以定向投放广告了。
每一个用户与服务器数据一一对应的实现
- 基于cookie保存sessionid实现;
- 基于url的查询字符+url重定向实现:服务器发现字符串不携带sessionid参数则回复一个302状态和Location报头,将url加上sessionid字段后返回给客户端;
网友评论