作者:李成文;
标签: http首部
HTTP报文首部
HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。
HTTP请求报文:在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。
HTTP响应报文:在响应中,HTTP报文由HTTP版本、状态码、HTTP首部字段三部分构成。
在这些字段中HTTP首部字段所包含的信息是最丰富的。
HTTP首部字段
HTTP首部字段中的信息
在HTTP通信的过程中,无论是请求还是响应都会使用到首部字段,它起到的作用是传递额外重要信息。
使用首部字段主要是为了给浏览器提供报文主体大小、所使用的语言、认证信息等内容。
HTTP首部字段的结构
HTTP首部字段是由字段名和字段值构成的,中间使用:
分隔。
例如,在HTTP首部中以Content-Type这个字段来表示报文主体的对象类型:
Content-Type: text/html
另外单个HTTP首部也可以有多个值,如:
Keep-Alive: timeout=15, max=100
如果HTTP首部字段重复了,会根据浏览器内部处理逻辑不同而不同,并没有明确的规范,有些会优先处理第一次出现的首部字段,有些则会优先处理最后出现的首部字段。
4种HTTP首部字段类型
HTTP首部字段根据实际用途被分为4中类型:
-
通用首部字段
请求报文和响应报文两方都会使用通用的首部字段
-
请求首部字段
从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息
-
响应首部字段
从服务器向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
-
实体首部字段
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
HTTP/1.1首部字段
HTTP/1.1规范了下面47种首部字段。
通用首部字段:
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Waring | 错误通知 |
请求首部字段:
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Language | 优先的语言 |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在的服务器 |
If-Match | 比较实体标记 |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记 |
If-Range | 资源未更新时发送实体Byte的范围请求 |
If-Unmodified-Since | 比较资源的更新时间 |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体字节范围请求 |
Referer | 对请求中的URI的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端程序的信息 |
响应首部字段:
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定的URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段:
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小 |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
非HTTP/1.1首部字段
在HTTP协议通信交互中使用到的首部字段不限于RFC2616中定义的47中首部字段。还有Cookie、set-Cookie和Content-Disposition等在其他RFC中定义的首部字段。
End-to-end首部和Hop-by-hop首部
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成两个类型
端到端首部(End-to-end)
分在这个类别中的首部会转发给请求/响应对应的最终接受目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。
逐跳首部(Hop-by-hop)
分在这个类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1和之后的版本中,如果要使用hop-by-hop首部,需要提供Connection首部字段。
下面列举HTTP/1.1中逐跳首部字段。除了这8个首部字段之外,其他的字段都是端到端首部。
- Connection
- Keep-Alive
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
HTTP/1.1通用首部字段
通用首部字段指的是,请求报文和响应报文双方都会使用的首部。
Cache-Control
通过指定首部字段Cache-Control的指令,能够操作缓存的工作机制。
指令的参数是可选的,多个指令之间通过“,”分隔,首部字段Cache-Control的指令可以用于请求及响应时。
Cache-Control的指令可以按照请求和响应分类,如下所示:
缓存请求指令:
指令 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 强制向源服务器再次验证 |
no-store | 无 | 不缓存请求或响应的任何内容 |
max-age=[秒] | 必需 | 响应的最大Age值 |
max-stale(=[秒]) | 可省略 | 接受已过期的响应 |
min-fresh=[秒] | 必需 | 期望在指定时间内的响应任然有效 |
no-transform | 无 | 代理不可更改媒体类型 |
only-if-cached | 无 | 从缓存中获取资源 |
cache-extension | - | 新指令标记(token) |
缓存响应指令:
指令 | 参数 | 说明 |
---|---|---|
public | 无 | 可向任意方提供响应的缓存 |
private | 可省略 | 仅向特定用户返回响应 |
no-cache | 可省略 | 缓存前必须先确认其有效性 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 可缓存但必须向源服务器再次进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age=[秒] | 必需 | 响应最大Age值 |
s-maxage=[秒] | 必需 | 公共缓存服务器响应的最大Age值 |
cache-extension | - | 新指令标记(token) |
表示能否缓存的指令
public 指令
Cache-Control: public
当使用public指令时,明确的表明其他用户也可以利用缓存。
private 指令
Cache-Control: private
当指定private指令后,响应只以特定的用户作为对象,和public相反。
缓存服务器会对特定的用户提供资源缓存服务,对于其他用户发送过来的请求,代理服务器不会返回缓存。
no-cache 指令
Cache-Control: no-cache
使用no-cache指令的目的是为了防止从缓存中返回过期的资源。客户端发送的请求如果包含no-cache指令,那么中间的缓存服务器必须把客户端的请求发送给源服务器。
如果服务器返回的响应中包含了no-cache指令,那么缓存服务器不能直接对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。
由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定参数值,那么客户端在接受到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。
Cache-Control: no-cache=Location
控制可执行缓存的对象的指令
no-store指令
Cache-Control: no-store
使用store指令时,暗示请求或响应中包含机密信息,因此该指令规定缓存不能在本地存储请求或响应的任一部分。
指定缓存期限和认证的指令
s-maxage指令
s-maxage指令的功能和max-age指令是一样的,它们不同点在于s-maxage指令只适用于供多位用户适用的公共缓存服务器。也就是说对于同一用户重复返回响应的服务器来说,这个指令没有作用。
使用了s-maxage指令后,会直接忽略对Expires首部字段及max-age指令的处理
max-age指令
当客户端发送的请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接受缓存的资源。另外,当指定max-age值为0,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含max-age指令时,缓存服务器将不对资源的有效性再作确认,而max-age数值代表资源保存为缓存的最长时间。
应用HTTP/1.1版本的缓存服务器遇到同时存在Expires首部字段的情况时,会优先处理max-age指令,而忽略掉Expires首部字段,而HTTP/1.0版本的缓存服务器的情况相反,max-age指令会被忽略掉。
min-fresh指令
min-fresh指令要求缓存服务器返回至少还未过指定时间的缓存资源。当指定min-fresh未60秒后,过来60秒的资源都无法作为响应返回。
max-stale 指令
使用max-stale可指示缓存资源,即使过期也能照常接受。
如果没有指定具体的参数值,那么无论过了多久,客户端都会接受响应,如果指令中指定了具体的参数数值,那么即使过期了,但是仍处于max-stale指定的时间内,仍旧会被客户端接受。
only-if-cached指令
使用only-if-cached指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回,该指令要求缓存服务器不重新加载响应,也不会再次确认资源的有效性,如果发生请求缓存服务器的本地缓存无响应,则会返回504 Gateway Timeout
must-revalidate 指令
使用must-revalidate指令,代理会向源服务器再次验证即将返回的响应缓存是否任然有效。
如果缓存服务器无法连接源服务器再次获取到有效资源,缓存必须给客户端返回504状态码,另外使用must-revalidate指令会忽略请求的max-stale指令。
proxy-revalidate 指令
proxy-revalidate 指令要求所有的缓存服务器在接受到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
no-transform 指令
使用no-transform指令规定无论是在请求中还是在响应中,缓存都不能改变实体主体的媒体类型
Cache-Control扩展
cache-extension token
Cache-Control:private,community="UCI"
通过cache-extension标记(token),可以扩展Cache-Control首部字段内的命令。如上例,Cache-Control首部字段并没有community这个指令,但是借助extension tokens实现了这个指令的添加。这个指令只对能理解它的缓存服务器有意义,不理解它的缓存服务器会直接忽略这个指令。
Connection
Connection首部字段具有两个作用:
-
控制不再转发给代理的首部字段
在客户端发送请求和服务器返回响应内,使用Connection首部字段,可以控制不再转发给代理的首部字段,即Hop-by-hop首部,添加了之后代理服务器将请求或响应转发给服务器或客户端的时候就会忽略掉Connection里面的首部字段。
Connection:不再转发的首部字段名
- 管理持久连接
Connection:close
HTTP/1.1版本的默认连接都是持久连接,客户端会在持久连接上连续发送请求,当服务器端想明确断开连接时,可以指定Connection首部字段的值为close。
Connection: Keep-Alive
HTTP/1.1之前的版本默认连接时非持久连接,如果想在旧版本的HTTP协议上使用持久连接,那么可以指定Connection首部字段的值为Keep-Alive。
Date
首部字段Date表明创建HTTP报文的日期和时间。
Pragma
Pragma是HTTP/1.1之前版本的历史遗留字段,仅仅作为与HTTP/1.0的向后兼容而定义。
这个字段属于通用首部字段,但是只用在客户端发送的请求当中,客户端会要求所有的中间服务器不返回缓存资源。
如果所有的中间服务器都是以HTTP/1.1为基准,那么直接使用Cache-Control:no-cache指定缓存的处理即可,但是有些老的中间服务器不是以HTTP/1.1,那么如果想要兼容所有的中间服务器就需要加上Pragma:no-cache
Cache-Control: no-cache
Pragma: no-cache
Trailer
首部字段Trailer会事先说明在报文主体后记录了那些首部字段,该首部字段可应用在HTTP/1.1版本分块传输编码时。
HTTP/1.1 200 OK
Date: Tue, 03 JUl 2018 09:34:34 GMT
Content-Type: text/html
...
Trailer: Expires
...(报文主体)...
0
Expires: Tue, 23 sep 2017 23:34:43 GMT
上面的例子,指定首部字段Trailer的值为Expires,在报文主体之后出现了首部字段Expires。
Transfer-Encoding
Transfer-Encoding规定了传输报文主体时采用的编码方式。
Upgrade
Upgrade用来检测HTTP协议及其他协议是否可使用更高版本进行通信,参数值可以用来指定一个完全不同的通信协议
GET /index.html HTTP/1.1
Upgrade: TLS/1.0
Connection: Upgrade
在上面的报文中,首部字段Upgrade指定的值为TLS/1.0。Connection的值被指定为Upgrade。也就是说Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。所以在使用Upgrade时,还需要指定Connection:Upgrade
对于附有首部字段Upgrade的请求,服务器可以使用101 Switching Protocols 状态码作为响应返回。
Via
使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
报文在经过代理或网关时,会先在首部子段Via中附加该服务器的信息,然后再进行转发。
Warning
该首部通常会告知用户一些与缓存相关的问题的警告。
Waring首部的格式如下。最后的日期时间可以省略。
Warning:[警告码][警告主机:端口号]"[警告内容]"([日期时间])
请求首部字段
请求首部字段是从客户端往服务端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容
Accept
Accept字段用来告诉服务器,用户代理能够处理的媒体类型以及媒体类型的相对优先级。可以使用type/subtype这种形式,一次指定多种媒体类型。
Accept:text/html,application/xhtml+xml,application/xml;q=0
下面是几种常见的媒体类型:
- 文本文件
text/html,text/plain,text/css...
application/xhtml+xml,application/xml...
- 图片文件
image/jpeg, image/gif, image/png
- 视频文件
video/mpeg, video/quicktime
- 应用程序使用的二进制文件
application/octet-stream,application/zip...
如果浏览器不支持PNG图片的显示,那么Accept就不指定image/png。
如果想要给显示的媒体类型增加优先级,可以使用q=来额外表示权重值,用分号(;)进行分隔。权重q的范围是0~1,且1是最大值。不指定权重q值时,默认权重q=1.0。当服务器可以提供多种内容时,会首先返回权重值最高的媒体类型。
Accept-Charset
Accept-Charset首部字段可以用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段Accept相同的是可以用权重q值来表示相对优先级。
Accept-Charset: iso-8859, unicode-1-1;q=0.8
Accept-Encoding
Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序,可以使用权重q值来表示相对优先级,也可以使用(*)作为通配符,指定任意的编码格式。
Accept-Encoding:gzip,deflate
下面是几种常见的内容编码:
- gzip
- compress
- deflate
- identity
Accept-Language
用来告诉服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级。可以一次指定多种自然语言集,用q来表示相对权重。
Authorization
Authorization是用来告知服务器,用户代理的认证信息。通常想要通过服务器认证的用户代理会在接受到返回的401状态码响应后,把首部字段Authorization加入请求中。
Expect
客户端使用功能首部字段Expect来告知服务器,期望出现的某种特定行为。因为服务器无法理解客户端的期望做出回应而发生错误时,会返回状态码417 Expectation Failed
客户端利用该首部字段,写明所期望的扩展。
From
首部字段Form用来告知服务器使用用户代理的用户的电子邮件地址。
Host
首部字段Host会告知服务器,请求的资源所在的互联网主机名和端口号。当请求被发送至服务器是,请求中的主机名会用IP地址直接替换,那么如果在相同的IP下面部署了多个域名,服务器将会无法理解究竟是哪个域名所对应的请求,这种情况下,必须使用Host字段来告诉服务器请求的主机名,如果服务器没有设定主机名,那么直接发送一个空值就可以了。
If-Match
形如If-xxx这种样式的请求首部字段,都可以称为条件请求。服务器接受到附带条件的请求后,只有判断指定条件为真的时候才会执行请求。
If-Match: "123456
这里首部字段If-Match,会告诉服务器匹配资源所用的实体标记(ETag)值,服务器会对比If-Match的字段值和资源的ETag值,只有当两者一致的时候,才会执行请求。反之,则会返回412 Precondition Failed的响应。
可以使用星号(*)指定If-Match的字段值,这种情况下,服务器会忽略ETag的值。
If-Range
If-Range属于附带条件之一,它告诉服务端如果指定的If-Range字段值(ETag值或时间)和请求资源的ETag值或时间一直时,就做范围请求处理,否则会返回全体资源。
如果不是用If-Range发送送请求的情况是怎么样的呢?服务器的资源如果更新了,那么客户端持有的一部分资源就会随之失效,那么范围请求就是无效的,服务器会返回412 Precondition Failed的响应,告诉客户端需要再发一次请求,而使用If-Range则不会。
Max-Forwards
使用TRACE方法或者OPTIONS方法,发送包含首部字段Max-Forwards的请求时,这个字段以十进制的整数来指定可以经过的服务器的最大数目。服务器在往下一个服务器转发请求之前Max-Forwards的值减一然后会重新赋值,当服务器收到的Max-Forwards的值为0的时候请求就不会再进行转发,而是直接返回响应。
在使用HTTP协议通信时,请求可能会经过多个代理服务器。途中,如果代理服务器由于某些原因导致请求转发失败,客户端就接收不到服务器的响应了,而使用Max-Forwards字段,可以针对这个问题进行排查,由于Max-Forwards的值为0的时候,请求就会返回,那么我们就可以通过这个字段来对请求传输的路径有所把握。
Proxy-Authorization
接受到代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,告诉服务器认证所需要的信息。
这个和客户端与服务器之间的HTTP访问认证类似,不同的地方在于,认证行为发生在客户端与代理之间。
Range
进行范围请求时通过这个字段告诉服务器请求的范围,接受到附带Range字段的请求的服务器,会在处理请求之后返回206 Partial Content 的响应。 无法处理该范围请求的时候,就会返回状态码200 OK 并且将所有的资源全部返回。
Referer
Referer会告诉服务器请求的原始资源URI。
TE
TE会告知服务器客户端能够处理的传输编码方式,以及优先级(使用q来表示优先级),它和Accept-Encoding的功能很像,但是用于传输编码。
User-Agent
User-Agent会将创建请求的服务器和用户代理的名称等信息传达给服务器。
响应首部字段
响应首部字段是由服务器发送给客户端的响应报文中所使用的字段。
Accept-Ranges
Accept-Ranges用来告诉客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。可以指定的字段的值有两种,可处理范围请求时指定为bytes,否则指定为none。
Age
Age告诉客户端,源服务器在多久前创建了响应,单位是秒。
如果创建响应的服务器是缓存服务器,Age的值是指缓存后的响应再次发起认证到认证完成的时间值,代理创建响应时必须加上首部字段Age。
Etag
Etag告诉客户端实体标记,它时一种可以将资源以字符串形式做唯一表示的方式。服务器会为每份资源分配对应的Etag值,当资源更新时,Etag值也需要更新,生成Etag值时,并没有统一算法规则,由服务器来分配。
资源被缓存时,会被分配唯一性标识。如当使用中文版浏览器访问goole首页时,服务器返回的是中文的goole首页,而使用英文版的访问的时候就会返回英文版的首页。两者的URI是完全相同的,所以仅仅是凭着URI指定缓存的资源是非常困难的,如果在下载过程中出现连接中断、再次连接的情况,都会依照ETag值来指定资源。
ETag值分为强ETag值和弱ETag值。
强ETag值,不论实体发生多么微小的变化都会改变他的值。
ETag: "usagi-1234"
弱ETag值,只用于提示资源是否相同。只有资源发生了根本的改变,产生差异是才会改变ETag值,这个时候会在字段开始附加W/。
Location
使用首部字段Location可以将响应接受方引导至某个与请求URI位置不同的资源,一般这个字段会配合3XX:Redirection的响应,提供重定向。
Proxy-Authenticate
Proxy-Authenticate字段会把由服务器所要求的认证信息发送给客户端。
Retry-After
Retry-After告诉客户端应该在多久之后再次发送请求。主要配合状态码503 Service Unavailable 响应,或3XX Redirect响应一起使用。
字段的值可以是具体的日期时间,也可以是创建响应后的毫秒数。
Server
Server告诉客户端当前服务器上安装的HTTP服务器应用程序的信息。
Vary
Vary的作用是对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令。
从代理服务器接受到源服务器返回包含Vary指定项的响应之后,若再要进行缓存,仅对请求中包含相同Vary指定首部字段的请求返回缓存。即使是对相同资源发起请求,但是如果Vary指定的首部字段不相同,也必须要从源服务器重新获取资源。
例如:当代理服务器收到带有Vary首部字段指定获取资源的请求时,如果使用的Accept-Language字段的值相同,那么直接从缓存中返回响应。反之需要从源服务器端获取资源后才能作为响应返回。
WWW-Authenticate
WWW-Authenticate用于HTTP访问认证。它会告知客户端适用于访问请求URI所指定的认证方案(Basic和Digest)和带参数提示的质询。
实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等于实体相关的信息。
Allow
Allow用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。当服务器接受到不支持HTTP方法时,会以405 Not Allowed 作为响应返回,并且把所有支持的方法写入首部字段Allow。
Content-Encoding
Content-Encoding会告知客户端服务器对实体的主体部分采用的编码方式,编码方式指的是在不丢失实体信息的前提下所进行的压缩。
Content-Language
Content-Language告知客户端,实体主体所采用的自然语言。
Content-Length
Content-Length表明实体主体部分的大小。对实体主体进行内容编码传输时,不能再使用Content-Length首部字段。
Content-Location
Content-Location给出报文主体部分相对应的URI。
Content-MD5
Content-MD5是一串由MD5算法生成的值,用于检查主体在传输过程中是否保存完整,以及确认传输到达。
Content-Range
针对范围请求,返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的那部分符合范围请求。字段值以字节为单位,表示当前发送部分及整体实体大小。
Content-Range:bytes 5001-10000/10000
Content-Type
Content-Type说明了实体主体内对象的媒体类型。
Expires
Expires会将资源的失效日期告知客户端,缓存服务器在接受到含有首部字段Expires字段值指定的时间之前,响应的副本会被一直保存,当超过指定的时间之后,缓存服务器在请求发送过来之后会转向源服务器请求资源。
Last-Modified
Last-Modified指明资源最终修改的时间。
为Cookie服务的首部字段
Cookie用来管理客户端和服务器之间的状态,Cookie的工作机制是用户识别及状态管理。
Set-Cookie
当服务器准备开始管理客户端的状态时,会事先告知各种信息,下面介绍一下Set-Cookie字段的属性值:
expires
expires属性指定浏览器可发送Cookie的有效期。当省略这个属性,有效期限仅限于位置浏览器会话时间段内。
一旦Cookie从服务器发送至客户端,服务器就不存在可以显示删除Cookie的方法,但是可以通过覆盖已经过期的Cookie,实现对客户端Cookie的实质性删除。
path
Cookie的path属性可以用来限制指定的Cookie的发送范围的文件目录。
domain
通过Cookie的domain属性指定的域名可做到与结尾匹配一致。
secure
Cookie的secure属性用于限制Web页面仅在HTTPS安全连接时,才可以发送Cookie。当省略secure属性时,不论HTTP还是HTTPS,都会对Cookie进行回收。
Set-Cookie:name="value"; secure
HttpOnly
Cookie的HttpOnly属性时Cookie的扩展功能,它使JavaScript脚本无法获得Cookie。主要的目的是为了防止跨站脚本攻击对Cookie的信息窃取。
Cookie
首部字段Cookie会告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接受到的Cookie。接受到多个Cookie时,同样可以以多个Cookie形式发送。
其他首部字段
HTTP首部字段是可以自行扩展的,下面介绍几个最常用的首部字段。
X-Frame-Options
首部字段X-Frame-Options属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。主要目的是为了防止点击劫持攻击。
首部字段X-Frame-Options有两个可指定的值:
- DENY:拒绝
- SAMEORIGIN:仅同源域名下的页面匹配时许可。
X-XSS-Protection
X-XSS-Protection属于HTTP响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
字段值如下:
- 0:将XSS过滤设置成无效状态
- 1:将XSS过滤设置成有效状态
DNT
属于HTTP请求首部,DNT是Do Not Track 的简称,意思是拒绝个人信息被收集,表示拒绝被精准广告追踪的一种方法。
字段值如下:
- 0:同一被追踪
- 1:拒绝被追踪
P3P
属于HTTP响应首部,通过利用P3P技术,可以让Web网站上的个人隐私变成一种仅供程序理解的形式,以达到保护用户隐私的目的。
具体内容请参考其他资料