读书笔记:HTTP中的Cookie

Cookie来源

Cookie在英文中是小甜饼的意思,这个词我们经常在浏览器中看到,但“小甜饼”怎么会跟浏览器扯上关系呢?

在你浏览以前登录过的网站时可能会在网页中出现“你好,XX”,你会感觉很亲切,就像是吃了一个小甜饼一样。

这其实是通过访问你客户端的一个文件来实现的,因此这个文件也就被称为“小甜饼”了。

Cookie工作机制

当你浏览某网站时,网站服务器会通过在响应消息中设置一个指示信息要求客户端在用户机器上存储一个小文本文件,用来记录你的用户ID、密码、浏览过的网页、停留的时间以及其他浏览或请求过的信息等.

当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作。比如在页面显示欢迎你的标语,或者让你不用再次输入ID、密码就直接登录等。

你可以在IE的“Internet选项”对话框的“常规”选项卡中,选择“设置/查看文件”,查看所有保存到你电脑里的Cookie。

这些文件通常是以user@domain[数字]格式命名的,user是你的本地用户名,domain是所访问的网站的域名。Cookie中的内容大多经过了加密处理,因此我们看到的是一连串看似随机的字母和数字组合,只有服务器处理程序才知道它们真正的含义。

Cookie的工作机制是怎样的?

当用户在浏览器中输入URL,这时浏览器便会向网站主机发送一个读取网页的请求,在这个请求发送出去之前,浏览器先查看本地是否保存有此网站的Cookie文件。

如果发现了Cookie文件,则将Cookie文件中的信息(一般都进行了加密)放在请求消息Cookie头中一起发送给服务器;如果没有发现Cookie文件,则不会发送任何Cookie信息。

假设客户端在发送请求时没有Cookie信息,网站服务器会认为用户是第一次访问这个网站,因此为用户在数据库中设置一个用户ID,并记录与这次访问相关的一些信息(比如最近访问时间),然后服务器将用户ID和访问相关的信息包含在响应消息中返回给客户端(通过设置Set-Cookie扩展头来包含这个信息),客户端将获得的用户ID和这些信息保存在本地的一个Cookie文件里。

如果客户端在发送请求时本地有Cookie文件,则把Cookie信息也发送给服务器,服务器收到Cookie信息后会根据里面的用户信息(比如用户ID)去检索数据库中保存的对应信息。服务器在数据库中找到用户相关的信息后,会根据这次请求消息更新数据库中的信息,基于更新后的数据库信息返回一个专门针对这个用户的页面,同时返回的还有服务器更新过后的Cookie信息,客户端保存的Cookie文件将得到更新(比如“最近访问时间”发生了更新)。

Cookie的传递过程如下图所示:

Cookie安全性

值得注意的是,Cookie包含哪些信息不是规范的,各个网站都会有自己的保存内容:

由于Cookie保存在客户端,存在一定的安全隐患,所以越来越多的网站趋向于尽量减少Cookie中包含信息的数量,很多网站只是将服务器生成的用户ID保存在Cookie文件中,而与用户相关的其他信息都保存在服务器的数据库中。

服务器要求客户端保存的Cookie信息传送到浏览器后,浏览器会根据本地的设置来决定是否保存Cookie文件。

如果浏览器本地不允许保存Cookie,那么浏览器在关闭后Cookie文件自动删除;如果允许保存,则Cookie文件在浏览器关闭后还会保存一段时间,这段时间的大小是由服务器在发送Cookie信息时就决定好的,主要通过服务器处理软件在Cookie信息的Expiration(有效期)属性中进行指示,如果这个属性没有被设置,则浏览器默认此Cookie文件是不被保存的,即浏览器关闭后就删除。

Cookie在RFC 2965中进行描述,每个客户端最多保持300个Cookie,每个域名下最多20个Cookie(实际上一般浏览器现在都比这个多,如Firefox是50个),而每个Cookie的大小最大为4KB。

对于Cookie的使用,最重要的就是要控制Cookie的大小,不要放入无用的信息,也不要放入过多的信息,特别是一些很敏感的信息,因为Cookie并不那么安全。

Cookie文件保存在用户的机器中,而由于用户机器的安全级别往往较低,所以被恶意软件嗅探、篡改的几率就会大很多。

如果Cookie文件含有用户ID和密码等敏感信息且又没有做加密处理,这部分信息将很容易暴露出去。即使Cookie文件在本地保存时做了加密处理,攻击者也可以通过用户机器的其他漏洞获取此文件,然后进行暴力破解来获取关键数据。

另外,Cookie信息通过请求消息从客户端发送到服务器的过程中,攻击者会从网络中截获这部分信息。虽然这部分信息往往已经通过MD5加密,但攻击者可以不需要解密这部分信息,而是通过套用这个Cookie信息来冒充真正用户骗取服务器的信任,这种方法称为Cookie欺骗。

所以,鉴于Cookie存在一定的安全风险,很多浏览器都有选项供用户禁用Cookie。