什么是cookie?
我们都知道,Http的特点是无状态,无连接,服务器但从网络连接上是无法知道用户的身份,那么怎么办呢? 所以它就会给每个客户端的用户颁发一个通行证,这样服务器就能从这个通行证确认客户的身份了,这个通行证就是cookie~客户端请求服务器的时候,如果服务器需要记录这个用户状态,就使用response向客户端浏览器发一个小cookie,客户端浏览器会把这cookie保存起来,再次请求时就带着cookie一同提交给服务器,以此来辨认用户状态。
cookie的基本工作原理
cookie主要是通过报头HTTPHeader来传递数据,也就是在请求头和消息头里面传递数据,cookie机制有两种报头,set-cookie和cookie。set-cookie存在服务器响应的消息头中, cookie则存在于客户端请求的消息头中。(图片来自网上)
<br style="box-sizing: border-box;"/>
(1)客户端在浏览器输入URL,发送读取网页的请求。
(2)服务器接收到请求后,产生一个Set-Cookie报头,放在HTTP报文中一起回传客户端,发起一次会话。
(3)客户端收到应答后,若要继续该次会话,则将Set-Cookie中的内容取出,形成一个Cookie.txt文件储存在客户端计算机里。
(4)当客户端再次向服务器发出请求时,就在电脑里找该网站的Cookie.txt。根据此Cookie.txt产生Cookie报头,放在HTTP请求报文中发给服务器。
(5)服务器接收到包含Cookie报头的请求,检索其Cookie中与用户有关的信息,生成一个客户端所请示的页面应答传递给客户端。 浏览器的每一次网页请求,都可以传递已存在的Cookie文件,如浏览器的打开或刷新网页操作。
cookie格式
Cookie由变量名和值组成,格式如下:
Set-Cookie: "name=value;domain=domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;secure"其中name=value是必选项,其它都是可选项。
- name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。- value:cookie的值。最好为cookie的name和value进行url编码- domain:cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域,也可以不包含,举个栗子a: a.qqq.com ,b: b.qqq.com 如果域a生产一个能在a和b都访问的cookie 就要将cookie的domain设置为qqq.com。- path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/cd/,那么test下的所有页面都可以访问到cookie1,而/test/和/test/dd/的子页面不能访问cookie2。这是因为cookie能让其path路径下的页面访问。- expires:失效时间, 它确定了Cookie有效终止日期,何时应该停止向服务器发送这个cookie。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie。- secure: 安全标志,指定后只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure属性也并不代表他人不能看到你机器本地保存的 cookie 信息。 查看cookie:
我们可以在浏览器中查看我们的cookie,在设置-隐私设置和安全性-内容设置-cookie-查看所有cookie和网站数据,来查看我们在当前浏览器上所有的cookie,如下图 可以在chrome中查看百度的cookie
也可以通过浏览器F12查看当前的cookie,在F12后,network-cookie中查看对应的cookie:
跳转的cookie:
代码语言:txt复制 在广告业务的测试中,我们经常需要从admin平台跳转到某一个账户的投放平台上,admin平台的url:admin.test.123.cn ,投放平台的url:test.123.cn。 那么为什么我们可以从一个平台跳转到另一个平台而不用登陆呢? 因为我们有神奇的小饼干—cookie哦!
代码语言:txt复制 因为我们在admin.test.123.com上登录的时候,会在test.123.cn上种cookie,当我们在跳转到平台的时候,这个cookie的域没有变,仍是test.123.cn 所以平台是可以直接登录,而不用再次输入用户名密码。
代码语言:txt复制 有的时候我们在业务线测试中,需要模拟登录,从a.qihoo.net 模拟登录跳转到 test.e.360.cn ,域名不一样,为什么也是可以直接跳转,不需要输入用户名密码呢? 因为header跳转可以给其他站点设置cookie,为啥捏? 举个例子吧~
1 在 http://a.com/test.php代码:
header('location:http://b.com/test.php');
2 在http://b.com/test.php的代码:
setcookie('name','qqq',time() 3600);
代码语言:txt复制 在访问a.com/test.php 的时候 我们发现页面会跳转到b.com/test.php 并且在b.com上设置了cookie,过程可以理解为浏览器请求a.com/test.php 的时候a.com服务器返回302给浏览器,浏览器拿到相应消息头的location,存到内存中后,此时浏览器与a.com的通信过程其实就结束了,也就是一个请求与相应就结束了,然后浏览器拿着location地址重新请求b.com/test.php ,所以我们就可以看到浏览器跳转的画面了,此时b.com返回给浏览器相应消息头里面有set-cookie 的消息,那么浏览器得到这个cookie信息生成的文件就会存放到浏览器中的目录下了。可以理解为如下所示的过程:
在实际业务中,我们需要从a.qihoo.net模拟登录跳转到test.e.360.c,所以这个过程可以理解为:从a.qihoo.net 模拟登录跳转到 test.e.360.cn,实际上是我们从a.qihoo.net上location到test.e.360.cn上,并在e.360.cn上种了cookie,这个cookie信息通过加密,所以我们就可以不用登录直接可以跳转了 。在实际业务中是怎么保证加密安全的呢?一般会用到第三方的服务,从a.qihoo.net平台跳转到test.e.360.cn平台的时候,可以带一个token值,这个值是a.qihoo.net平台用了一个oauth服务,通过用户名密码得到的一个值,传给了test.e.360.cn平台,它在接到这个token值后也使用了这个服务去解密,得到用户名密码, 这样就可以种这个用户名和密码的cookie了~ 实现跳转啦~
<br style="box-sizing: border-box;"/>
Q
<br style="box-sizing: border-box;"/>