好奇怪,cookie每人都知道,但在面试中正能回答个一二三的还真不多,能问倒一大片,下面是有关cookie的知识点。

大家都知道http是无状态的,也就是说在一个没有cookie技术的纯请求中,服务器分不清谁请求了,以及这次请求和上次什么关系,这导致无法标识是否登录,等等所有常规功能。如果说互联网是个随进随出的商场的话,那么cookie则相当于每个请求的帽子,这个帽子标识了每个请求的身份,且这个帽子服务器可以种植,客户端(浏览器)也可以种植。

cookie的样子

cookie是一段文本,之所以在浏览器中看到呈现key、value的形式,是因为保存的这段文本中是以“=”和“;”隔开的,浏览器调试工具下输入documen.cookie就能看到。

cookie的种植

上文说道,cookie的种植有两种方式,服务端和客户端,服务器返回请求内容的时候用Set-Cookie在客户端下种植cookie,也可以用浏览器的方式js手动种植,比如:documen.cookie = “key = value”;一旦cookie种植后,因同源策略,在同源下的所有请求都会带上cookie,从浏览器的开发者工具中查看:

有一点需要注意,浏览器js有个属相不能设置,那就是HttpOnly 属性,服务端设置HttpOnly属性后,在浏览器通过documen.cookie则不能读取cookie,相对来说增加了一层安全性,提高了破解难度,但也不是万能的。

cookie存在哪?

cookie是一段文本,并存在本地,那具体在哪里呢?
chrome是放在:~/Library/Application\ Support/Google/Chrome/Default/Cookies目录下,火狐则放在~/Library/Application\ Support/Firefox/Profiles/t22mmcz1.default/cookies.sqlite目录下,这些都是肉眼可看到的实实在在的文本,没什么神秘感。

cookie常用的属性

  • expires:设置cookie的过期时间
  • domain:指定 cookie 将要被发送至哪个或哪些域中
  • path:指定了请求的资源 URL 中必须存在指定的路径时,才会带相应cookie
  • secure:是否要求https
  • HttpOnly:告知浏览器该 cookie 不能通过 JavaScript 的document.cookie访问

cookie的容量

既然cookie能携带信息,那到底能携带多少呢?官方给出的标准是4096,但实际情况则要看浏览器了,重要的是每人会愿意在cookie上携带大量信息,因为cookie每次请求都会默认带上,如果很大,则增加了请求开销。

同源限制

ajax请求有同源策略,cookie也要,一个cookie又要起对应生效的域名地址,仅在本域名下才能生效,

同源策略导致的问题

印绶同源策略,导致cookie不能共享,但一个大公司下的各个平台往往需要靠二级域名来区分,但对用户来说,一个账号要登录所有平台,这就导致一个问题,每个二级域名的子系统下都要登录一次?那用户岂不要疯掉,比如,你登录的新浪邮箱,当你进去微博时,提示你请登录,当你进入新浪博客时再提醒你登录。。。。,那该怎么解决该问题呢?

单点登录 SSO(Single Sign On)

单店登录解决了上述问题,用户只需在一个子系统处登录,则全站任何子系统都不用再重新登录,具体原理是:建立独立的认证中心SSO server,认证中心独立于各个站点,用来统一验证并管理登录,具体不走如下:

  • 用户在站点A输入用户名和密码点击登录 站点A将用户名和密码转发给认证中心进行认证,认证中心返回Token
  • 站点A将当前登录用户和Token存入Session(或Cookie) 在站点A上点击连接访问站点B,通过URL参数方式,将Token带给站点B
  • 站点B将Token转交到认证中心,认证正确,返回当前用户名。 站点B将当前登录用户和Token存入Session(或Cookie)
  • 完成登录流程

cookie的安全问题

既然在请求中用cookie标志了用户,那么如果劫持获取了cookie,就能伪造真实用户做出假冒行为,常见的攻击比如:
CSRF:跨站请求伪造(英语:Cross-site request forgery),通常缩写为 CSRF 或者 XSRF, 是 种冒充 户发起请求(在 户 知情的情况下),完成 些违背 户意愿的请求(如恶意发 帖,删帖,改密码,发邮件等)。

之前文章中介绍的爬虫,在爬取需要登录的页面信息时,其实也是借用别的cookie发送的请求,和CSRF的原理是一样的。

注明的Apache服务器曾经就有一个有关cookie的漏洞,具体如下:

Apache服务器2.2.0-2.2.21版本存在一个漏洞(CVE-2012-0053),攻击者可通过给网站植入超大的Cookie,使得HTTP头超过apache的LimitRequestFieldSize(最大请求长度)4192字节,apache便会返回400错误,状态页中就包含了http-only保护的cookies。

简单的说就是:Apache服务器咋就cookie过多时,返回的报错信息中包含了http-only。