定义
HTTP 头字段包括
- 通用头字段(general-header),
- 请求头字段(request-header),
- 响应头字段(response-header),
- 实体头字段(entity-header)。
每个头字段包括字段名与字段只,以冒号:分隔。其中字段名大小写不敏感
HTTP首部字段类型
HTTP首部字段定义成缓存代理和非缓存代理的行为,分成两种类型
1、端到端首部(End-to-end Header)
该类首部会转发给请求/响应对应的最终接收目标, 且必须保存在由缓存生成的响应中,另外规定它必须被转发
2、逐跳首部(Hop-by-Pop Header)
该类首部支队单次转发有效,会因通过缓存或代理而不转发,HTTP1.1和之后的版本中,如果要使用这类首部,需要提供Connection首部字段
[Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade]
除了这8个之外 其他都是端到端首部
不同字段的介绍
1、通用头字段(9个)
通用头字段对于HTTP请求和响应均可用,用来描述HTTP消息(HTTP message)本身, 不可用来描述被传输的实体(HTTP entity)。共9个:
- Cache-Control: 控制缓存的行为;指定整个请求链中必须遵循的缓存指令,是单向的。其值包括max-age,no-cache等,多个指令可用逗号隔开.例如 cache-contro: private,max-age=0,no-cache
缓存请求指令
1⃣️no-cache: 强制向源服务器再次验证
2⃣️no-store、: 不缓存请求或者响应的任何内容
3⃣️max-age=[秒]、: 响应的最大age值
4⃣️max-stale=([秒])、: 接收已过期的响应
5⃣️min-fresh=[秒]、: 期望在指定时间内的响应仍然有效
6⃣️no-transform、: 代理不可更改媒体类型
7⃣️only-if-cached、: 从缓存获取资源
8⃣️cache-extension : 新指令标记
缓存响应指令
1⃣️public: 可向任意一方提供响应的缓存
2⃣️private: 仅向任意用户提供响应
3⃣️no-cache、: 缓存前必须先确认其有效性
4⃣️no-store、: 不缓存请求或响应的任何内容
5⃣️no-transform: 同上6⃣️
6⃣️must-revalidate: 可缓存但必须再向源服务器进行确认
7⃣️proxy-revalidate: 要求中间的缓存服务器 对缓存 的有效性再进行确认
8⃣️max-age=[秒]、: 同上3⃣️
9⃣️s-maxage=[秒]、: 公共缓存服务器响应的最大age值(仅适用供多位用户使用的公共缓存服务器、使用这个字段可以直接忽略exprise字段及max-age指令的使用)
cache-extension: 新指令标记(token)
下图是表示Cache-Control的一些状态
一、表示是否能缓存的指令是:
缓存响应指令:1⃣️、2⃣️、3⃣️; 缓存请求指令:1⃣️
二、控制可执行缓存的对象的指令:
缓存响应指令:4⃣️; 缓存请求指令:2⃣️
三、指定缓存期限和认证的指令
缓存响应指令:9⃣️、8⃣️、6⃣️、7⃣️、5⃣️;缓存请求指令:3⃣️、5⃣️、4⃣️、7⃣️、6⃣️
-
Connection:逐跳首部、连接的管理;发送者用来指定连接选项,属于hop by hop头字段,不可被代理传递。例如Websocket建立连接时的Handshake HTTP Request,包含Connection: upgrade与Upgrade: Websocket头字段。
作用:
控制不再转发给代理的首部字段、Connection:不再转发的首部字段;例如(Upgrade)
管理持久连接Connection:keep-Alive表示保持连接Connection:close表示关闭连接
-
Date:创建报文的日期时间;请求或响应的时间和日期。
例如:Date : Tue, 03 Jul 2012 04:22:59 GMT
-
Pragma:报文指令;用来指定实现相关(implementation-specific)的指令,例如:Pragma: no-cache。
http1.1之前遗留的字段,只用在客户端发送的请求中,客户端要求所有的中间服务器不返回缓存的资源
-
Trailer: 报文末端的首部一览;
例如 trailer:Exprise;Exprise:Tue, 28 Sep 2004 23:59:59 GMT,表示指定首部字段Trailer 的值为Expires
-
Transfer-Encoding:指定报文主体的传输编码方式;为了使消息安全到达,HTTP消息经过了何种转换
例如 Transfer-Encoding: chunked,HTTP/1.1的传输编码发誓仅对分块传输编码有效
-
Upgrade: 升级为其他协议;
用于检测HTTP及其他协议是否可以使用更高版本的协议进行通信使用
使用该字段,还需要额外指定Connection: upgrade
对于附有该字段的请求,服务器可用101Switching Protocols状态码作为响应返回
-
Via:代理服务器的相关信息;HTTP消息传送期间经过了何种协议或代理,网关和代理必须实现该字段。
如Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)。
用于追踪客户端和服务器之间的请求和响应报文的传输路径,还可避免请求回环的发生,故必须在经过代理的时候附加该首部字段的内容
例如一个请求从浏览器出发(假设使用http/1.0),发送给名为 SomeProxy的内部代理,然后被转发至www.somenet.com的公共代理(使用http/1.1),最后被转发至目标服务器www.someweb.com,那么在someweb.com中收到的via 头应该是:via:1.0 someProxy 1.1 www.someweb.com
-
Warning: 错误通知
Warning 首部的格式如下。最后的日期时间部分可省略。
Warning: [警告码] [警告的主机 : 端口号] “[警告内容]” ([日期时间])
HTTP/1.1 中定义了7种警告。警告码对应的警告内容仅推荐参考。另外,警告码具有扩展性,今后有可能追加新的警告码。
警告码列表
警告码 警告内容 说明
110 Response is stale (响应已过期) 代理返回已过期的资源
111 Revalidation failed (再验证失败) 代理再验证资源有效性时失败(服务器无法到达等原因)
112 Disconnection operation (断开连接操作) 代理与互联网连接被故意切断
113 Heuristic expiration (试探性过期) 响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下)
199 Miscellaneous warning (杂项警告) 任意警告内容
214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时
299 Miscellaneous persistent warning(持久杂项警告)任意的警告内容
2、请求首部字段(19个)
[请求首部字段是从客户端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。]
- Accept:用户代理可处理的媒体类型; 可接受的应答的媒体类型,可使用通配符*。
`Accept: autio/*; q=0.2, autio/basic`
最好是basic音频,如果没有的话任何音频都可以接受;q=0.2表示
- 文本类型: text/html、text/plain、text/css、appllication/xhtml+xml、application/xml
- 图片类型: image/jpeg、image/gif、image/png
- 视频文件: video/mpeg、video/quicktime
应用程序使用的二进制文件: application/octet-strea、application/zip
- Accept-Charset:优先的字符集; 可接受的应答的字符集。用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。应用于内容协商机制的服务器驱动协商。与首部字段 Accept 相同的是可用权重 q 值来表示相对优先级。
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
最好是iso-8859-5,不过unicode-1-1也还好(80%的质量)
- Accept-Encoding:优先的内容编码; 可接受的应答的内容编码。用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
- identity表示不执行压缩或不会变化的默认编码格式
- deflate 表示组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式。
- compress 表示由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel-Ziv-Welch 算法(LZW)
- gzip 表示由文件压缩程序 gzip(GUN zip)生成的编码格式(RFC1952),采用 Lempel-Ziv 算法(LZ77)及32位循环冗余校验(Cyclic Redundancy Check,通称 CRC)
- Accept-Language:优先的语言(自然语言); 可接受的应答的自然语言集合。用来告知服务器用户代理能够处理的自然语言集(指中文或者英文等),以及自然语言集的相对优先级。
Accept-Language: da, en-gb;q=0.8, en;q=0.7
- Authorization:Web认证信息; 用户想要让服务器给自己授权,通常在接受到401之后发生。是用来告知服务器,用户代理的认证信息(证书值);通常,想要通过服务器认证的用户代理会在接受到返回的401状态码响应后,把首部字段 Authorization 加入请求中。公众缓存在接受到含有 Authorization 首部字段的请求时的操作处理会略有差异。
- Expect:期待服务器的特定行为; 客户需要的服务器行为。是客户端用来告知服务器,期望出现的某种特定行为。因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码 417 Expectation Failed。
该字段是逐跳发生的,即代理如不能满足该期望应返回417;但请求头是端到端的,该请求仍然必须被转发。
- From:用户的电子邮箱地址; 该字段应为控制发送请求的HTTP代理(agent)的用户电子邮箱名。
- Host:请求资源所在服务器; 目标主机名与端口,来自URI。
- If-Match:你叫实体标记(ETag); 与HTTP方法一起用,使得条件性执行该方法。条件为该实体匹配该列表,即没有发生用户所不知道的变化。
在HTTP中,质量值qvalue作为协商参数的限定符,表示客户端认为该参数的重要性(权重)。如果一个参数qvalue为0,表示该参数对客户端来讲是不可接受的。参数之间用,分隔,参数值与质量值之间用;分隔。
- If-Modified-Since : 比较资源的更新时间;
用于确认代理或客户端拥有本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段 Last-Modified 来确定
如果 If-Modified-Since 字段指定的日期时间后,资源发生了更新,服务器会接受请求
- If-None-Match : 比较实体标记(同If-Match 相反)
只有在 If-None-Match 的字段值与 ETge 值不一致时,可处理该请求。
首部字段 If-None-Match 属于附带条件之一。它和首部字段 If-Match 作用相反。用于指定 If-None-Match 字段值的实体标记(ETge)值与请求资源的 ETge 不一致时,它就会告知服务器处理该请求。
在 GET 和 HEAD 方法中使用首部字段 If-None-Match 可获取最新的资源。因此,这与使用首部字段 If-Modified-Since 时有些类
- If-Range : 资源未更新时发送实体Byte的范围请求
该字段值若是和Etag值或者更新的日期时间匹配一致,那就作为范围请求处理,如果不一致,则忽略请求范围,返回全部资源
如果不使用 If-Range 时,则需要进行两次请求
服务器端的资源如果更新,那客户端持有资源中的一部分也会随之无效,当然,范围请求作为前提也是无效的。这时,服务器会暂且以状态码 412 Precondition Failed 作为响应返回,其目的是催促客户端再次发送请求。这样一来,与使用首部字段 If-Range 比起来,就需要花费两倍功夫。
- If-Unmodified-Since: 比较资源的更新时间(与If-modified-Since相反)
首部字段 If-Unmodified-Since 和首部字段 If-Modified-Since 的作用相反。它的作用就是告知服务器,指定的请求资源只有在字段值内定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则以状态码 412 Precondition Failed 作为响应返回。
- Max-Forwards : 最大传输逐跳数
例如:Max-Forwards: 2
通过 TRACE 方法或 OPTIONS 方法,发送含有首部字段 Max-Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,会将 Max-Forwards 的值减一后重新赋值。当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发。而是直接返回响应。
使用 HTTP协议通信时,请求可能会经过代理等多台服务器。途中,如果代理服务器由于某些原因导致请求转发失败,客户端也就等不到服务器返回的响应了。对此,我们无从可知。
可以灵活使用首部字段 Max-Forwards 字段值为 0 ,服务器就会立即返回响应,由此我们至少可以对以那台服务器为终点的传输路径的通信状况有所把握
- Proxy-Authorization: 代理服务器要求客户端的认证信息
例如:Proxy-Authorization: Basic YWRtaW4lM0FhZG1pbg==
接受到从代理服务器发来的认证质询时,客户端会发送包含首部字段 Proxy-Authorization 的请求,以告知服务器认证所需要的信息。
这个行为是与客户端和服务器之间的HTTP访问认证相类似的,不同之处在于,认证行为发生在客户端与代理之间。客户端与服务器之间的认证,使用首部字段 Authorization 可起到相同作用
- Range: 字体的字节范围请求
例如: Range: bytes=5001-10000
对于只需获资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围。上面的示例表示请求获取从第 5001 字节到第 10000 字节的资源。
接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。
- Referer: 对请求中URI的原始获取方
只要查看 Referer 就能知道请求的 URI 是从哪个 Web 页面发起的
Referer: http://www.example.com/index.html
客户端一般都会发送 Referer 首部字段给服务器。但当直接在游览器的地址输入 URI ,或处于安全考虑时,也可以不发送该首部字段。
因为原始资源的 URI 中的查询字符串可能包含 ID 或密码等保密信息,要是写进 Referer 转发给其他服务器,则有可能导致保密信息的泄露。
另外,Referer 的正确拼写应该是 Referrer ,但不知为何,大家一致沿用这个错误的拼写。
- TE: 传输编码的优先级
例如:TE: gzip, deflate; q=0.5
首部字段 TE 会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很像,但是用于传输编码。
首部字段 TE 除指定传输编码之外,还可以指定伴随 trailer 字段的分块传输编码的方式。应用后者时,只需把 trailer 赋值给该字段值。
TE: trailers
- User-Agent: HTTP客户端程序的信息
例如:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
首部字段 User-Agent 会将创建请求的游览器和用户代理名称等信息传达给服务器。
由网络爬虫发起请求时,有可能会在字段内添加爬虫的电子邮件地址。此外,如果经过代理,那么中间也很可能被添加上代理服务器的名称。
3、响应首部字段(9个)
[响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息/服务器信息,以及对客户端的附加要求等信息]
- Accept-Ranges : 是否接受字节范围请求
例如Accept-Ranges: bytes
当不能进行范围请求处理时 Accept-Ranges: none
首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求,以指定获取服务器某个部分资源。
可指定的字段值有两种,可处理范围请求时指定其为 bytes ,反之则指定为 none。
- Age :推算资源创建经过时间
例如: Age: 600
首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值单位为秒。
若创建该响应的服务器是缓存服务器,Age 值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段 Age。
- ETge: 资源的匹配信息
Tge: "fa082-57b5144e55180"
首部字段 ETge 能够告知客户端实体标识。它是一种可将资源以字符串形式做唯一标识的方式。服务器会为每份资源分配对于的 ETge 值时,
另外,当资源更新时,ETge 值也需要更新。生成 ETge 值时,并没有统一的算法规则,而是仅仅由服务器来分配。
资源被缓存时,就会被分配唯一性标识。例如,当使用中文版的浏览器访问 http://www.google.com 时,就会返回中文版对于的资源,当时有英文版版时,返回的就是英文版资源,两者的 URI 是相同的,所以仅凭 URI 指定缓存的资源是相当困难的。若在下载过程中出现连续中断/再连接的情况,都会依照 ETge 值来指定资源。
强 ETge 值,不论实体发生多少细微的变化都会改变其值。
ETge: “usagi-1234”
弱 ETge 值只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETge 值。这时,会在字段值最开始处附加 W/ 。
ETge: W/“usagi-1234”
- Location :令客户端重定向至指定 URI
使用首部字段 Location 可以将响应接受方引导至某个与请求 URI 位置不同的资源。
基本上,该字段会配合 3xx : Redirection 的响应,提供重定向的 URI。
几乎所有的游览器在接受到包含首部字段 Location 的响应后,都会强制性地尝试对已提示的重定向资源的访问。
- Proxy-Authenticate :代理服务器对客户端的认证信息
例如:Proxy-Authenticate: Basic realm=“Usagidesign Auth”
首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。
它与客户端和服务器之间的 HTTP 访问认证的行为相似,不同之处在于其认证行为是在客户端与代理之间进行的。而客户端与服务器之间进行认证时,首部字段 WWW-Authorization 有着相同的作用
- Retry-After :对再次发送请求的时机要求
Retry-After : 120
首部字段 Retry-After 告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用。
字段值可以指定为具体时间(Wed, 04 Jul 2012 06: 34: 23 GMT 等格式),也可以是创建响应后的秒数
Server : Apache/2.2.17 (Unix)
首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。不单单会标出服务器上的软件应用名称,还有可能包含版本号和安装时启用的可选项。
Server: Apache/2.26 (Unix) PHP/5.2.5
注意一点,一旦自己服务器使用的为旧版本,并且漏洞已经被放出来的,最好在隐藏此字段或者自己随意改个名称,以防有人使用已知漏洞攻击服务器
- Vary :代理服务器缓存的管理信息
例如: Vary: Accept-Language
首部字段 Vary 可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的指令。
从代理服务器接受到源服务器返回包含 Vary 指定项的响应之后,若再要进行缓存,仅对请求中含有相同 Vary 指定首部字段的请求返回缓存。即使对相同资源发起请求,但由于 Vary 指定的首部字段不相同,因此必须要从源服务器重新获取资源。
- WWW-Authenticate :服务器对客户端的认证信息
WWW-Authenticate: Basic realm=“Usagidesign Auth”
首部字段 WWW-Authenticate 用于 HTTP 访问认证。它会告知客户端适用于访问请求 URI 所指定资源的认证方案( Basic 或是 Digest )和带参数提示的质询(challenge)。状态码 401 Unauthorized 响应中,肯定带有首部字段 WWW-Authenticate 。
上述示例中,realm 字段的字符串是为了辨别请求 URI 指定资源所受到的保护策略
实体首部字段(10个)
[实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体时间相关的信息]
- Allow :服务器支持的HTTP请求方法
Allow : GET,HEAD
首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。 当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。与此同时,还会把所有能支持的 HTTP 方法写入首部字段 Allow 后返回。
- Content-Encoding :编码方式
Content-Encoding: gzip
首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。
主要采用以下4种方式:gzip、compress、deflate、identity
- Content-Language :实体主体使用的自然语言
ontent-Language: zh-CN
首部字段 Content-Language 会告知客户端,实体主体使用的自然语言(指中文或英文等语言)。
- Content-Length :实体部分大小
Content-Length: 15000
首部字段 Content-Length 表明了实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用 Content-Length 首部字段。由于实体主体大小的计算方式略微有些复杂,所以在此不再展开。
- Content-Location :返回资源的URI
Content-Location: httpo://www.example.com/index.html
首部字段 Content-Location 给出与报文主题部分相对应的URI。和首部字段 Location 不同, Content-Location 表示的是报文主体返回资源对应的 URI。
比如,对于使用首部字段 Accept-Language 的服务器驱动型请求,当返回的页面内容与实际请求的对象不同时,首部字段 Content-Location 内会写明 URI。
- Content-MD5 :主体执行md5算法
Content-MD5: ZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2U=
首部字段 Content-MD5 是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
对报文主体执行 MD5 算法获得218位二进制数,再通过 Base64 编码后将结果写入 Content-MD5 字段值。由于 HTTP 首部无法记录二进制值,所以要通过 Base64 编码处理。为确保报文有效性,作为接受方的客户端会对报文主体在执行一次相同的MD5算法。计算出的值与字段值作比较候鸟,即可判断出报文主体的准确性。
采用这种方法,对内容上的偶发生性改变是无从查证的,也无法检测出恶意篡改。其中一个原因在于,内容如果能够被篡改,那么同时意味着 Content-MD5 也可重新计算然后被篡改。所以处在接受阶段的客户端是无法意识到报文主体以及首部字段 Content-MD5 是已经被篡改过的。
- Content-Range :范围请求
Content-Range: bytes 5001-10000/10000
针对范围请求,返回响应时使用的首部字段 Content-Range ,能告知客户端作为响应返回的实体哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。
- Content-Type :媒体类型
Content-Type: text/html; charset=utf-8
首部字段 Content-Type 说明实体主体内对象的媒体类型。和首部字段 Accept 一样,字段值用 type/subtype 形式赋值。
- Expires :资源到期时间
Expires: Wed, 04 Jul 2012 08:26:05 GMT
首部字段 Expires 会将资源失效日期告知客户端。缓存服务器在接收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在 Expires 字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
源服务器不希望缓存服务器对资源缓存时,最好在 Expires 字段内写入与首部字段 Date 相同的时间值。
但是,当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires ,会优先处理 max-age 指令。
- Last-Modified :最终修改时间
Last-Modified: wed, 25 May 2018 09:11:40 GMT
首部字段 Last-Modified 指明资源最终修改时间。一般来说,这个值就是 Request-URI 指定资源被修改的时间。但类似使用 CGI 脚本进行动态数据处理时,该值有可能会变成数据最终修改时的时间。
4、实体头部字段
Cookie 的工作机制是用户识别及状态管理。web 网站为了管理用户的状态会通过 web 游览器,把一些数据临时写入用户的计算机内。接着当用户访问该 web 网站时,可通过通信方式取回之前存放的 Cookie 。
调用 Cookie 时,由于可校验 Cookie 的有效期,以及发送方的域、路径、协议等信息,所以正规发布的 Cookie 内的数据不会因来自其他 web 站点和攻击者的攻击而泄露。
在目前使用最广泛的 Cookie 标准却不是 RFC 中定义的任何一个。而是在网景公司指定的标准上进行扩展后的产物。
下面是与 Cookie 有关的首部字段
- Set-Cookie 开始状态管理所使用的 Cookie 信息 响应首部字段
- Cookie 服务器接收到的 Cookie 信息 请求首部字段
Set-Cookie:
status-enable; expires=Tue, 05 Jul 2018 02:01:22 GMT; path=/; domain=.example.com;
当服务器准备开始管理客户端的状态时,会事先告知各种信息。下面表格列举了 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-Cokkie: name=VALUE; secure
以上例子仅当在 https://www…(HTTPS)安全连接的情况下才会进行 Cookie 的回收,也就是说,即使域名相同,http://www…(HTTP)也不会发生 Cookie 的回收行为。
当省略 secure 属性时,不论 HTTP 还是 HTTPS ,都会对 Cookie 进行回收。
- HttpOnly 属性
Cookie 的 HttpOnly 属性是 Cookie 的扩展功能,它使 JavaScript 脚本无法获得 Cookie 。其主要目的为防止跨站脚本攻击(Cross-sitescripting,XSS)对 Cookie 的信息窃取。
发送指定 HttpOnly 属性的 Cookie 的方法如下所示。
Set-Cookie: name=value; HttpOnly
通过上述设置,通常从 web 页面内还可以对 Cookie 进行读取操作。但使用 JavaScript 的 document.cookie 就无法读取附加 HttpOnly 属性后的 Cookie 的内容了。因此,也就无法在 XSS 中利用 JavaScript 劫持 Cookie 了。
虽然是独立的扩展功能,但 Internet Explorer 6 SP1 以上版本等当下的主流游览器都已经支持该扩展了。另外顺带一提,该扩展并非是为了防止 XSS 而开发的。
Cookie:
status=enable
首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接受到的 Cookie 。接受到多个 Cookie 时,同样可以以多个 Cookie 形式发送。
其他首部字段
HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和游览器的应用上,会出现各种非标准的首部字段。
下面是一些比较常用的首部字段/
- X-Frame-Options
- X-XSS-Protection
- DNT
- P3P
X-Frame-Options: DENY
首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 web 网站的 Frame 标签内显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
首部字段 X-Frame-Options 有以下两个可指定的字段值。
- DENY 拒绝
- SAMEORIGIN
仅同源域名下的页面(Top-level-browsing-context)匹配时许可。
支持该首部字段的游览器有:Internet Explorer 8、Firefox 3.6.9+、Chrome 4.1.249.1042+、Safari 4+ 和 Opera 10.50+ 等。现在主流的游览器都已经支持。
能在所有的 web 服务端预先设定好 X-Frame-Options 字段值是最理想的状态。
X-XSS-Protection: 1
首部字段 X-XSS-Protection 属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制游览器 XSS 防护机制的开关。
首部字段 X-XSS-Protection 可指定的字段值如下:
- 0:将 XSS 过滤设置成无效状态
- 1:将 XSS 过滤设置成有效状态
DNT: 1
首部字段 DNT 属于HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被手机,是表示拒绝被精准广告追踪的一种方法。
首部字段 DNT 可指定的字段值如下。
- 0:同意被追踪
- 1:拒绝被追踪
由于首部字段 DNT 的功能具备有效性,所以 web 服务器需要对 DNT 做出对应的支持。
P3P字段
P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"
首部字段 P3P 属于HTTP响应首部,通过利用P3P ( The Platform
for Privacy Preferences,在线隐私偏好平台)技术,可以让Web网站上
的个人隐私变成种仅供程序可理解的形式, 以达到保护用户隐私的
目的。
要进行 P3P的设定,需按以下步骤进行。
- 步骤一:创建 P3P 隐私
- 步骤二:创建 P3P 隐私对照文件后,保存命名在 /w3c/p3p.xml
- 步骤三:从 P3P 隐私中新建 Compact policies 后,输出到 HTTP 响应中