菜鸟笔记
提升您的技术认知

HTTP 代理路径与安全验证

阅读 : 2133

    这次主要内容是关于查看报文流动过程和代理的安全验证功能。

  追踪报文

   由于代理有这么多的好处,所以在实际的HTTP请求中有很大一部分都是经过代理转发的。那么如果我们想要知道一个报文如何流过网络到达服务器的话,就要使用一些方法。

   VIA首部

   VIA首部列出了报文途径的每个节点(网关或者代理)的信息,每经过一个节点,便会把这个节点的相关信息添加到VIA首部列表的末尾。

HTTP 代理路径与安全验证

图1

  当请求报文经过以上代理1和代理2的时候,VIA首部便会变成这个样子:VIA:1.1 proxy-62.irenes-isp.net,1.0 cache.joes-hardware.com

  每经过一个代理的时候便会在VIA首部加上代理自己的信息,信息分四部分:协议名。协议版本,节点名,节点注释。协议名说明的是该节点接收到的协议类型,例如可能是HTTP,FTP等。协议版本即为该协议的版本信息。节点名即为中间节点的主机和可选端口号。有些节点不想暴露自己的信息,那么就可以使用假名。节点注释即对中间节点的一些解释说明。

  请求报文和响应报文都会进过代理传输,因此都需要包含VIA首部。通常情况下请求报文和响应报文都是在一条TCP连接传输的。所以经过代理的顺序请求报文和响应报文一般都是相反的。

  VIA与网关

  有些代理会提供网关功能,VIA首部会记录这些协议的转换,例如FTP to HTTP的转换。

  浏览器发送 GET ftp://www.coonote.com/robots.txt HTTP/1.0 的请求,这是一条HTTP请求,当代理接收到该请求的时候,会使用网关功能,将协议转换为FTP,同时VIA首部会变成Via:HTTP/1.0 proxy-62.irenes-isp.net,响应报文中的VIA首部为FTP/1.0 proxy-62.irenes-isp.net,因为它记录的是接收到的协议类型。

  Server首部记录的是服务器使用的软件信息。

  当然有些时候出于安全考虑,我们并不想让客户端知道网络上的代理结构或路径,这时我们可以使用假名,然后将多个VIA首部合并为一个联合条目。

  TRACE方法

  之前介绍过TRACE方法,他是要求服务器在响应报文中把请求报文作为内容传回客户端,以用来观察报文的传输与变化情况。可以看出TRACE方法对于调试是非常有用的。TRACE的content-type为message/http。状态为200 OK。例如在图1中,发送以下请求报文:

   TRACE /index.html HTTP/1.1

   Host:www.baidu.com

   Accept:text/html

那么响应报文就应该为:

  HTTP/1.1 200 OK

  content-type:message/http

  Via:1.0 cache.joes-hardware.com,1.1 proxy-62.irenes-isp.net

 

   TRACE /index.html HTTP/1.1

   Host:www.baidu.com

   Accept:text/html

   Via:1.1 proxy-62.irenes-isp.net,1.0 cache.joes-hardware.com

从返回的报文中可以看到请求报文抵达服务器的样子。

   max-forwards首部是用来限制TRACE和OPTIONS请求所经过的转发次数。可以用来测试代理链是否在无限循环中转发报文。该请求首部包含了一个整数,用来说明这个报文还可以被转发多少次。每经过一个节点,这个首部的数字便会减一。如果它的值为0,即使接受者不是目标服务器,它也必须将TRACE报文立刻回送给客户端,而不能继续转发。

   代理认证

   代理可以进行访问控制。HTTP定义了一种名为代理认证的机制,这种机制在用户访问资源时需要提供有效的访问权权限。

  • 对受限制的内容请求到达一台代理服务器时,代理服务器会返回一个要求使用访问证书的407 proxy authorization required状态码,向客户端要求证书。
  • 客户端接收到407访问,并寻找证书。
  • 只要获得了证书,客户端就会重新发送请求,在proxy-authorization首部提供证书。
  • 如果证书有效,那么代理就会将原始请求沿着传输链路向下传送。

   如果有多个代理,而且每个代理都要进行验证的话,代理认证往往无法很好的工作。

  代理的互操作性

   如果代理不了解一个方法,那么就尽可能的将报文原封不动的转发到下一个节点上去。

   通过OPTIONS方法,客户端或者代理可以发现web服务器或者服务器上某个特定资源可以使用的方法。这个方法使客户端在与服务器进行交互之前,确定服务器的能力。

   比如发送请求:

   OPTIONS * HTTP/1.1

   (*代表任意资源)
   如果成功,OPTIONS方法就会返回一个包含了各种首部字段的200 OK响应,这些字段描述了服务器所能支持的各种方法。在HTTP/1.1中,使用的是Allow的首部来描述服务器或者服务器文件所支持的方法。例如对应上个请求报文,响应报文中可能包含:

   Allow:GET,HEAD,PUT

   这个首部就说明了,这个服务器能接收GET,HEAD,PUT请求。

   Allow首部也可以作为请求首部,用来建议服务器支持某些方法,但不强制要求。服务器在相应的响应中也应该包含一个Allow首部来说明该资源实际支持的方法。