Cookies是web站点放置到你的硬盘上的程序。它们驻留在你的计算机上收集关于你在因特网上所做的一切事情的信息,并且web站点可以在任何时候读取到Cookies收集到的所有信息。关于Cookies的比较恰当的定义: 一个Cookies是web服务器存放在用户硬盘的一段文本,Cookies允许一个wen站点在用户的机器存放一些文本的信息,并可以在以后重新获取它。这个基于文本的信息存储着一些“键-值”对。
Cookie数据是简单的web站点放置在你的硬盘上的“键-值”对的文本,所有的Cookies文件都是如此。Web站点保 存这些数据,然后又可以取回来,一个web站点只能取回它自己存放在你机器的数据,不能看到其它的Cookie,也不能看到你机器上的其它任何东西。
一般来说,Cookie通过HTTP Headers从服务器端返回到浏览器上。首先,服务器端在响应中利用HTTP协议的Set-Cookie header来创建一个Cookie ,然后,浏览器在它的请求中通过Cookie header包含这个已经创建的Cookie,并且将它返回至服务器,从而完成浏览器客户端的认证。
Cookie数据按照下面的方式移动:
1.如果你在你的浏览器中输入了web的硬盘
iis7站长之家,浏览器会象这个URL的web站点发送请求,比如,你在浏览器中输入一下URL:http: //www.169it.com,浏览器会将请求发送到169it的web服务器,请求它的首页。
2.当浏览器发送请求时,它会查看你机器上跟域名www.有关的Cookie文件,如果存在同www.有关的 Cookie,浏览器就会把相关的Cookie“键-值”对数据跟请求一起发送到服务器,如果不存在同www.有关的 Cookie,则浏览器不发送Cookie到服务器。
3.169it的web服务器收到Cookies数据和一个页面的Http请求,如果收到了Cookie“键-值”对,169it的web服务器将能够使用它们。
4.如果没有收到Cookie“键-值”对,169it的web服务器就能知道你以前没有访问过这个站点,服务器建立一个新的用户ID,并在把你所请求的 页面发回到你的浏览器时,把用户ID“键-值”对发送到你的机器,你的硬盘就会驻留了对应这个站点的“键-值”对Cookie。
5.web服务器可以在你访问站点时,随时的更改“键-值”对或者加入一个新的“键-值”对。
6.同“键-值”对发送到客户端的还有同这个“键-值”对相关的一些其它信息,其中之一就是Cookie有效期,另一个就是路径(为了在同一个站点的不同部分关联不同的Cookie)。
你能够控制这个过程,你可以在你的浏览器中设置当web站点向你的机器发送Cookie时你是接受还是拒绝。
Cookies不是一种理想的状态机,但是它的确能够做到许多别的方式不能做到的事,下面是Cookies的一些缺点:
1.人们经常共同使用一台机器
在公共场合使用的任何机器,和在办公室使用的或在家中使用的许多机器都是多人共享的机器。让我们来看你正在使用一台多人使用的机器(例如,在图书馆的机 器)在一个网上商店购买商品,商店的网站将会在这个机器上留下你的一些设置信息,其后又有别人用这台机器到这个网上商店购买商品,这个网站将会提供的是你 的一些设置。
2.Cookies被删除
如果你的浏览器出来问题而寻求技术支持的时候,技术支持者要你做的第一件事就是要求你首先删除你机器上的所有internet临时文件,当你这样做后,你 将丢掉你的所有的Cookies文件。当你再次访问某个站点时,站点将会想你是个新的用户并给你一个新的user ID,你以前在这个站点设置的一些个性设置也将不在存在。
3.使用多个机器
人们在一天之内经常使用不止一台机器,比如,在办公室使用一台机器,在家又使用一台机器,在路上可能使用到笔记本电脑。这样在三台机器上将会用三个不通的 Cookie,同一个人在三台机器上将会被做为三个用户分别对待。
Cookie的保存方式
Internet Explorer 将站点的 Cookie 保存在文件名格式为 <user>@<domain>.txt 的文件中,其中 <user> 是您的帐户名。例如,如果您的名称为 user,您访问的站点为 www.,那么该站点的 Cookie 将保存在名为 user@.txt 的文件中。(该文件名可能包含一个顺序的编号,如 user@ [1].txt。) Cookie 文本文件是与用户相关的,所以会按照帐户分别保存。
Cookie限制
一个 Cookie 会占用大约 50 个字符的基本空间开销(用于保存有效期信息等),再加上其中保存的值的长度,其总和接近 4K 的限制。大多数浏览器只允许每个站点保存 20 个 Cookie 。
为什么选择把信息保存到cookie中
针对session的存储有以下问题:
1、多数的服务器会使用session复制的方法:当session的值被改变时,将它复制到其它机器上。这个方案又有两种具体的实现 ,一种是广播的方式,缺点:
当访问量增大的时候 ,带宽增大,而且随着机器增加,网络负担成指数级上升,不具备高度可扩展性 ;另一种是TCP-ring的方式,也就是把集群中所有的服务器看成一个环,A->B->C->D->A,首尾相接,缺点:一是配置复杂;二是每增添/减少一台机器时,ring都需要重新调整,这将成为性能瓶颈;三是要求前端的Load Balancer具有相当强的智能,才能将用户请求分发到正确的机器上。
2、将session保存在单一的数据源中,这个数据源可被集群中所有的机器所共享 ,但带来了性能问题。
解决方案: 把session以Cookie的形式保存在客户端。
解决方案优点:极高的扩展性和可用性.
通过良好的编程,控制保存在cookie中的session对象的大小。
通过加密和安全传输技术(SSL),减少cookie被破解的可能性。
只在cookie中存放不敏感数据,即使被盗也不会有重大损失。
控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。
解决方案缺点:
Cookie数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。
安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。
有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。