我正在参加「掘金·启航计划」
Cookie介绍
管理服务器与客户端之间状态的 Cookie ,虽然没有被编入标准化 HTTP /1.1的RFC2616中,但在 Web 网站方面得到了广泛的应用。
Cookie 的工作机制是用户识别及状态管理。 Web 网站为了管理用户的状态会通过 Web 浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该 Web 网站时,可通过通信方式取回之前存放的 Cookie 。
调用 Cookie 时,由于可校验 Cookie 的有效期,以及发送方的域、路径、协议等信息,所以正规发布的 Cookie 内的数据不会因来目其他 Web 站点和攻击者的攻击们泄露。
至2013年5月,Cookie的规格标准文档有以下4种:
- 由网景公司颁布的规格标准
- RFC2109
- RFC2965
- RFC6265
目前使用最广泛的 Cookie 标准却不是 RFC 中定义的任何一个。而是在网景公司制定的标准上进行扩展后的产物。
接下来就对目前使用最为广泛普及的标准进行说明。下面的表格内列举了与 Cookie 有关的首部字段。
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所使用的Cookie信息 | 响应首部字段 |
Cookie | 服务器接收到的Cookie信息 | 请求首部字段 |
Set-Cookie
Set-Cookie : status = enable ; expires = Tue ,05 Jul 2011 08:32:21 GMT ; path =/; domain =.hackr.jp ;
当服务器准备开始管理客户端的状态时,会事先告知各种信息。下面的表格列举了 Set - Cookie 的字段值。
属性 | 说明 |
---|---|
NAME=VALUE | 赋予Cookie的名称和其值(必须项) |
expires=DATE | Cookie的有效期(如不明确指定则默认为浏览器关闭前为止) |
path=PATH | 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录) |
domain=域名 | 作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名) |
secure | 仅在HTTPS安全通信时才会发送Cookie |
HttpOnly | 加以限制,使Cookie不能被JavaScript脚本访问 |
expires属性
Cookie 的 expires 属性指定浏览器可发送 Cookie 的有效期
当省略 expires 属性时,其有效期仅限于维持浏览器会话( Session )时间段内。这通常限于浏览器应用程序被关闭之前。
另外,一旦 Cookie 从服务器发送至客户端,服务器端就不存在可以显式删除 Cookie 的方法。但可通过覆盖已过期的 Cookie ,实现对客户端 Cookie 的实质性删除操作。
path 属性
Cookie 的 path 属性可用于限制指定 Cookie 的发送范围的文件目录。不过另有办法可避开这项限制,看来对其作为安全机制的效果不能抱有期待。
domain 属性
通过 Cookie 的 domain 属性指定的域名可做到与结尾匹配一致。比如,当指定 example . com 后,除 example . com 以外, www . example . com 或www2.example. com 等都可以发送 Cookie 。
因此,除了针对具体指定的多个域名发送 Cookie 之外,不指定domain 属性显得更安全。
secure 属性
Cookie 的 secure 属性用于限制 Web 页面仅在 HTTPS 安全连接时,才可以发送 Cookie 。
发送 Cookie 时,指定 secure 属性的方法如下所示
Set - Cookie : name = value ; secure
以上例子仅当在 https :// www . example . com /( HTTPS )安全连接的情况下才会进行 Cookie 的回收。也就是说,即使域名相同,https :// www . example . com /( HTTP )也不会发生 Cookie 回收行为。
当省略 secure 属性时,不论 HTTP 还是 HTTPS ,都会对 Cookie 进行回收。
HttpOnly 属性
Cookie 的 HttpOnly 属性是 Cookie 的扩展功能,它使 JavaScript 脚本无法获得 Cookie 。其主要目的为防止跨站脚本攻击( Cross - site scripting , XSS )对 Cookie 的信息窃取。
发送指定 HtpOnly 属性的 Cookie 的方法如下所示。
Set - Cookie : name = value ; HttpOnly
通过上述设置,通常从 Web 页面内还可以对 Cookie 进行读取操作。但使用 JavaScript 的 document.cookie 就无法读取附加 HtpOnly 属性后的 Cookie 的内容了。因此,也就无法在 XSS 中利用 JavaScript 劫持 Cookie 了。
虽然是独立的扩展功能,但 Internet Explorer 6 SP1 以上版本等当下的主流浏览器都已经支持该扩展了。另外顺带一提,该扩展并非是为了防止 XSS 而开发的。
Cookie
Cookie : status=enable
首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie 。接收到多个Cookie 时,同样可以以多个 Cookie 形式发送