1、 什么是cookie?
在进行一个页面url解析时,常常发现一些不存在于请求数据中的参数,这些参数哪里来的?答案就是cookie。cookie一般保存在请求头中以一个单独的cookies字段保存
上图就是一个典型的请求头,包含一些基础header信息如Accept-Encoding、User-Agent、Host、Content-Type等以及cookies。
2、 cookie的作用
首先必须明确一点,存储cookie是浏览器提供的功能。cookie 其实是存储在浏览器中的纯文本,浏览器的安装目录下会专门有一个 cookie 文件夹来存放各个域下设置的cookie。
当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮我们做的,而且每一次http请求浏览器都会自动帮我们做。这个特点很重要,因为这关系到“什么样的数据适合存储在cookie中”。
存储在cookie中的数据,每次都会被浏览器自动放在http请求中,如果这些数据并不是每个请求都需要发给服务端的数据,浏览器这设置自动处理无疑增加了网络开销;但如果这些数据是每个请求都需要发给服务端的数据(比如身份认证信息),浏览器这设置自动处理就大大免去了重复添加操作。所以对于那设置“每次请求都要携带的信息(最典型的就是身份认证信息)”就特别适合放在cookie中,其他类型的数据就不适合了。
但在 localStorage 出现之前,cookie被滥用当做了存储工具。什么数据都放在cookie中,即使这些数据只在页面中使用而不需要随请求传送到服务端。当然cookie标准还是做了一些限制的:每个域名下的cookie 的大小最大为4KB,每个域名下的cookie数量最多为20个(但很多浏览器厂商在具体实现时支持大于20个)。
3、 cookie的工作过程
cookie是我们设置好的,已我做的项目为例,cookie包含以下内容:
在cookie中保存的内容为了安全经常需要进行加密,因为这些涉及用户的一些个人信息以及服务器的一些秘钥规则,这些数据是在登录时产生的,会一直保存,每次访问登录后页面,浏览器都会将cookie中信息发送至后台进行用户身份校验,只有校验通过才能返回正确数据,否则重定向至那些不需要进行身份校验的页面,比如登录首页。再比如某些网站下载资源需要进行身份校验,只有vip才能下载,那么在post请求时,如果没有正确的cookie数据,就会返回拒绝反馈。
【cookie一般是由后台产生在登录等请求完成后返回保存在浏览器】--------》
【客户端发送请求,浏览器将cookie协同构建url发送给服务器】---------》服务器接收请求参数,解析url,请求头的cookie信息先进行身份校验,校验通过则处理请求数据,返回数据;错误则根据业务逻辑进行处理。
4、 构造cookie
在开发者工具的Console中使用JS document.cookie可以查看到上面图片中的cookie在浏览器中保存格式如下:
以字符串形式链接key=value;各个选项值间以“”;“”分隔。
每个cookie都有一定的属性,如什么时候失效,要发送到哪个域名,哪个路径等等。这些属性是通过cookie选项来设置的,cookie选项包括:expires、domain、path、secure、HttpOnly。在设置任一个cookie时都可以设置相关的这些属性,当然也可以不设置,这时会使用这些属性的默认值。在设置这些属性时,属性之间由一个分号和一个空格隔开。代码示例如下:
expires选项用来设置“cookie 什么时间内有效”。expires其实是cookie失效日期,expires必须是 GMT 格式的时间(可以通过new Date().toGMTString()或者 new Date().toUTCString() 来获得)。
domain是域名,path是路径,两者加起来就构成了 URL,domain和path一起来限制 cookie 能被哪些 URL 访问。
一句话概括:某cookie的 domain为“baidu.com”, path为“/ ”,若请求的URL(URL 可以是js/html/img/css资源请求,但不包括 XHR 请求)的域名是“baidu.com”或其子域如“api.baidu.com”、“dev.api.baidu.com”,且 URL 的路径是“/ ”或子路径“/home”、“/home/login”,则浏览器会将此 cookie 添加到该请求的 cookie 头部中。
所以domain和path2个选项共同决定了cookie何时被浏览器自动添加到请求头部中发送出去。如果没有设置这两个选项,则会使用默认值。domain的默认值为设置该cookie的网页所在的域名,path默认值为设置该cookie的网页所在的目录。
secure选项用来设置cookie只在确保安全的请求中才会发送。当请求是HTTPS或者其他安全协议时,包含 secure 选项的 cookie才能被发送至服务器。
默认情况下,cookie不会带secure选项(即为空)。所以默认情况下,不管是HTTPS协议还是HTTP协议的请求,cookie 都会被发送至服务端。但要注意一点,secure选项只是限定了在安全情况下才可以传输给服务端,但并不代表你不能看到这个 cookie。
httponly选项用来设置cookie是否能通过 js 去访问。默认情况下,cookie不会带httpOnly选项(即为空),所以默认情况下,客户端是可以通过js代码去访问(包括读取、修改、删除等)这个cookie的。当cookie带httpOnly选项时,客户端则无法通过js代码去访问(包括读取、修改、删除等)这个cookie。
在客户端是不能通过js代码去设置一个httpOnly类型的cookie的,这种类型的cookie只能通过服务端来设置。
5、 cookie的应用
在进行接口测试等工作中,经常需要设置cookie,因为访问页面有权限要求,很多用户操作都对用户的属性有要求,因此,构造cookie发送请求才能完成接口测试,下面以python的requests及urlib库进行接口测试举例
其中add_header就是添加请求头的方法。
6、 拾遗
app项目中在app请求中是没有cookie的,直接将cookie的参数放在header里面进行参数传输。