HTTP学习


HTTP

web协议

定义

Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议 )的协议作为规范,完成从客户端到服务器端等一系列运作流程。

1997 年 1 月公布的 HTTP/1.1 是目前主流的 HTTP 协议版本。

TCP/IP协议簇

TCP/IP分层

应用层

FTP(FileTransfer Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)

HTTP

传输层

TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)

网络层

网络层所起的作用就是在众多的选项内选择一条传输路线

物理层

用来处理连接网络的硬件部分

TCP/IP 通信传输流

协议

不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。

IP协议

IP(Internet Protocol)网际协议位于网络层

IP 协议的作用是把各种数据包传送给对方。

P 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定地址。IP 地址可以和 MAC 地址进行配对。IP 地址可变换,但 MAC地址基本上不会更改。

ARP协议

ARP 是一种用以解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址。

路由选择

TCP协议

TCP 位于传输层,提供可靠的字节流服务

tcp三次握手

DNS

DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的
协议。它提供域名到 IP 地址之间的解析服务。

各协议关系

URI

URI 是 Uniform Resource Identifier 的缩写。

URI 用字符串标识某一互联网资源,而 URL表示资源的地点(互联网上所处的位置)

格式

as:

ftp://ftp.is.co.za/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one
mailto:John.Doe@example.com
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2

HTTP协议

S-B客服端与服务器端的交互

在两台计算机之间使用 HTTP 协议通信时,在一条通信线路上必定有一端是客户端,另一端则是服务器端。

HTTP 是不保存状态的协议

请求-响应

请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。

响应报文

URI请求

请求方法

GET

GET :获取资源
GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器 端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保 持原样返回;如果是像 CGI(Common Gateway Interface,通用网关接 口)那样的程序,则返回经过执行后的输出结果。

请求:

GET /index.html HTTP/1.1 

Host: www.hackr.jp

响应:

返回  index.html 的页面资源

POST

POST:传输实体主体
POST 方法用来传输实体的主体。
虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行 传输,而是用 POST 方法。虽说 POST 的功能与 GET 很相似,但 POST 的主要目的并不是获取响应的主体内容。

请求:

POST /submit.cgi HTTP/1.1 
Host: www.hackr.jp 
Content-Length: 1560(1560字节的数据)

响应:

返回  submit.cgi 接收数据的处理结果 

PUT

PUT:传输文件
PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请 求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。

请求:

