HTTP客户端识别与Cookie机制

HTTP客户端识别与Cookie机制

HTTP识别用户的几种技巧 * 承载用户身份信息的HTTP首部 * 客户端ip地址跟踪,通过用户的IP地址对其进行识别 * 用户登录,用认证方式识别用户 * 胖URL,一种在URL中潜入识别信息的技术 * cookie,一种强大高效的持久身份识别技术 ## 一,承载用户相关信息的HTTP首部 > * from 用户的email地址 少用 * user-agent 用户的浏览器软件  将用户所用的浏览器信息告知服务器 * referer 用户是从这个页面跳转过来的  提供用户来源页的URL *  anthorization 用户名和密码  * client-ip 客户端ip  * x-forwarded-for 客户端ip  * cookie 服务器生成的id标签   ## 二,客户端IP地址 早期web先锋尝试将客户端IP地址作为一种表示形式使用 **缺点:** > 使用ip来标识客户端,存在很多缺点。 客户端ip描述的是机器,不是用户。 很多因特网机器是动态随机分配ip。 如果通过代理和网关访问服务器,那么得到的是代理的ip,而不是客户端的。   ## 三,用户登录 直接主动让用户登录来识别用户,作为标识。 可以向浏览器发送一条http响应代码是401 Login Required,并添加www-authentication首部, 然后浏览器就会显示一个登录对话框。只要用户输入对了用户名和密码,服务器就可以识别用户了。 浏览器每次在请求中,向服务器发送authorization首部作为一种身份的标志。 **缺点:** 登陆多个web站点太繁琐,站点浏览跳转时需要在每个站点登陆,还可能需要记住不同密码。   ## 四,胖URL web站点为每个用户生成特定的URL来追踪用户的身份,一般是对真正的URL进行拓展,在URL开始或结束的地方追加一些状态信息 这种包含了用户状态信息的URL称为胖URL **缺点:** * 丑陋的URL * 无法共享URL 因为url中有用户信息,共享会透露个人信息 * 破坏缓存 每个人的URL都不一样,所以不需要缓存了 * 额外的服务器负荷 * 非持久   ## 五,cookie cookie是当前用户识别,实现持久会话最好的方式 #### cookie类型 * 会话cookie 浏览器退出,会话cookie就会删除 * 持久cookie 在设置的时间内不会删除 #### cookie是如何工作的 > 用户首次访问站点的时候,web服务器对用户一无所知。web服务器希望这个用户会再次回来,所以给这个 用户一个独有的cookie。cookie中包含了一个由名字=值构成的任意列表。通过设置set-cookie,或 set-cookie2http响应首部,设置cookie值。浏览器会记住从服务器返回的set-cookie首部中的内容, 并将cookie集存储到浏览器的cookie数据库中。将来用户访问同一个站点时,浏览器会将cookie中的值 放在cookie首部,传给服务器。   #### cookie灌:客户端状态 cookie的基本思想就是让浏览器积累一组服务器的信息,每次访问服务器,都将这些信息提供给他。 因此浏览器要负责存储cookie信息,所以称之为客户端状态。 * 网景的cookie 网景将cookie存储在一个名为cookie.txt的文本文件中。每一行代表一个cookie,有7个tab分割的字段。 ![](http://upload-images.jianshu.io/upload_images/2015490-9efb4dc384016305.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) * 微软的internet explorer的cookie  微软的IE讲cookie储存在高速缓存目录下独立的文本文件中 #### 不同站点使用不同的cookie 浏览器内部的cookie罐中可以有成百上千个cookie,但浏览器不会将每个cookie都发送给所有的站点,实际上,通常只向每个站点发送2-3个cookie,原因如下: * 对所有这些cookie字节进行传输会严重降低性能。 * cookie中包含的服务器特有的名值对,所以对大部分站点来说,大多数cookie都只是无法识别的误用数据 * 将所有的cookie发送给所有站点会引发潜在的隐私问题。 总之,浏览器只向服务器发送服务器产生的那些cookie。 ##### cookie的域属性 产生cookie的服务器可以向set-cookie响应首部添加一个Domain属性来控制哪些站点可以看到那些cookie, ##### cookie路径属性 cookie规范甚至允许用户将cookie与部分web站点关联起来,可以通过Path属性来实现这一功能,在这个属性列出的URL路径前缀下所有的cookie都是有效的。因此cookie就是由服务器贴到客户端上,由客户端维护的状态片段,只会回送给那些合适的站点,下面我们来更仔细地看看cookie的技术和标准。 #### cookie成分 cookie0与cookie1 **cookie0:** > name=value 服务器可以创建任意的name=value关联 expires 可选的,过期时间 domain 可选的,浏览器只向指定的域中的服务器主机名发送cookie。如果没有设置,就默认产生set-cookie响应的服务器主机名。 path 可选的,可以为服务器上特定的文档产生cookie。如果没有设置,默认是产生这个响应的url的路径。 secure 可选的,只有在使用ssl,才会发送cookie。 客户端发送请求时,会将所有与域、路径、和安全过滤器相匹配的、未过期的cookie都发送给这个站点。   **cookie:** > 允许浏览器退出时,强制销毁cookie 使用相对秒数,来控制cookie的生存时间 通过url端口号,控制cookie作用域 为实现互操作性,实现的版本号   #### cookie会话跟踪 可以用cookie在用户与某个web站点进行多项事物处理时对用户进行跟踪,电子商务web站点用会话cookie在用户浏览时记录下用户购物车信息。 #### cookie与缓存 * 要特别小心,不能分配用过的cookie,不能向用户展示其他人私有文档的内容 * 如果向多个用户发送了相同的SetCookier首部,可能会破坏用户的定位 #### cookie,安全性和隐私 cookie是可以禁止的,并且可以通过日志分析和其他方式实现大部分跟踪记录。cookie自身不是很大的安全隐患。 但是潜在的滥用情况,总是存在的。第三方站点使用持久cookie跟踪用户就是一种最大的滥用。*这种与ip地址和 referer首部结合起来,营销公司就可以构建相当准确的用户档案和浏览模式*。 如果小心的使用cookie,那么cookie带来的好处还是要大于风险的。 ## javascript设置,读取,删除cookie方法 Javascript是运行在客户端的脚本,因此一般是不能够设置session的,因为Session是运行在服务器端的。 而cookie是运行在客户端的,所以可以用JS来设置cookie. cookie是以键值对的形式保存的,即key=value的格式。各个cookie之间一般是以“;”分隔。 #### JS设置cookie ``` document.cookie="name="+username; // 加上终止时间 document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); ``` #### JS读取cookie 直接document.cookie就可以获取,但要获取指定名称的cookie值需要这样做: ``` // 该函数返回名称为name的cookie值,如果不存在则返回空,其实现如下:  <script language="JavaScript" type="text/javascript">  <!--  function getCookie(name){  var strCookie=document.cookie;  var arrCookie=strCookie.split("; ");  for(var i=0;i<arrCookie.length;i++){  var arr=arrCookie[i].split("=");  if(arr[0]==name)return arr[1];  }  return "";  }  //-->  </script>  ``` #### 删除cookie 为了删除一个cookie,可以将其过期时间设定为一个过去的时间,例如: ``` //获取当前时间 var date=new Date(); //将date设置为过去的时间 date.setTime(date.getTime()-10000); //将userId这个cookie删除 document.cookie="userId=828; expires="+date.toGMTString();  ``` **方法封装** ``` var cookie = {     set:function(key,val,time){//设置cookie方法         var date=new Date(); //获取当前时间         var expiresDays=time;  //将date设置为n天以后的时间         date.setTime(date.getTime()+expiresDays*24*3600*1000); //格式化为cookie识别的时间         document.cookie=key + "=" + val +";expires="+date.toGMTString();  //设置cookie     },     get:function(key){//获取cookie方法         /*获取cookie参数*/         var getCookie = document.cookie.replace(/[ ]/g,"");  //获取cookie,并且将获得的cookie格式化,去掉空格字符         var arrCookie = getCookie.split(";")  //将获得的cookie以"分号"为标识 将cookie保存到arrCookie的数组中         var tips;  //声明变量tips         for(var i=0;i<arrCookie.length;i++){   //使用for循环查找cookie中的tips变量             var arr=arrCookie[i].split("=");   //将单条cookie用"等号"为标识,将单条cookie保存为arr数组             if(key==arr[0]){  //匹配变量名称,其中arr[0]是指的cookie名称,如果该条变量为tips则执行判断语句中的赋值操作                 tips=arr[1];   //将cookie的值赋给变量tips                 break;   //终止for循环遍历             }         },       delete:function(key){ //删除cookie方法          var date = new Date(); //获取当前时间          date.setTime(date.getTime()-10000); //将date设置为过去的时间          document.cookie = key + "=v; expires =" +date.toGMTString();//设置cookie         }         return tips;     } } ``` 使用方式: cookie.get("uesr"); // 获取键名为user的cookie ## cookies,sessionStorage和localStorage的区别 以前持久化的存储一些有用的数据一般是通过服务器端的数据库或者浏览器端的cookie来实现 随着HTML5的出现,web开发又有了两种选择:Web Storage和Web SQL Database. Web Storage有两种形式 localStorage(本地存储)和sessionStorage(会话存储) * localStorage:浏览器关闭了数据仍然可以保存下来,并可用于所有同源(相同的域名、协议和端口)窗口(或标签页)永久存储,永不失效,除非手动删除 *  sessionStorage:数据存储在窗口对象中,窗口关闭后对应的窗口对象消失,存储的数据也会丢失。就是浏览器窗口关闭就失效了。 **使用** 使用 local storage和session storage主要通过在js中操作这两个对象来实现,分别为window.localStorage和window.sessionStorage. 这两个对象均是Storage类的两个实例, Storage类的属性和方法。 ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2015490-a5dea1ddea536d7a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## cookie与session的区别于联系 * cookie与session的区别:cookie数据保存在客户端,session数据保存在服务器端 * cookie和session的共同之处:cookie和session都是用来跟踪浏览器用户身份的会话方式。