我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第14篇文章,点击查看活动详情
Cookie:
最近由于项目的关系,公司加班非常频繁。每个人对于菜系的口味相对是固定的,大家对定 加班餐爆发了新的需求,希望能够将员工和其常用的菜系进行绑定,这样就不需要每次订餐都重 新选择,直接挑选自己喜欢的菜系就行了。随着加班人群及频率的扩大,解决这个需求显得迫在 眉睫了。按照先前的订单申请流程,先由部门主管统计订餐人数及对应的菜系,统一填写至订餐 申请单。这样的流程导致每一次加班,主管们都需要重新统计菜系套餐数。如果每个人对于菜系 的选择相对固定,那么对于主管来说,只要判断该人员是否需要改变菜系,如果没有,则不改变 上一次的订餐数据即可。这样既满足了大家的普遍需求,也提高了统计效率。部门主管为了要解 决这个问题,查看订餐申请单,发现上面并没有记录上一次订单情况的数据。也就是说酒店A与公 司协商达成的订餐协议并不具有关联性,即每一份订餐协议的数据都是独立的,前后不具有关联性, 是无状态性的。为了满足这一新需求,酒店A给每个公司发了具有唯一ID的通行证。在第二次订餐 时,公司提交订餐通行证,酒店A就能直接识别该公司的订餐信息了。这个通行证就相当于一个身份 认证,它将不同阶段的数据传输用指定的方式进行关联,合理解决了订餐协议的无状态性。
协议有很多种,订餐协议就是一种无状态协议。酒店A从当前数据传输上无法知道订餐者身 份。怎么办呢?就给订餐的公司们颁发一个通行证吧,每个公司一个,无论谁需要订餐,都必须 携带自己的通行证。这样酒店A 就能从通行证上确认订餐者身份了。这就是本节要说的 Cookie 的工作原理。
Cookie的内容是保存的一小段文本信息,这些文本信息组成一份通行证。它是客户端对于无 状态协议的一种解决方案。举个例子,用户使用浏览器访问一个支持Cookie的网站,会经过以下 传输过程,如图所示。
Cookie的使用原理
(1)用户会提供包括用户名在内的订餐信息并且将其提交至服务器。
(2)服务器向客户端回传相应数据的同时,也会发回这些订餐信息(Cookie S—001)。
(3)当客户端接收到来自服务器的响应之后,浏览器会将Cookie S—001存放在一个统一的位置。
(4)客户端再向服务器发送请求的时候,会把Cookie S—001再次发回至服务器。
有了 Cookie 这样的技术实现,服务器在接收到来自客户端的请求之后,就能够通过分析 Cookie的内容得到客户端特有的信息,从而动态生成与该客户端相对应的内容。通常,我们可以 从很多网站的登录界面中看到“保存用户名”这样的选项,如果你勾选了它之后再登录,那么在 下一次访问该网站的时候,页面会自动填补用户名,而这个功能就是通过Cookie实现的。
既然协议的无状态性可以通过使用Cookie技术来解决,那么浏览器会在本地保存Cookie 信 息。对于测试人员来说,如果要模拟有状态的请求行为,就可以通过直接向服务器提交已保存的 Cookie 信息以便绕过身份认证,优化测试步骤。要利用Cookie作为测试的手段,在理解了Cookie 的实现原理后需要掌握以下内容。
获取Cookie的途径
1.使用浏览器的开发者工具或专业抓包工具获取
测试人员对抓包工具应该是相当熟悉的了。不论你使用浏览器(F12),还是专业抓包工具, 能达到目的即可。以fiddler抓包工具为例,如图所示。
2.从本地文件中获取
既然Cookie 信息被浏览器保存至本地,那么测试人员就可以在本地文件中寻找Cookie信息了。 举几个常用浏览器的存放地址。
(1)IE浏览器 Cookie 数据位于:%APPDATA%\Microsoft|Windows\Cookies\ 目录中的xxx.txt 文件(里面可能有很多个.txt Cookie文件)。
(2)Firefox的Cookie 数据位于:%APPDATA%\Mozilla\Firefox\Profiles\ 目录中的xxx.default 目录名为cookies.sqlite的文件。
(3)Chrome的Cookie数据位于:%APPDATA%\Google\Chrome User Data Default 目录中, 名为Cookies的文件。
在IE浏览器中,IE将各个站点的Cookie分别保存为一个XXX.txt这样的纯文本文件(文件 个数可能很多,但文件容量都较小)。而Firefox和Chrome是将所有的Cookie 都保存在一个文
件中(文件容量较大),该文件的格式为SQLite3数据库格式的文件。为了查看及运用方便,一般浏览器都会保存多域名的Cookie 信息。可以通过使用Chrome和Firefox 浏览器的设置,直观地拷贝 Cookie 信息。
以Chrome浏览器为例。(1)进入Chrome 设置。 (2)找到【隐私设置】。(3)进入【内容设置】。
(4)在Cookie选项中可以查看及搜索所有保存的Cookie,如图所示。
(5)根据不同的域名查看该域名下具体的Cookie 内容,例如,要查看微信公众号平台的Cookie信息,如图4.11所示。
(6)查看每个Cookie项里的具体内容,如图所示
从以上截图可以看出Cookie里的几个关键信息:名称、内容、域名、路径、创建时间、到期时间。如上所述,对于Firefox浏览器可以选择如下操作。
(1)进入Firefox 设置。
(2)找到【工具设置】。
(3)进入【选项设置】。
(4)进入【隐私设置】。
(5)显示Cookie。
(6)在Firefox 浏览器的设置中查看 Cookie的具体信息。
3.通过前端技术获取
测试人员可以通过前端技术查看某个网站颁发的Cookie。例如,在浏览器地址栏输入:
Javascript:alert(document.cookie)
就可以查看Cookie 信息。JavaScript脚本会弹出一个对话框,显示本网站颁发的所有Cookie的内容,如图4.13所示。
弹出的对话框中显示的为Baidu网站的Cookie。可以看到为了信息的安全性,Baidu 使用特殊的方法将Cookie 信息加密了。
测试人员可以通过多种方法获取 Cookie 信息,所以 Cookie 存储的信息容易被窃取。假如 Cookie 中所传递的内容比较重要,那么就要求使用加密的数据传输。但加密只是传输信息的加密, 对于本地信息除了用户自己加密是不会自行加密的,所以一般敏感的信息不会放入Cookie中,如 密码等信息。
Cookie的生命周期
一般大家都会认为浏览器关闭时就会自动清除Cookie。其实这个说法不正确,Cookie的生命 周期是可以设置的,所以当你在创建测试场景时,可以根据需求进行相应的设置。
·Cookie的生存时间是整个会话期间:浏览器会将Cookie保存在内存中,浏览器关闭时就 会自动清除这个Cookie。
Cookie 的生存时间是长久有效:Cookie 保存在客户端的硬盘中,浏览器关闭的话,该 Cookie也不会被清除,下次打开浏览器访问对应网站时,这个Cookie就会自动再次发送 到服务器端。
测试人员可以通过对浏览器的设置修改Cookie的生命周期,如图所示。
除了通过浏览器修改,可以运用开发手段在服务器端的代码层面对Cookie的生命周期进行修改。 以下举几个Cookie的常用属性,便于测试人员根据测试场景进行修改。
(1)Name:该Cookie的名称。Cookie一旦创建,名称便不可更改。
(2)Value:该Cookie的值。如果值为Unicode 字符,需要为字符编码。如果值为二进制数 据,则需要使用Base64编码。
·Unicode 编码:保存中文
中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字 符,内存中只占2个字节。Cookie中使用Unicode 字符时需要对Unicode字符进行编码,否则会 乱码。
Base64编码:保存二进制图片
Cookie不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据。例如,在Cookie 中使用数字证书,提供安全度。使用二进制数据时需要进行Base64编码。
小知识点:Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6 次方等于64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于 4个Base64单元,即3个字节需要用4个可打印字符来表示。Base64编码后是可以被翻译回原来 的样子的,所以它并不是一种加密过程。
(3)MaxAge:该Cookie 失效的时间,单位为秒。如果为正数,则该Cookie在MaxAge秒之 后失效。如果为负数,该Cookie 为临时 Cookie,关闭浏览器即失效,浏览器也不会以任何形式 保存该Cookie。如果为0,表示删除该Cookie。默认为—1。
(4)Secure:该Cookie是否仅被使用安全协议传输。安全协议有HTTPS、SSL等,在网络上 传输数据之前先将数据加密。默认为False。
(5)Path:该 Cookie 的使用路径。如果设置为“
“/sessionWeb/”
,则只有 contextPath 为 “/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问 该Cookie。注意最后一个字符必须为“/”。
(6)Domain:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com" 结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
Cookie不可跨域名以及跨浏览器使用
一般Cookie是不可跨域名的,这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁 止网站非法获取其他网站的Cookie。
Cookie除了不能跨域名使用,也不能跨浏览器使用。大家可能会遇到一种情况,既然Cookie 不能在不同的浏览器中使用,为什么使用IE登录了腾讯网站后,使用Firefox 能保持登录状态呢? 不同浏览器使用不同的Cookie 管理机制,无法实现公用Cookie。如果使用IE登录腾讯网站,使用 Firefox 也能登录,这是由于在安装腾讯QQ软件时,你的计算机上同时安装了针对这两个浏览器的插件,可以识别本地已登录QQ号码进而自动登录。本质上,这个现象并不是由Cookie造 成的。
以上详解了关于Cookie的原理及基本概念。或许在日常测试执行中,测试人员只需要运用模 拟工具获取Cookie 发送报文至服务器即可完成接口测试工作。但还是希望大家能够真正理解技术 的本质,做到不单单懂得怎么用,而且要掌握为什么要这么用。这样测试人员不仅可以完成测试 工作,并且可以有充足的技术基础优化测试工作,提高测试效率。