February 26, 2015 ... 评论

关于Cookies的回忆

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109和2965都已废弃,最新取代的规范是RFC6265。

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为"0"或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。

Cookie基本属性

Domain

Cookie的domain属性就是为了让浏览器根据页面请求路径的domain值,获取匹配的cookie,并把这些cookie发送给服务器。匹配规则如下:如果Cookie的domain为abc.com,则域名为abc.com, hello.abc.com, abcd.abc.com,即该域名以及该域名的子域名都可以访问。而如果cookie的domain为hello.abc.com上,则abc.com不可以访问该域名,只有hello.abc.com以及它的子域名可以访问。因此可以说cookie的domain访问权限是向下继承的,即子域名可以访问父域名的cookie而父域名不可以访问子域名的cookie。当然其它域名如autodesk.com等跨域名访问更是不可以的。

Cookie的设置权限同cookie的访问权限差不多,例如hello.abc.com可以将cookie的domain设为hello.abc.com或abc.com而不可以设置到它的子值域名如aaa.hello.abc.com。通常SSO就是将cookie的domain设为最顶级的域名,如autodesk.com,这样所有autodesk的子域名就都可以获取该cookie了。

Path

Path和Domain是两种最常见的限定cookie访问范围的手段,domain是以域名的方式,而path则是以目录的方式,因为很多时候,一个目录下有多个站点而又没办法设子域名时,通常就以目录的方式组织访问多站点,例如company.com/hr, company.com/job,因为概念上和domain很相似,因此访问/设置的限定也差不多:company.com/hr可以将cookie的path设置为company.com/, company/hr,而不可以设为company.com/hr/career或company.com/inside。

Expires - 过期时间

指定cookie的生命期。具体是值是过期日期。如果想让cookie的存在期限超过当前浏览器会话时间,就必须使用这个属性。当过了到期日期时,浏览器就可以删除cookie文件,没有任何影响。其实可以根据过期时间的设定方式把cookie分成两类: 硬盘cookie,是指在你设置了cookie的Expires属性,此时cookie将保存到你的硬盘上,关闭浏览器不会删除cookie,只有等cookie过期后才会被删除; 内存cookie,是指没有设在cookie的Expires的属性,此时cookie将停留在客户端的内存中,关闭浏览器后cookie将被删除,因此这种cookie的生命周期取决于浏览器的打开时间。

删除Cookie

没有直接的方法去删除cookie,如果要删除cookie,只需要将cookie的生命周期改成过去时间,浏览器会把过期的cookie删除掉。

Secure - 安全

指定cookie的值通过网络如何在用户和WEB服务器之间传递。这个属性的值或者是"secure",或者为空。缺省情况下,该属性为空,也就是使用不安全的HTTP连接传递数据。如果一个 cookie 标记为secure,那么,它与WEB服务器之间就通过HTTPS或者其它安全协议传递数据。不过,设置了secure属性不代表其他人不能看到你机器本地保存的cookie。换句话说,把cookie设置为secure,只保证cookie与WEB服务器之间的数据传输过程加密,而保存在本地的cookie文件并不加密。如果想让本地cookie也加密,得自己加密数据。

HttpOnly

HttpOnly表示cookie只允许http请求读取该cookie值,JavaScript无法读取和修改该cookie值,这对于依赖cookie验证的网站来说安全性得到加强。

操作cookie

PHP

//取得cookie
$cookie = $_COOKIE['mycookie'];

//设置cookie
setcookie('mycookie', 'value');

JavaScript

//TODO

评论

(function(){ var bp = document.createElement('script'); bp.src = '//push.zhanzhang.baidu.com/push.js'; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();