MENU

Cookie基础

January 16, 2021 • 数据采集与数据分析(python)

Cookie可以理解为在HTTP协议下,服务器或其他脚本语言维护客户端信息的一种方式,是保存在客户端(比如浏览器)的文本文件,Cookie中往往包含客户端或者用户的相关信息。

  1. 背景在客户端与服务器能够进行动态交互的Web应用程序出现之前,Cookie还没有被熟知,是HTTP的无状态特性促进了Cookie的产生。HTTP的无状态指的是无状态协议,HTTP协议对于事务处理没有记忆能力,缺少状态意味着如果服务器需要与客户端进行多次交互,那么客户端必须在每一次交互时都主动提交身份信息。面对这个问题,人们想出了两种能够保持HTTP连接状态的技术:Cookie和Session。Cookie是通过客户端来保持状态的解决方案。从定义上来说,Cookie就是由服务器发给客户端的特殊信息,这些信息以文本文件的形式存放在客户端。客户端每次向服务器发送请求的时候,都会携带这些特殊的信息。在登录网站的时候,经常能够看到登录框处有类似“记住我”的选项,如果勾选了它,那么在重新打开网站甚至第二天访问该网站时,就不需要进行烦琐的登录操作了。因为勾选了这个选项之后,网站会将用户的身份信息记录在Cookie中,在浏览器下一次向服务器发起请求的时候,会自动携带Cookie信息,从而实现自动登录的功能。Cookie通过在客户端存储身份信息的方式与服务器保持状态,而Session通过服务器来保持状态。Session对象会存储特定用户会话所需的属性及配置信息。当用户在应用程序的Web页面之间跳转时,存储在Session对象中的变量不会丢失,会在整个用户会话中一直存在下去。如果用户在访问Web网页的时候还没有Session,则Web服务器将自动创建一个Session对象,当会话过期或被放弃后,服务器也会终止会话。
  2. 生存周期与持久性Cookie在生成时会被指定一个Expire值,该值就是Cookie的生存周期。Cookie在这个周期内是有效的,但是超出周期后就会被清除。如果将Cookie的生存周期设置为0或者负数,那么在你关闭浏览器的时候,Cookie就会被浏览器清除,下一次打开网页时再生成新的Cookie值。这个功能常用于金融类网站,因为需要在浏览器关闭时立即清除用户的身份信息,更好地保证信息安全。像这样即用即清除的Cookie通常称为会话Cookie,而刚才提到的类似“记住我”或“一周内免登录”选项,是将Cookie值保存起来,在生存周期内还可以继续使用,长时间保持用户状态的Cookie称为持久Cookie。
  3. 属性和结构Cookie由变量名称和值组成,其中变量既有标准的变量,也有自定义格式的变量,具体格式如下:NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURENAME和VALUE是Cookie的名称与值。Expires通常是一个日期变量,格式为DD-MM-YY HH:MM:SS GMT。正如刚才所说,Expires决定了Cookie的生存周期,值为空就代表这是一个会话Cookie,即Cookie文件将随着浏览器的关闭而自动消失。Path属性规定了在Web服务器上,哪些路径下的页面可以获取服务器设置的Cookie。一般情况下,如果用户输入的URL的路径部分从第一个字符开始包含Path属性所定义的字符串,浏览器就认为通过检查。如果Path属性的值为“/”,则Web服务器上所有的WWW资源均可读取该Cookie。该项设置是可选的,如果省略,则Path的属性值为Web服务器传给浏览器的资源路径名。Domain指定了可以访问Cookie信息的域名并且它是一个只写变量。它规定了哪些Internet域中的Web服务器可以读取浏览器所存的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。这项设置是可选的,如果省略它,Cookie的属性值为该Web服务器的域名。比如将Domain的值设为taobao.com,那么所有类似m.taobao.com或者taobao.com的页面就可以访问Cookie中的信息。SECURE:如果在Cookie中标记该变量,表明只有当浏览器和Web服务器之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这样的协议只有一种,即HTTPS。小技巧 Cookie的属性可以搭配使用,比如借助Domain和Path这两个属性,就可有效地控制Cookie文件被访问的范围。
  4. 产生过程在正常情况下,Cookie值可以由服务器端或JavaScript代码设定。在客户端第一次向服务器端发起请求之前,客户端是不会有Cookie值的。当客户端的请求到达服务器端后,服务器端可以将Cookie值写在响应头中并返回给客户端,或者客户端工具(如浏览器)在渲染页面时,由页面中的JavaScript代码生成Cookie值。双端交互及Cookie的产生过程如图:

服务器生成Cookie值并将其添加到响应头中返回给浏览器,浏览器检测到响应头中的Set-Cookie头域后将对应的Cookie值保存起来,而后每一次请求都会自动携带对应的Cookie,除非Cookie过期或者被清除。除了服务端在响应头中使用Set-Cookie头域向客户端发送Cookie这种方式外,还可以通过JavaScript代码设置Cookie,比如:document.cookie = 'async=569cls8fs2'