PUT /example.html HTTP/1.1 
Host: www.hackr.jp 
Content-Type: text/html 
Content-Length: 1560(1560 字节的数据

响应:

响应返回状态码  204 No Content(比如  :该  html 已存在于服务器上) 

HEAD:获得报文首部
HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。

请求:

HEAD /index.html HTTP/1.1 

Host: www.hackr.jp 

响应:

返回index.html有关的响应首部 

DELETE

DELETE:删除文件
DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按 请求 URI 删除指定的资源。

请求:

DELETE /example.html HTTP/1.1 

Host: www.hackr.jp 

响应:

响应返回状态码  204 No Content(比如  :该  html 已从该服务器上删除) 

OPTIONS

OPTIONS:询问支持的方法
OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。

请求:

OPTIONS * HTTP/1.1 

Host: www.hackr.jp 

响应:

HTTP/1.1 200 OK 
Allow: GET, POST, HEAD, OPTIONS (返回服务器支持的方法) 

TRACK

TRACE:追踪路径
TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方 法。
发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服 务器端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,最 后接收到请求的服务器端则返回状态码 200 OK 的响应

请求:

TRACE / HTTP/1.1 

Host: hackr.jp 

Max-Forwards: 2 

响应:

HTTP/1.1 200 OK 

Content-Type: message/http 

Content-Length: 1024 
TRACE / HTTP/1.1 
Host: hackr.jp 
Max-Forwards: 2(返回响应包含请求内容) 

CONNECT

CONNECT:要求用隧道协议连接代理
CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协 议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接 层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容 加 密后经网络隧道传输。
CONNECT 方法的格式如下所示。

CONNECT 代理服务器名:端口号 HTTP版本

请求:

CONNECT proxy.hackr.jp:8080 HTTP/1.1 

Host: proxy.hackr.jp 

响应:

HTTP/1.1 200 OK(之后进入网络隧道) 

持久连接

持久连接旨在建立 1 次 TCP 连接后进行多次请求和响应的交互

管线化

不等待响应,直接发送下一个请求

请求:

GET /image/ HTTP/1.1
Host: hackr.jp
Cookie: sid=1342077140226724

响应:

HTTP/1.1 200 OK
Date: Thu, 12 Jul 2012 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed,
10-Oct-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF-8

HTTP报文

结构

压缩传输

常用的内容编码有以下几种:
gzip(GNU zip)
compress(UNIX 系统的标准压缩)
deflate(zlib)
identity(不进行编码)

分割发送的分块传输编码

分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六 进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编 码前的实体主体。

发送多种数据的多部分对象集合

  • multipart/form-data(文件上传时)

    Content-Type: multipart/form-data; boundary=AaB03x
    --AaB03x
    Content-Disposition: form-data; name="field1"
    Joe Blow
    --AaB03x
    Content-Disposition: form-data; name="pics"; filename="file1.txt"
    Content-Type: text/plain
    ...(file1.txt的数据)...
    --AaB03x--
  • multipart/byteranges

    HTTP/1.1 206 Partial Content
    Date: Fri, 13 Jul 2012 02:45:26 GMT
    Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT
    Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
    
    --THIS_STRING_SEPARATES
    Content-Type: application/pdf
    Content-Range: bytes 500-999/8000
    ...(范围指定的数据)...
    
    --THIS_STRING_SEPARATES
    Content-Type: application/pdf
    Content-Range: bytes 7000-7999/8000
    ...(范围指定的数据)...
    --THIS_STRING_SEPARATES--

使用 boundary 字符串来划分多部分对象集合指明的各类实体。在boundary 字符串指定的各个实体的起始行之前插入“–”标记(例如:–AaB03x、–THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入“–”标记(例如:–AaB03x–、–THIS_STRING_SEPARATES–)作为结束。

获取部分内容的范围请求(分段请求)

从一开始到 3000 字节和 5000~7000 字节,8000到之后全部的多重范围

Range: bytes=-3000, 5000-7000 ,8000-

内容协商

内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然 后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字 符集、编码方式等作为判断的基准。

参照头

Accept 
Accept-Charset
Accept-Encoding 
Accept-Language 
Content-Language

内容协商技术

  • 服务器驱动协商
  • 客户端驱动协商
  • 透明协商

HTTP返回状态码

类别

2XX

2XX 的响应结果表明请求被正常处理了

200OK

表示从客户端发来的请求在服务器端被正常处理了,get请求回返回实体,head请求返回实体首部

204 No Content

该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。(浏览器不更新页面)

206 Partial Content

该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

3XX重定向

3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。

301 Moved Permanently

永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。

302 Found

临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。不更新书签,仍保留产生302的url

303 See Other

该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET方法定向获取请求的资源。例如,post方法请求时,处理结果希望客服端采用get方法获取资源

304 Not Modified

该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应的主体部分。

附带条件的请求是指采用 GET方法的请求报文中包含 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since 中任一首部。

307 Temporary Redirect

4XX 客户端错误

4XX 的响应结果表明客户端是发生错误的原因所在。

400 Bad Request

该状态码表示请求报文中存在语法错误。修改报文再发送。和200异曲同工

401 Unauthorized

该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。

返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询(challenge)用户信息。

首次返回一个认证框,再返回就是认证失败

403 Forbidden

该状态码表明对请求资源的访问被服务器拒绝了。

404 Not Found

该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

5XX 服务器错误

5XX 的响应结果表明服务器本身发生错误。

500 Internal Server Error

该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web应用存在的 bug 或某些临时的故障。

503 Service Unavailable

该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

samll_tips

不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。

与 HTTP 协作的 Web 服务器

用单台虚拟主机实现多个域名

一台服务器托管了两个域名,www.hacker.com,www.hacker2.com,两个域名托管在一个虚拟机,则DNS解析后IP相同,两个域名会访问一个IP。在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。

通信数据转发程序 :代理、网关、隧道

代理

代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。

代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务器。

每次通过代理服务器转发请求或响应时,会追加写入 Via 首部信息

代理方法

1.缓存代理

代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。再次收到相同的资源请求就会返回代理上缓存的资源。

2.透明代理

转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。

网关

网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。

网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非 HTTP 协议服务。
利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。

隧道

隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。

隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之后的服务器。

保存资源的缓存

缓存服务器的优势在于利用缓存可避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求了。

缓存的有效期限

即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器将会再次从源服务器上获取“新”资源。

客户端的缓存

缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。以Internet Explorer 程序为例,把客户端缓存称为临时网络文件(Temporary Internet File)。
浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读取。

HTTP 出现之前的协议

  1. FTP(File Transfer Protocol)
    传输文件时使用的协议。
  2. NNTP(Network News Transfer Protocol)
    用于 NetNews 电子会议室内传送消息的协议。。
  3. Archie
    搜索 anonymous FTP 公开的文件信息的协议。
  4. WAIS(Wide Area Information Servers)
    以关键词检索多个数据库使用的协议。
  5. Gopher
    查找与互联网连接的计算机内信息的协议。

HTTP 首部

HTTP 报文首部

HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。

HTTP 请求报文

GET / HTTP/1.1
Host: hackr.jp
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,
*/*; q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
If-Modified-Since: Fri, 31 Aug 2007 02:02:20 GMT
If-None-Match: "45bae1-16a-46d776ac"
Cache-Control: max-age=0

HTTP 响应报文

HTTP/1.1 304 Not Modified
Date: Thu, 07 Jun 2012 07:21:36 GMT
Server: Apache
Connection: close
Etag: "45bae1-16a-46d776ac"

HTTP 首部字段

HTTP 首部字段传递重要信息

HTTP 首部字段结构

HTTP 首部字段是由首部字段名和字段值构成的

首部字段名: 字段值
Content-Type: text/html
Keep-Alive: timeout=15, max=100

HTTP 首部字段重复了会如何

不同浏览器解析方式不同,有的是解析前面,有的则是解析后面的

4HTTP 首部字段类型

  1. 通用首部字段(General Header Fields

请求报文和响应报文两方都会使用的首部。

  1. 请求首部字段(Request Header Fields

从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。

  1. 响应首部字段(Response Header Fields

从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。

  1. 实体首部字段(Entity Header Fields

针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息

HTTP/1.1 首部字段一览

RFC2616 中定义的 47 种首部字段

通用首部字段
首部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知
请求首部字段
首部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web认证信息
Expect 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记(与 If-Match 相反)
If-Range 资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since 比较资源的更新时间(与If-Modified-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 首部字段

RFC4229

Cookie、Set-Cookie 和 Content-Disposition 等

End-to-end 首部和 Hop-by-hop 首部

端到端首部(End-to-end Header

分在此类别中的首部会转发给请求 / 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。

逐跳首部(Hop-by-hop Header

分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段。

除了一下8种其他全是端到端首部

Connection
Keep-Alive
Proxy-Authenticate
Proxy-Authorization
Trailer
TE
Transfer-Encoding
Upgrade

HTTP/1.1 通用首部字段

通用首部字段是指,请求报文和响应报文双方都会使用的首部。

Cache-Control

首部字段 Cache-Control 能够控制缓存的行为

写法Cache-Control: private, max-age=0, no-cache

缓存请求指令
指令 参数 说明
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)
表示是否能缓存的指令
  • Cache-Control: public

    当指定使用 public 指令时,则明确表明其他用户也可利用缓存。

  • Cache-Control: private

    当指定 private 指令后,响应只以特定的用户作为对象,这与 public指令的行为相反。

    缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

  • Cache-Control: no-cache

    使用 no-cache 指令的目的是为了防止从缓存中返回过期的资源。

    客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。中间缓存服务器不缓存,相当于隧道不对报文做文章。

  • Cache-Control: no-cache=Location

    由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache 字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。

控制可执行缓存的对象的指令
  • Cache-Control: no-store

    当使用 no-store 指令时,暗示请求(和对应的响应)或响应中包含机密信息。

    该指令规定缓存不能在本地存储请求或响应的任一部分。

指定缓存期限和认证的指令
  • Cache-Control: s-maxage=604800(单位 :秒)

    s-maxage 指令的功能和 max-age 指令的相同,它们的不同点是 s- maxage 指令只适用于供多位用户使用的公共缓存服务器 。也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。

    当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及max-age 指令的处理。

  • Cache-Control: max-age=604800(单位:秒)

    当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定 max-age 值为 0,那么缓存服务器通常需要将请求转发给源服务器。

    当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。

    应用 HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的情况时,会优先处理 max-age 指令,而忽略掉 Expires 首部字段。而HTTP/1.0 版本的缓存服务器的情况却相反,max-age 指令会被忽略掉。

  • Cache-Control: min-fresh=60(单位:秒)

    min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。

  • Cache-Control: max-stale=3600(单位:秒)

    使用 max-stale 可指示缓存资源,即使过期也照常接收。

    如果指令未指定参数值,那么无论经过多久,客户端都会接收响应; 如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale 指定的时间内,仍旧会被客户端接收。

  • Cache-Control: only-if-cached

    使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout。

  • Cache-Control: must-revalidate

    使用 must-revalidate 指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。

    若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条 504(Gateway Timeout)状态码。

    另外,使用 must-revalidate 指令会忽略请求的 max-stale 指令(即使已经在首部使用了 max-stale,也不会再有效果)。

  • Cache-Control: proxy-revalidate

    proxy-revalidate 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。

  • Cache-Control: no-transform

    使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。

    这样做可防止缓存或代理压缩图片等类似操作。

Cache-Control 扩展

Cache-Control: private, community="UCI"

通过 cache-extension 标记(token),可以扩展 Cache-Control 首部字段内的指令。

如上例,Cache-Control 首部字段本身没有 community 这个指令。借助extension tokens 实现了该指令的添加。如果缓存服务器不能理解community 这个新指令,就会直接忽略。因此,extension tokens 仅对能理解它的缓存服务器来说是有意义的。

Connection

作用
  • 控制不再转发给代理的首部字段Connection: 不再转发的首部字段名

  • 管理持久连接

    HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。为此,如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定Connection 首部字段的值为 Keep-Alive。Connection: Keep-Alive

    HTTP/1.1 版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection 首部字段的值为 Close。Connection: close

Date

首部字段 Date 表明创建 HTTP 报文的日期和时间。

  • HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式

    Date: Tue, 03 Jul 2012 04:40:59 GMT

  • 之前的 HTTP 协议版本中使用在 RFC850 中定义的格式

    Date: Tue, 03-Jul-12 04:40:59 GMT

  • C 标准库内的 asctime() 函数的输出格式

    Date: Tue Jul 03 04:40:59 2012

Pragma

Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0的向后兼容而定义。相当于HTTP/1.1之后Cache-Control

Pragma: no-cache

Cache-Control: no-cache 
Pragma: no-cache

通常一起用,因为你不能掌握全部中间服务器

Trailer

首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Content-Type: text/html
...
Transfer-Encoding: chunked
Trailer: Expires

...(报文主体)... 0
Expires: Tue, 28 Sep 2004 23:59:59 GMT

以上用例中,指定首部字段 Trailer 的值为 Expires,在报文主体之后(分块长度 0 之后)出现了首部字段 Expires。

Transfer-Encoding

首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。

HTTP/1.1 的传输编码方式仅对分块传输编码有效。

HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Cache-Control: public, max-age=604800 
Content-Type: text/javascript; charset=utf-8 
Expires: Tue, 10 Jul 2012 04:40:56 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block 
Content-Encoding: gzip 
Transfer-Encoding: chunked 
Connection: keep-alive

Upgrade

首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

上图用例中,首部字段 Upgrade 指定的值为 TLS/1.0。请注意此处两个字段首部字段的对应关系,Connection 的值被指定为 Upgrade。Upgrade 首部字段产生作用的 Upgrade 对象仅限于客户端和邻接服务器之间。因此,使用首部字段 Upgrade 时,还需要额外指定Connection:Upgrade。

对于附有首部字段 Upgrade 的请求,服务器可用 101 Switching Protocols 状态码作为响应返回。

Via

使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。

首部字段 Via 不仅用于追踪报文的转发,还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。

1.0是指代理服务器的HTTP版本

Warning

HTTP/1.1 的 Warning 首部是从 HTTP/1.0 的响应首部(Retry-After)演变过来的。该首部通常会告知用户一些与缓存相关的问题的警告。

Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])
Warning: 113 gw.hackr.jp:8080 "Heuristic expiration" Tue, 03
HTTP/1.1 警告码
警告码 警告内容 说明
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(持久杂项警告) 任意的警告内容

请求首部字段

请求首部字段是从客户端往服务器端发送请求报文中所使用的字段, 用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。

Accept

Accept: text/html,application/xhtml+xml,application/xml;q=0.1
  • 文本文件

    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,而指定可处理的 image/gif 和 image/jpeg 等图片类型。

若想要给显示的媒体类型增加优先级,则使用 q= 来额外表示权重值1,用分(;)进行分隔。权重值 q 的范围是 0~1(可精确到小数点后 3 位),且 1 为最大值。不指定权重 q 值时,默认权重为 q=1.0。

Accept-Charset

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

Accept-Encoding

Accept-Encoding: gzip, deflate

Accept-Encoding 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。

  • gzip
  • compress
  • deflate
  • identity

也能使用权重q,使用*作为通配符

Accept-Language

Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

首部字段 Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。

Authorization

首部字段 Authorization 是用来告知服务器,用户代理的认证信息(证书值)。通常,想要通过服务器认证的用户代理会在接收到返回的401 状态码响应后,把首部字段 Authorization 加入请求中。共用缓存在接收到含有 Authorization 首部字段的请求时的操作处理会略有差异。

Expect

客户端使用首部字段 Expect 来告知服务器,期望出现的某种特定行为。因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码 417 Expectation Failed。

客户端可以利用该首部字段,写明所期望的扩展。

From

首部字段 From 用来告知服务器使用用户代理的用户的电子邮件地址。通常,其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。使用代理时,应尽可能包含 From 首部字段(但可能会因代理不同,将电子邮件地址记录在 User-Agent 首部字段内)。

Host

Host: www.hackr.jp

首部字段 Host 会告知服务器,请求的资源所处的互联网主机名和端口号。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。

虚拟主机运行在同一个 IP 上,因此使用首部字段 Host 加以区分

若服务器未设定主机名,那直接发送一个空值即可。

If-XXX

形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

If-Match

If-Match: "123456"

首部字段 If-Match,属附带条件之一,它会告知服务器匹配资源所用的实体标记(ETag)值。

服务器会比对 If-Match 的字段值和资源的 ETag 值,仅当两者一致时,才会执行请求。反之,则返回状态码 412 Precondition Failed 的响应。

通配符*跳过匹配

If-Modified-Since

If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT

首部字段 If-Modified-Since,属附带条件之一,它会告知服务器若 If- Modified-Since 字段值早于资源的更新时间,则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码 304 Not Modified 的响应。

If-Modified-Since 用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段 Last-Modified 来确定。

If-None-Match

它和首部字段 If-Match 作用相反。

在 GET 或 HEAD 方法中使用首部字段 If-None-Match 可获取最新的资源。因此,这与使用首部字段 If-Modified-Since 时有些类似。

If-Range

首部字段 If-Range 属于附带条件之一。它告知服务器若指定的 If- Range 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。

If-Unmodified-Since

If-Unmodified-Since: Thu, 03 Jul 2012 00:00:00 GMT

首部字段 If-Unmodified-Since 和首部字段 If-Modified-Since 的作用相反。它的作用的是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则以状态码 412 Precondition Failed 作为响应返回。

Max-Forwards

Max-Forwards: 10

每次转发数值减 1。当数值变 0 时返回响应

通过 TRACE 方法或 OPTIONS 方法,发送包含首部字段 Max- Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。

Proxy-Authorization

Proxy-Authorization: Basic dGlwOjkpNLAGfFY5

接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization 的请求,以告知服务器认证所需要的信息。

Range

Range: bytes=5001-10000

对于只需获取部分资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围。上面的示例表示请求获取从第 5001 字节至第10000 字节的资源。

接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。

Referer

Referer: http://www.hackr.jp/index.htm

首部字段 Referer 会告知服务器请求的原始资源的 URI。

TE

TE: gzip, deflate;q=0.5

首部字段 TE 会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很相像,但是用于传输编码。

首部字段 TE 除指定传输编码之外,还可以指定伴随 trailer 字段的分块传输编码的方式。应用后者时,只需把 trailers 赋值给该字段值。

TE: trailers

User-Agent

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gec

首部字段 User-Agent 会将创建请求的浏览器和用户代理名称等信息传达给服务器。

响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的字段, 用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。

Accept-Ranges

Accept-Ranges: bytes

首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。

可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则指定其为 none。

Age

Age: 600

首部字段 Age 能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。

若创建该响应的服务器是缓存服务器,Age 值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段Age。

ETag

ETag: "82e22293907ce725faf67773957acd12"

仅仅是由服务器来分配。

ETag

强 ETag 值,不论实体发生多么细微的变化都会改变其值。

ETag: "usagi-1234"

ETag

弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETag 值。这时,会在字段值最开始处附加 W/。

ETag: W/"usagi-1234"

Location

Location: http://www.usagidesign.jp/sample.html

使用首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。

基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的URI。

Proxy-Authenticate

Proxy-Authenticate: Basic realm="Usagidesign Auth"

首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。

Retry-After

Retry-After: 120

首部字段 Retry-After 告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用。

字段值可以指定为具体的日期时间(Wed, 04 Jul 2012 06:34:24 GMT 等格式),也可以是创建响应后的秒数。

Server

Server: Apache/2.2.6 (Unix) PHP/5.2.5

首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。不单单会标出服务器上的软件应用名称,还有可能包括版本号和安装时启用的可选项。

Vary

Vary: Accept-Language

从代理服务器接收到源服务器返回包含 Vary 指定项的响应之后,若再要进行缓存,仅对请求中含有相同 Vary 指定首部字段的请求返回缓存。即使对相同资源发起请求,但由于 Vary 指定的首部字段不相同,因此必须要从源服务器重新获取资源。

WWW-Authenticate

WWW-Authenticate: Basic realm="Usagidesign Auth"

首部字段 WWW-Authenticate 用于 HTTP 访问认证。它会告知客户端适用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest)和带参数提示的质询(challenge)。状态码 401 Unauthorized 响应中, 肯定带有首部字段 WWW-Authenticate。

实体首部字段

实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。

Alow

Allow: GET, HEAD

首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。当服务器接收到不支持的 HTTP 方法时,会以状态码405 Method Not Allowed 作为响应返回。与此同时,还会把所有能支持的 HTTP 方法写入首部字段 Allow 后返回。

Content-Encoding

Content-Encoding: gzip

首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。

  • gzip
  • compress
  • deflate
  • identity

Content-Languag

Content-Language: zh-CN

首部字段 Content-Language 会告知客户端,实体主体使用的自然语言(指中文或英文等语言)。

Content-Length

Content-Length: 15000

首部字段 Content-Length 表明了实体主体的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用 Content-Length 首部字段。

Content-Location

Content-Location: http://www.hackr.jp/index-ja.html

首部字段 Content-Location 给出与报文主体部分相对应的 URI。和首部字段Location 不同,Content-Location 表示的是报文主体返回资源对应的 URI。

比如,对于使用首部字段 Accept-Language 的服务器驱动型请求,当返回的页面内容与实际请求的对象不同时,首部字段 Content-Location 内会写明 URI。

Content-MD5

Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==

首部字段 Content-MD5 是一串由 MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。

对报文主体执行 MD5 算法获得的 128 位二进制数,再通过 Base64 编码后将结果写入 Content-MD5 字段值。由于 HTTP 首部无法记录二进制值,所以要通过 Base64 编码处理。为确保报文的有效性,作为接收方的客户端会对报文主体再执行一次相同的 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 字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。

当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令。

Last-Modified

Last-Modified: Wed, 23 May 2012 09:59:55 GMT

首部字段 Last-Modified 指明资源最终修改的时间。一般来说,这个值就是 Request-URI 指定资源被修改的时间。但类似使用 CGI 脚本进行动态数据处理时,该值有可能会变成数据最终修改时的时间。

Cookie 的工作机制是用户识别及状态管理。Web 网站为了管理用户的状态会通过 Web 浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该Web网站时,可通过通信方式取回之前发放的Cookie。

调用 Cookie 时,由于可校验 Cookie 的有效期,以及发送方的域、路径、协议等信息,所以正规发布的 Cookie 内的数据不会因来自其他Web 站点和攻击者的攻击而泄露。

  • RFC2109
  • RFC2965
  • RFC6265
  • 由网景公司颁布的规格标准

首部字段名 说明 首部类型
Set-Cookie 开始状态管理所使用的Cookie信息 响应首部字段
Cookie 服务器接收到的Cookie信息 请求首部字段
Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31

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。

Set-Cookie: name=value; secure
HttpOnly 属性

Cookie 的 HttpOnly 属性是 Cookie 的扩展功能,它使 JavaScript 脚本无法获得 Cookie。其主要目的为防止跨站脚本攻击(Cross-site scripting,XSS)对 Cookie 的信息窃取。

Set-Cookie: name=value; HttpOnly
Cookie: status=enable

首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个Cookie 时,同样可以以多个 Cookie 形式发送。

其他首部字段

HTTP 首部字段是可以自行扩展的。

X-Frame-Options
X-XSS-Protection
DNT
P3P

X-Frame-Options

X-Frame-Options: DENY

首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。

字段
  • DENY :拒绝
  • SAMEORIGIN :仅同源域名下的页面(Top-level-browsing- context)匹配时许可。(比如,当指定 http://hackr.jp/sample.html 页面为 SAMEORIGIN 时,那么 hackr.jp 上所有页面的 frame 都被允许可加载该页面,而 example.com 等其他域名的页面就不行了)
apache2.conf 的配置实例
<IfModule mod_headers.c>
Header append X-FRAME-OPTIONS "SAMEORIGIN"
</IfModule>

X-XSS-Protection

X-XSS-Protection: 1

首部字段 X-XSS-Protection 属于 HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关。

  • 0:将 XSS 过滤设置成无效状态
  • 1:将 XSS 过滤设置成有效状态

DNT

DNT: 1

首部字段 DNT 属于 HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。

  • 0:同意被追踪
  • 1:拒绝被追踪

P3P

P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa

首部字段 P3P 属于 HTTP 相应首部,通过利用 P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。

要进行 P3P 的设定,需按以下操作步骤进行。

步骤 1:创建 P3P 隐私

步骤 2:创建 P3P 隐私对照文件后,保存命名在 /w3c/p3p.xml

步骤 3:从 P3P 隐私中新建 Compact policies 后,输出到 HTTP 响应中

确保 Web 安全的HTTPS

在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。使用HTTPS 通信机制可以有效地防止这些问题。

HTTP的缺点

  • 通信使用明文(不加密),内容可能会被窃听

  • 不验证通信方的身份,因此有可能遭遇伪装

  • 无法证明报文的完整性,所以有可能已遭篡改

通信使用明文(不加密),内容可能会被窃听

由于 HTTP 本身不具备加密的功能,所以也无法做到对通信整体(使用 HTTP 协议通信的请求和响应的内容)进行加密。即,HTTP 报文使用明文(指未经过加密的报文)方式发送。

  • TCP/IP 是可能被窃听的网络

    互联网上的任何角落都存在通信内容被窃听的风险

    即使加密的处理过的通信任会被监听,只是监听者还需要破解报文信息

  • 加密处理防止被窃听

    • 通信的加密

      HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用, 加密 HTTP 的通信内容。

    • 内容的加密

      HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用, 加密 HTTP 的通信内容。

      把HTTP 报文里所含的内容进行加密处理。

不验证通信方的身份就可能遭遇伪装

HTTP 协议中的请求和响应不会对通信方进行确认。也就是说存在“服务器是否就是发送请求中 URI 真正指定的主机,返回的响应是否真的返回到实际提出请求的客户端”等类似问题。

任何人都可发起请求

HTTP 协议的实现本身非常简单,不论是谁发送过来的请求都会返回响应。

  • 无法判断发出的请求是否到达理想服务器,伪装服务器
  • 无法判断响应是理想客服端发来的,伪造客服端
  • 无法判断对方是否具有访问权限
  • 无法判断是否会发给理想客户端
查明对手的证书

虽然使用 HTTP 协议无法确定通信方,但如果使用 SSL 则可以。SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段, 可用于确定方。

无法证明报文完整性,可能已遭篡改

所谓完整性是指信息的准确度。

接收到的内容可能有误

在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。

如何防止篡改

其中常用的是 MD5 和 SHA-1 等散列值校验的方法, 以及用来确认文件的数字签名方法。这些算法也会被改写。

HTTP+ 加密 + 认证 + 完整性保护**=HTTPS**

HTTP 加上加密处理和认证以及完整性保护后即是HTTPS

把添加了加密及认证机制的 HTTP 称为 HTTPS(HTTP Secure)。

HTTPS 是身披 SSL 外壳的 HTTP

相互交换密钥的公开密钥加密技术

SSL 采用一种叫做公开密钥加密(Public-key cryptography)的加密处理方式。

  • 共享密钥加密的困境
  • 使用两把密钥的公开密钥加密
  • HTTPS 采用混合加密机制

证明公开密钥正确性的证书

  • 可证明组织真实性的 EV SSL 证书

    证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在。拥有该特性的证书就是 EV SSL 证书(Extended Validation SSL Certificate)。

  • 用以确认客户端的客户端证书

    HTTPS 中还可以使用客户端证书。以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端,其作用跟服务器证书如出一辙。

  • 认证机构信誉第一

  • 由自认证机构颁发的证书称为自签名证书

HTTPS 的安全通信机制

步骤 1: 客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。

步骤 2: 服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。

步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。

步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。

步骤 5: SSL 第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。

步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。

步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。

步骤 8: 服务器同样发送 Change Cipher Spec 报文。

步骤 9: 服务器同样发送 Finished 报文。

步骤 10: 服务器和客户端的 Finished 报文交换完毕之后,SSL 连接就算建立完成。当然,通信会受到 SSL 的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。

步骤 11: 应用层协议通信,即发送 HTTP 响应。

步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP 的通信。

在以上流程中,应用层发送数据时会附加一种叫做 MAC(Message Authentication Code)的报文摘要。MAC 能够查知报文是否遭到篡改,从而保护报文的完整性。

从仅使用服务器端的公开密钥证书(服务器证书)建立 HTTPS 通信的整个过程

SSL和TLS

HTTPS 使用 SSL(Secure Socket Layer) 和 TLS(Transport Layer Security)这两个协议。

SSL目前主导权已转移到IETF,IETF以SSL3.0为基准,后制定了TLS1.0、TLS1.1、TLS1.2。

当前主流SSL3.0、TLS1.0

small_tips
  • HTTPSHTTP 要慢 2100

确认访问用户身份的认证

某些 Web 页面只想让特定的人浏览

何为认证

为了弄清究竟是谁在访问服务 器,就得让对方的客户端自报家门。

HTTP/1.1 使用的认证方式

  • BASIC 认证(基本认证)
  • DIGEST 认证(摘要认证)
  • SSL 客户端认证
  • FormBase 认证(基于表单认证)
  • Windows 统一认证(Keberos 认证、NTLM 认证)

BASIC 认证(基本认证)

BASIC 认证虽然采用 Base64 编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,在HTTP这种非加密信道通信就会被截获。

DIGEST 认证(摘要认证)

DIGEST 认证同样使用质询 / 响应的方式

所谓质询响应方式是指,一开始一方会先发送认证要求给另一方,接着使用从另一方那接收到的质询码计算生成响应码。最后将响应码返回给对方进行认证的方式。

DIGEST 认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。

SSL 客户端认证

SSL 客户端认证是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。

步骤

步骤 1: 接收到需要认证资源的请求,服务器会发送 Certificate Request 报文,要求客户端提供客户端证书。

步骤 2: 用户选择将发送的客户端证书后,客户端会把客户端证书信息以 Client Certificate 报文方式发送给服务器。

步骤 3: 服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始 HTTPS 加密通信。

SSL 客户端认证采用双因素认证

在多数情况下,SSL 客户端认证不会仅依靠证书完成认证,一般会和基于表单认证组合形成一种双因素认证(Two-factor authentication)来使用。换言之,第一个认证因素的 SSL 客户端证书用来认证客户端计算机, 另一个认证因素的密码则用来确定这是用户本人的行为。

SSL 客户端认证必要的费用(证书)

基于表单认证

客户端会向服务器上的 Web 应用程序发送登录信息(Credential),按登录信息的验证结果认证。

认证多半为基于表单认证

Session 管理及 Cookie 应用

基于 HTTP 的功能追加协议

基于 HTTP 的协议

消除 HTTP 瓶颈的 SPDY

HTTP 瓶颈

  • Ajax解决

  • Comet 解决

  • 消除 HTTP 瓶颈的 SPDY

SPDY 的设计与功能

SPDY 没有完全改写 HTTP 协议,而是在 TCP/IP 的应用层与运输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY 规定通信中使用 SSL。

SPDY 以会话层的形式加入,控制对数据的流动,但还是采用 HTTP 建立通信连接。因此,可照常使用 HTTP 的 GET 和 POST 等方 法、Cookie 以及 HTTP 报文等。

新功能
  • 多路复用流
  • 赋予请求优先级
  • 压缩 HTTP 首部
  • 推送功能
  • 服务器提示功能

SPDY 大体上消除了 Web 瓶颈

使用浏览器进行全双工通信的WebSocket

WebSocket 网络技术正是为解决这些问题而实现的一套新协议及 API。

WebSocket 技术主要是为了解决 Ajax 和 Comet 里 XMLHttpRequest 附带的缺陷所引起的问题。

WebSocket 协议

一旦 Web 服务器与客户端之间建立起 WebSocket 协议的通信连接, 之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML 或图片等任意格式的数据。

由于是建立在 HTTP 基础上的协议,因此连接的发起方仍是客户端, 而一旦确立 WebSocket 通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。

新特点
  • 推送功能
  • 减少通信量

实现 WebSocket 通信

完成一次握手

握手请求
GET /chat  HTTP/1.1 
Host: server.example.com 
Upgrade: websocket Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat 
Sec-WebSocket-Version: 13

用到 HTTP 的 Upgrade 首部字段,告知服务器通信协议发生改变。

Sec-WebSocket-Key 字段内记录着握手过程中必不可少的键值。Sec-WebSocket-Protocol 字段内记录使用的子协议。

握手响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket 
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 
Sec-WebSocket-Protocol: chat

Sec-WebSocket-Accept 的字段值是由握手请求中的 Sec-WebSocket-Key 的字段值生成的。

WebSocket API

var socket = new WebSocket('ws://game.example.com:12010/ socket.onopen = function () {
setInterval(function() {
if (socket.bufferedAmount == 0) socket.send(getUpdateData());
}, 50);
};

HTTP/2.0

HTTP/2.0特点

压缩 SPDYFriendly
多路复用 SPDY
TLS 义务化 Speed+ Mobility
协商 Speed+ Mobility,Friendly
客户端拉曳(Client Pull)/服务器推送 (Server Push) Speed+ Mobility
流量控制 SPDY
WebSocket Speed+ Mobility

注:HTTP Speed + Mobility 简写为 Speed + Mobility,Network-Friendly HTTP Upgrade 简写为 Friendly。

Web 服务器管理文件的 WebDAV

WebDAV(Web-based Distributed Authoring and Versioning,基于万维网的分布式创作和版本控制)是一个可对 Web 服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统。它作为扩展 HTTP/1.1 的协议定义在 RFC4918。

除了创建、删除文件等基本功能,它还具备文件创建者管理、文件编辑过程中禁止其他用户内容覆盖的加锁功能,以及对文件内容修改的版本控制功能。

扩展 HTTP/1.1WebDAV

集合(Collection):是一种统一管理多个资源的概念。以集合为单位可进行各种操作。也可实现类似集合的集合这样的叠加。

资源(Resource):把文件或集合称为资源。

属性(Property):定义资源的属性。定义以名称 =的格式执行。

锁(Lock):把文件设置成无法编辑状态。多人同时编辑时,可防止在同一时间进行内容写入。

WebDAV 内新增的方法及状态码

WebDAV 为实现远程文件管理,向 HTTP/1.1 中追加了以下这些方法。

PROPFIND :获取属性

PROPPATCH :修改属性

MKCOL :创建集合

COPY :复制资源及属性

MOVE :移动资源

LOCK :资源加锁

UNLOCK :资源解锁

为配合扩展的方法,状态码也随之扩展。

102 Processing :可正常处理请求,但目前是处理中状态

207 Multi-Status :存在多种状态

422 Unprocessible Entity :格式正确,内容有误

423 Locked :资源已被加锁

424 Failed Dependency :处理与某请求关联的请求失败,因此不再维持依赖关系

507 Isufficient Storage :保存空间不足

  • WebDAV 的请求实例

    下面是使用 PROPFIND 方法对 http://www.example.com/file 发起获取属性的请求。

    PROPFIND /file HTTP/1.1
    Host: www.example.com
    Content-Type: application/xml; charset="utf-8" Content-Length: 219
    
    <?xml version="1.0" encoding="utf-8" ?>
    <D:propfind xmlns:D="DAV:">
    <D:prop xmlns:R="http://ns.example.com/boxschema/">
    <R:bigbox/>
    <R:author/>
    <R:DingALing/>
    <R:Random/>
    </D:prop>
    </D:propfind>
  • WebDAV 的响应实例

    下面是针对之前的 PROPFIND 方法,返回http://www.example.com/file 的属性的响应。

    HTTP/1.1 207 Multi-Status
    Content-Type: application/xml; charset="utf-8" Content-Length: 831
    
    <?xml version="1.0" encoding="utf-8" ?>
    <D:multistatus xmlns:D="DAV:">
    <D:response xmlns:R="http://ns.example.com/boxschema/"
    <D:href>http://www.example.com/file</D:href>
    <D:propstat>
    <D:prop>
    <R:bigbox>
    <R:BoxType>Box type A</R:BoxType>
    </R:bigbox>
    <R:author>
    <R:Name>J.J. Johnson</R:Name>
    </R:author>
    </D:prop>
    <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
    <D:propstat>
    <D:prop><R:DingALing/><R:Random/></D:prop>
    <D:status>HTTP/1.1 403 Forbidden</D:status>
    <D:responsedescription> The user does not have acc
    </D:responsedescription>
    </D:propstat>
    </D:response>
    <D:responsedescription> There has been an access viola
    </D:responsedescription>
    </D:multistatus>

构建 Web 内容的技术

HTML

Web 页面几乎全由 HTML 构建
HTML版本
设计应用 CSS

动态HTML

使用客户端脚本语言将静态的 HTML 内容变成动态的技术的总称。

DOM

DOM 是用以操作 HTML 文档和 XML 文档的 API(Application Programming Interface,应用编程接口)。

Web应用

通过 Web 提供功能的 Web 应用

由程序创建的内容称为动态内容,而事先准备好的内容称为静态内容。

Web 服务器及程序协作的 CGI

CGI(Common Gateway Interface,通用网关接口)是指 Web 服务器在接收到客户端发送过来的请求后转发给程序的一组机制。在 CGI 的作用下,程序会对请求内容做出相应的动作,比如创建 HTML 等动态内容。

使用 CGI 的程序叫做 CGI 程序,通常是用 Perl、PHP、Ruby 和 C 等编程语言编写而成。

Java 而普及的 Servlet

Servlet 是一种能在服务器上创建动态内容的程序。Servlet 是用 Java 语言实现的一个接口,属于面向企业级 Java(JavaEE,Java Enterprise Edition)的一部分。负载小。

数据发布的格式及语言

可扩展标记语言

XML(eXtensible Markup Language,可扩展标记语言)是一种可按应用目标进行扩展的通用标记语言。旨在通过使用 XML,使互联网数据共享变得更容易。

XML 和 HTML 都是从标准通用标记语言 SGML(Standard Generalized Markup Language)简化而成。与 HTML 相比,它对数据的记录方式做了特殊处理。

发布更新信息的 RSS/Atom

RSS(简易信息聚合,也叫聚合内容)和 Atom 都是发布新闻或博客日志等更新信息文档的格式的总称。两者都用到了 XML。

JavaScript 衍生的轻量级易用 JSON

JSON(JavaScript Object Notation)是一种以JavaScript(ECMAScript)的对象表示法为基础的轻量级数据标记语言。

Web 的攻击技术

针对 Web 的攻击技术

HTTP 不具备必要的安全功能

在客户端即可篡改请求

针对 Web 应用的攻击模式

  • 主动攻击
  • 被动攻击
  • 以服务器为目标的主动攻击
  • 以服务器为目标的被动攻

因输出值转义不完全引发的安全漏洞

  • 客户端的验证
  • Web 应用端(服务器端)的验证
    • 输入值验证
    • 输出值转义

跨站脚本攻击(Cross-Site Scripting,XSS)

跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 进行的一种攻击。

SQL 注入(SQL Injection)

OS 命令注入攻击(OS Command Injection)

HTTP 首部注入攻击(HTTP Header Injection)

邮件首部注入(Mail Header Injection)

目录遍历(Directory Traversal)攻击

远程文件包含漏洞(Remote File Inclusion)

因设置或设计上的缺陷引发的安全漏洞

强制浏览(Forced Browsing)

强制浏览(Forced Browsing)安全漏洞是指,从安置在 Web 服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。

不正确的错误消息处理(Error Handling Vulnerability)

不正确的错误消息处理(Error Handling Vulnerability)的安全漏洞是指,Web 应用的错误信息内包含对攻击者有用的信息。

开放重定向(Open Redirect)

开放重定向(Open Redirect)是一种对指定的任意 URL 作重定向跳转的功能。而于此功能相关联的安全漏洞是指,假如指定的重定向 URL 到某个具有恶意的 Web 网站,那么用户就会被诱导至那个 Web 网站。

因会话管理疏忽引发的安全漏洞

会话劫持(Session Hijack)

会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话 ID,并非法使用此会话 ID 伪装成用户,达到攻击的目的。

会话固定攻击

对以窃取目标会话 ID 为主动攻击手段的会话劫持而言,会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话 ID,属于被动攻击。

跨站点请求伪造(Cross-Site Request Forgeries,CSRF)

跨站点请求伪造(Cross-Site Request Forgeries,CSRF)攻击是指攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。

其他安全漏洞

密码破解攻击(Password Cracking)

密码破解攻击(Password Cracking)即算出密码,突破认证。

点击劫持(Clickjacking)

点击劫持(Clickjacking)是指利用透明的按钮或链接做成陷阱,覆盖在 Web 页面之上。然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。这种行为又称为界面伪装(UI Redressing)。

DoS 攻击(Denial of Service attack)

DoS 攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫做服务停止攻击或拒绝服务攻击。DoS 攻击的对象不仅限于 Web 网站,还包括网络设备及服务器等。

后门程序(Backdoor)

后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使用受限功能。利用后门程序就能够使用原本受限制的功能。


文章作者: 0xdadream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xdadream !
评论
  目录