【图解http】

目录

了解web及网络基础

TCP/IP协议族

一、TCP/IP是互联网相关的各类协议族的总称。通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集。不是说协议只有这两个,但是因为他们最具代表性,所以协议族称为TCP/IP协议。其他的协议还有SMTP协议、UDP协议以及ARP协议等等……
二、TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层。

  1. 应用层:决定了向用户提供应用服务时通信的活动。
    相关服务/协议:FTP、DNS、HTTP
  2. 传输层:传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
    相关协议:TCP、UDP
  3. 网络层:用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。
    相关协议:ip协议
  4. 链路层:用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

我们用HTTP举例来说明,首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。接着,为了传输方便,在传输层(TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的HTTP请求。

三、发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。这种把数据信息包装起来的做法称为封装(encapsulate)。

与HTTP关系密切的协议:IP、TCP和DNS

一、IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址。IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。

  1. MAC地址就像是网卡的固有属性,一旦网卡被生产也就存在。IP地址是网卡所在设备在某个子网下被分配的地址,若设备更换到其他子网对应的IP地址也就改变。IP地址如住址,MAC如身份证号。
  2. 使用ARP协议凭借MAC地址进行通信:ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。ARP协议会向当前网络中的机器广播查找目标IP对应的MAC地址,如果没有收到响应,则默认发送给路由

二、TCP:提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。为了准确无误地将数据送达目标处,TCP协议采用了三次握手
三、DNS:提供域名到IP地址之间的解析服务。

各种协议与HTTP协议的关系

请添加图片描述

URI和URL

一、URI就是由某个协议方案表示的资源的定位标识符。协议方案是指访问资源所使用的协议类型名称。采用HTTP协议时,协议方案就是http。
二、URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。
三、URI的格式。请添加图片描述

  1. 登录信息(认证):此项是可选项。
  2. 服务器地址:地址可以是类似hackr.jp这种DNS可解析的名称,或是192.168.1.1这类IPv4地址名,还可以是[0:0:0:0:0:0:0:1]这样用方括号括起来的IPv6地址名。
  3. 服务器端口号:此项也是可选项,若用户省略则自动使用默认端口号。
  4. 带层次的文件路径
  5. 查询字符串:针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。此项可选。

通过使用查询字符串(URL参数),可以区分用户的来源是否已知,以及它是来自自然搜索还是来自广告。 “URL参数”是提供用户足迹的参数。

  1. 片段标识符:该项也为可选项。

简单的http协议

通过请求和响应的交换达成通信

一、请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
请添加图片描述
二、 响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成
请添加图片描述

HTTP是不保存状态的协议

无状态是指两次连接通信之间是没有任何关系的,每次都是一个新的连接,服务端不会记录前后的请求信息。为了实现期望的保持状态功能,于是引入了Cookie技术。

请求URI定位资源

如果不是访问特定资源而是对服务器本身发起请求,可以用一个*来代替请求URI。比如option方法,询问服务器能使用哪些方法,资源位置可以填*

告知服务器意图的HTTP方法

一、GET:获取资源
二、POST:传输实体主体,提交数据
三、PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST(Representational State Transfer,表征状态转移)标准的同类Web网站,就可能会开放使用PUT方法。

Post方法与put方法的区别:POST方法不是幂等的,而PUT方法有幂等性。幂等特点就是任意多次执行所产生的影响均与依次一次执行的影响相同。POST在请求的时候,服务器每次都创建一个文件,但是在PUT方法的时候只是简单地更新,而不是去重新创建。因此PUT是幂等的。
分布式场景,服务间的调用要有重试机制。这也意味着被调用方的每个接口都要满足幂等。post实现幂等方案,可以在请求参数里面写入唯一标识,多次请求用唯一标识过滤即可。

四、HEAD:获得报文首部。用于确认URI的有效性及资源更新的日期时间等。
五、DELETE:删除文件。HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制,所以一般的Web网站也不使用DELETE方法。
六、OPTIONS方法用来查询针对请求URI指定的资源支持的方法。

定义的6个请求消息分别是:邀请(INVITE),证实(ACK),再见(BYE),取消(CANCEL),选择(OPTIONS)和登记(REGISTER)。其中,INVITE用来邀请用户或者应用程序加入某会话,相当于呼叫信令中的Setup消息。ACk用于证实客户机已收到关于INVITE请求的最终响应,该消息仅和INVITE配套使用。BYE用于指示释放呼叫,可由主叫方或被叫方发出,任一方收到BYE后应停止向发起BYE请求的另一方发送媒体流。CANCEL用于取消一个尚未完成的请求。OPTIONS用于询问服务器的能力,包括用户的忙闲状态信息。按RFC3216初衷,实体发起呼叫前可发送该消息以确认网络实体是否支持某种消息或某种能力,但从电信网络运营角度,不希望终端能获知网络能力。目前,有的厂商或运营商将该消息作为心跳消息来确认对端实体是否存活、两实体间是否可达,在该种应用下,实体会周期向相关实体发送OPTION消息(不带有查询能力的参数),对端收到该消息后,返回200消息表示收到OPTION消息。。REGISTER则用于客户程序在启动时向登记服务器登记其地址。

七、TRACE:让Web服务器端将之前的请求通信环回给客户端的方法。

发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK的响应。客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。但是,TRACE方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。

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

在 HTTP 协议中,CONNECT 方法可以开启一个客户端与所请求资源之间的双向沟通的通道。它可以用来创建隧道(tunnel)。

  1. CONNECT 可以用来访问采用了 SSL (HTTPS) 协议的站点。客户端要求代理服务器将 TCP 连接作为通往目的主机隧道。之后该服务器会代替客户端与目的主机建立连接。连接建立好之后,代理服务器会面向客户端发送或接收 TCP 消息流。
  2. 因为客户端要与服务器建立隧道,但是经过代理,而代理没有私钥相关证书。所以先发送connection请求,告诉代理,接下来的报文你都别管了,直接转发就行。所以感觉上是客户端直接和服务器建立了隧道,直接传输报文。

持久连接节省通信量

一、持久连接:只要任意一端没有明确提出断开连接,则保持TCP连接状态。

这里用 keep alive 实现的长连接,只是为了避免每次请求都要重新建立 TCP 连接带来的消耗,因此进行一轮三次握手,之后保持复用链路,直接请求数据,连接空闲间隔默认2小时。但在移动互联网时代,我们常说的长连接并不是使用http的keep alive,而是基于 tcp 自定义协议,使用心跳机制(这里心跳间隔往往选择几秒,半分,五分等更高频率),并且服务端也能推送数据,往往用于 im ,推送(如实时行情推送,Android 后台消息推送),因此要区分两者的长连接。在 http 的 keep alive 的长连接中,依然是客户端请求服务端响应,并不包含服务端推送的功能。

二、在HTTP/1.1中,所有的连接默认都是持久连接
三、持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。

HTTP报文

用于HTTP协议交互的信息被称为HTTP报文。HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。

编码提升传输速率

一、HTTP在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。但是,编码的操作需要计算机来完成,因此会消耗更多的CPU等资源。
二、报文(message):是HTTP通信中的基本单位,由8位组字节流
三、实体(entity):作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
四、报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。

压缩传输的内容编码

内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。常用的内容编码有以下几种:gzip(GNU zip)、compress(UNIX系统的标准压缩)、deflate(zlib)、identity(不进行编码)

分割发送的分块传输编码

分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。

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

一、发送邮件时,我们可以在邮件里写入文字并添加多份附件。这是因为采用了MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。在MIME扩展中会使用一种称为多部分对象集合(Multipart)的方法,来容纳多份不同类型的数据。相应地,HTTP协议中也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。

在springmvc中,当DispatcherServlet做doDispatcher的时候,会对request判断是否为multipart。它的原理就在这里。

二、多部分对象集合包含的对象如下。

  1. multipart/form-data:在Web表单文件上传时使用。

“multipart/form-data” 是一种 HTTP 内容类型,用于向服务器提交表单数据。它与其他 HTTP 内容类型的不同之处在于,它允许提交不止一个数据项,并且每个数据项都可以具有不同的内容类型。当浏览器提交表单时,它会将数据打包成多部分(multipart),并以 “multipart/form-data” 的格式发送到服务器。服务器在接收到这样的请求后,可以对每一部分的数据进行单独处理。

  1. multipart/byteranges:状态码206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。

“multipart/byteranges” 是一种 MIME 类型,它表示请求的 HTTP 响应包含多个独立的部分,每个部分代表响应的一个子集。这种方法通常用于在客户端请求的某些字节范围内获取服务器上的资源。例如,假设客户端想获取一个大文件的部分,而不是整个文件。客户端可以通过请求一个特定的字节范围来获取文件的部分。服务器会响应一个 “multipart/byteranges” 类型的响应,其中包含客户端请求的字节范围内的所有数据。
这种方法可以帮助优化网络带宽和减少服务器的负载,因为客户端只需要下载所需的数据。

三、在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。
四、使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体的起始行之前插入“–”标记(例如:–AaB03x、–THIS_STRING_SEPARATES),而在多部分对象集合对应的字符串的最后插入“–”标记(例如:–AaB03x–、–THIS_STRING_SEPARATES–)作为结束。

获取部分内容的范围请求

执行范围请求时,会用到首部字段Range来指定资源的byte范围。byte范围的指定形式如下:

●5001~10000字节
​​​​​​Range: bytes=5001-10000​​
●从5001字节之后全部的
​​​​​​Range: bytes=5001-​​
●从一开始到3000字节和5000~7000字节的多重范围
​​​​​​Range: bytes=-3000, 5000-7000​​

针对范围请求,响应会返回状态码为206 Partial Content的响应报文。另外,对于多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。如果服务器端无法响应范围请求,则会返回状态码200 OK和完整的实体内容。

内容协商返回最合适的内容

一、当浏览器的默认语言为英语或中文,访问相同URI的Web页面时,则会显示对应的英语版或中文版的Web页面。这样的机制称为内容协商.

访问的是同一个uri,但是会用浏览器的语言展示

二、内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
包含在请求报文中的某些首部字段(如下)就是判断的基准:Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Language
三、内容协商技术有以下3种类型。

  1. 服务器驱动协商(Server-driven Negotiation):由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理。但对用户来说,以浏览器发送的信息作为判定的依据,并不一定能筛选出最优内容。
  2. 客户端驱动协商(Agent-driven Negotiation):由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择。还可以利用JavaScript脚本在Web页面上自动进行上述选择。比如按OS的类型或浏览器类型,自行切换成PC版页面或手机版页面。
  3. 透明协商(Transparent Negotiation):是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法。

状态码告知从服务器端返回的请求结果

服务器只要遵循类别定义,可以自定义状态码

2XX成功:响应结果表明请求被正常处理了。

一、200 OK:表示从客户端发来的请求在服务器端被正常处理了。
二、204 No Content:该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

应用:

  1. 客户端向服务器发送了处理请求,服务器处理成功后,不希望客户端有变化,可以以204状态码返回
  2. 导航或ifeame,返回空的200响应,页面会空白,返回204则停留在当前页面

三、206 Partial Content:客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

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

我们在网站建设中,时常会遇到需要网页重定向的情况:

  1. 网站调整(如改变网页目录结构);
  2. 网页被移到一个新地址;
  3. 网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
    这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

一、301 Moved Permanently:永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
二、302 Found:临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。

常见的是表单提交时,会先到表单的处理控制器中进行逻辑分析,再对用户进行重定向。这个逻辑分析的页面一般用户不可见

三、303 See Other:由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。

303状态码和302 Found状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。比如,当使用POST方法访问CGI程序,其执行后的处理结果是希望客户端能以GET方法重定向到另一个URI上去时,返回303状态码。

当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。为什么要把POST方法改成GET方法:
如果浏览器发送的最后一个请求是POST请求,这时用户点了刷新按钮,浏览器会弹出一个对话框询问用户是否要重新提交表单(可以参考某些网站输入密码时点了刷新),这会让用户觉得很奇怪,是一种很不好的用户体验,解决这个问题的方法就是不让POST作最后一个请求,那如何才能不让POST作最后一个请求呢?就是返回一个302/303重定向,让用户重定向回到这个地址,并且由于浏览器会自动把POST改成GET,所以这时相当于以GET的方式又访问了一遍这个地址,最后一个请求变成GET了,用户再点刷新按钮就不会弹出对话框了,这虽然会多带来一次请求,但是可以大大的提高用户体验,这个技巧叫POST重定向/GET模式

301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都会这么做。

Https改造项目,所有的http重定向到https,是做的301,此时所有的post请求发生请求主体参数丢失的情况,后来在做301的时候post保持无协议,不做301

四、304 Not Modified:客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304 Not Modified(服务器端资源未改变,可直接使用客户端未过期的缓存)。304状态码返回时,不包含任何响应的主体部分。
五、307 Temporary Redirect:307会遵照浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每种浏览器有可能出现不同的情况。

4XX客户端错误

一、400 Bad Request:请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。
二、401 Unauthorized:发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。

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

三、403 Forbidden:未获得文件系统的访问授权,访问权限出现某些问题(从未授权的发送源IP地址试图访问)等列举的情况都可能是发生403的原因。

对html目录设置普通用户无法访问,就可以出现这个状态码,客户端无权限访问此资源。

四、404 Not Found:该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用(看看此处的评论)

5XX服务器错误

一、500 Internal Server Error:服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
二、502 Bad Gateway:作为代理或网关使用的服务器从请求响应链的下一条链路上收到了一条伪响应(比如它无法连接到其父网关)时,使用此状态码。
三、503 Service Unavailable:服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。
四、504 Gateway Timeout:与状态码408类似,只是这里的响应来自一个网关或代理,它们在等待另一服务器对其请求进行响应时超时了。

与http协作的web服务器

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

一、HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点。比如,提供Web托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网站。这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功能。
二、在互联网上,域名通过DNS服务映射到IP地址(域名解析)之后访问目标网站。可见,当请求发送到服务器时,已经是以IP地址形式访问了。所以,如果一台服务器内托管了www.tricorder.jp和www.hackr.jp这两个域名,当收到请求时就需要弄清楚究竟要访问哪个域名。在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI。

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

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

代理是中转服务器只提供HTTP服务; 网关是中转服务器可以提供除了HTTP服务外的其他服务,比如安全,数据库访问和其他系统的互动等; 隧道的目的是在客户端与服务端之间建立一个安全的数据通路(采用了加密的方式保证安全)

  1. 代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求URI,会直接发送给前方持有资源的目标服务器。持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过代理服务器后再传给客户端。每次通过代理服务器转发请求或响应时,会追加写入Via首部信息标记出经过的主机信息。代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一种是是否会修改报文。
    (1)缓存代理:代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
    (2)透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。

透明代理会隐藏你的真实IP地址,但是仍旧可以通过某个字段知道你是谁,查到你的IP。但是匿名代理,只知道你使用了代理,无法知道你的真实IP. 只知道代理IP,还有个混淆代理,也可以知道你的IP地址,不过获取到的是假的IP地址,因为混淆代理帮你伪装了。

有时候可能需要改变报文的数据,比如增加一个header,但是想让客户端无察觉,可以使用代理

  1. 网关是协议转换器,可以理解为服务的入口。它和客户端之前使用http协议,和后端服务器之前使用其它协议,比如web service、rpc、socket、spring微服务等。它实现 http协议和后端协议的转换。利用网关可以由HTTP请求转化为其他协议通信,网关还可以加密报文
  2. 隧道本身不会去解析HTTP请求。通过隧道的传输,可以和远距离的服务器安全通信。隧道本身是透明的,客户端不用在意隧道的存在

也就是说,代理和网关会去解析http请求,其中代理可能会直接返回请求的内容,而网关可能会将请求转发为其他协议,而隧道,理解为“透传”,重点放在了保证请求的安全。

保存资源的缓存

当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。放缓存的数据和资源肯定是改动频率比较低的,设置一个缓存的过期时间。客户端请求资源时,如果缓存过期了,就去服务器拿,拿到了返回给客户端,并且刷新自己的缓存

HTTP首部

HTTP报文首部

一、HTTP请求报文:在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。
二、HTTP响应报文:在响应中,HTTP报文由HTTP版本、状态码(数字和原因短语)、HTTP首部字段3部分构成。
请添加图片描述

HTTP首部字段

一、当HTTP报文首部中出现了两个或两个以上具有相同首部字段名时会怎么样?这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,结果可能并不一致。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。
二、HTTP首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型:

  1. 端到端首部:分在此类别中的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。传输过程中即便有缓存代理也会完整得传输,因为这部分内容被规定成了必须被转发
  2. 逐跳首部:分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1和之后版本中,如果要使用hop-by-hop首部,需提供Connection首部字段。缓存服务器接受到这个首部字段,能明白需要干嘛,自己处理,之后也不会转发给最终服务器,自己就处理完成,然后返回给前端。下面列举了HTTP/1.1中的逐跳首部字段。除这8个首部字段之外,其他所有字段都属于端到端首部:Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade

HTTP/1.1 通用首部字段:请求报文和响应报文双方都会使用的首部

Cache-Control

一、若你没有缓存服务器,cache-control指令都基本没用
二、缓存请求指令
请添加图片描述
三、缓存响应指令
请添加图片描述

  1. 客户端发送的请求中如果包含no-cache指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。
​​​​​​Cache-Control: no-cache=Location​​

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

no_cache指令分为请求和响应
请求中代表不接受过期的响应,意思就是,缓存服务器每次都要去原服务器进行有效性验证(及验证eTag值)
响应中主要影响两处:一处缓存服务器不能对资源进行缓存,并且以后对于该资原服务器不进行有效性验证;另一处客户端发现no_cache中不带参数则可以使用缓存,否则不能使用缓存
no_store才是真正的不使用缓存
max_age代表缓存服务器在这段时间内是不需要向原服务器进行有效性验证

  1. s-maxage指令的功能和max-age指令的相同,它们的不同点是s-maxage指令只适用于供多位用户使用的公共缓存服务器。也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。
    另外,当使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理。

有s-maxage则直接忽略max-age了……所以当接收方是一个只供一个用户调用的缓存服务器时,s-maxage不起任何作用,而max-age还被忽略了

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

Http1.1版本中,优先级:s-maxage>max-age>Expires

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

min-fresh=60 :缓存服务器的资源离到期时间最小等于60秒才会返回

  1. 使用max-stale可指示缓存资源,即使过期也照常接收。如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于max-stale指定的时间内,仍旧会被客户端接收。
  2. only-if-cached:该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout。

功能:即客户端只从缓存服务器中获取资源: 缓存服务器不会向源服务器发送资源有效性认证,源服务器也不会向缓存服务器发送更新资源。
若请求缓存加载失败,则会返回504状态码Gateaway TimeOut

  1. 使用must-revalidate指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条504(Gateway Timeout)状态码。

使用must-revalidate指令会忽略请求的max-stale指令

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

这里是自己检查本地的缓存是否过期, 而上面的must-revalidate是向源服务器询问数据的

  1. 使用no-transform指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。
  2. 通过cache-extension标记(token),可以扩展Cache-Control首部字段内的指令。

Connection

一、Connection首部字段具备如下两个作用。

  1. 控制不再转发给代理的首部字段
  2. 管理持久连接

二、HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection首部字段的值为Close。
​​​​三、HTTP/1.1之前的HTTP版本的默认连接都是非持久连接。为此,如果想在旧版本的HTTP协议上维持持续连接,则需要指定Connection首部字段的值为Keep-Alive。Connection: Keep-Alive​​

Date

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

Pragma

一、该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。客户端会要求所有的中间服务器不返回缓存的资源。

别给我缓存的意思

Trailer

该首部字段可应用在HTTP/1.1版本分块传输编码时,可以用来消息的完整性校验、消息的数字签名、消息经过处理后的最终状态。

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

Upgrade

一、首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
二、Connection的值被指定为Upgrade。Upgrade首部字段产生作用的Upgrade对象仅限于客户端和邻接服务器之间。因此,使用首部字段Upgrade时,还需要额外指定Connection:Upgrade

Connection:Upgrade:告诉相邻的服务器不要转发Upgrade这个字段(Upgrade首部字段产生作用的Upgrade对象仅限于客户端和相邻的服务器之间)

Via

一、使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发。
二、首部字段Via不仅用于追踪报文的转发,还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。
三、Via首部是为了追踪传输路径,所以经常会和TRACE方法一起使用。比如,代理服务器接收到由TRACE方法发送过来的请求(其中Max-Forwards: 0)时,代理服务器就不能再转发该请求了。这种情况下,代理服务器会将自身的信息附加到Via首部后,返回该请求的响应。

Warning

该首部通常会告知用户一些与缓存相关的问题的警告。

请求首部字段

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

Accept

一、Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。

斜线左边是资源类型,右边是资源格式,一组代表一种资源的一种可接受的格式,如果可以接受多种,互相之间逗号分隔。

当我们插入图片时,为了让图片占用资源最少,不同的图片的处理策略不同。

  1. 当图片是人像时,比较复杂的色块组合,使用JPG格式图片尺寸最小。JPG的处理原理是合并相邻色块,减小像素
  2. 当图像的色块是大面积纯色色块时,使用PEG,面积最小,最节省内存PEG的处理原理:会保留图层,图像非常清晰,不会合并相邻色块,通过再次导出方式可以去除图层
  3. 当我们的网页需要插入动图时一般插入GIF

二、若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,用分号(;)进行分隔。权重值q的范围是0~1(可精确到小数点后3位),且1为最大值。不指定权重q值时,默认权重为q=1.0。
当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。

Accept-Charset

Accept-Charset首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段Accept相同的是可用权重q值来表示相对优先级。该首部字段应用于内容协商机制的服务器驱动协商。

Accept-Encoding

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

  1. 浏览器发送http request给服务器,request中带accept-Encoding:gzip,deflat。(告诉服务器,浏览器支持gzip压缩)
  2. 服务器收到request后,生成原始的response,其中有原始的content-type和content-length。
  3. 服务器通过gzip对response进行编码,编码后header中有context-type和context-length(压缩后的大小),并且增加了content-encoding:gzip。
  4. 浏览器接收到response后,根据content-encoding:gzip来对response进行解码。

Accept-Language

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

Authorization

确保web安全的https

HTTP的缺点

一、通信使用明文(不加密),内容可能会被窃听:窃听相同段上的通信并非难事。只需要收集在互联网上流动的数据包(帧)就行了。对于收集来的数据包的解析工作,可交给那些抓包(Packet Capture)或嗅探器(Sniffer)工具。加密防止被窃听:

  1. 通信的加密:HTTP协议中没有加密机制,但可以通过和SSL或TLS组合使用,加密HTTP的通信内容。

用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了与SSL组合使用的HTTP被称为HTTPS
请添加图片描述

  1. 内容的加密:由于该方式不同于SSL或TLS将整个通信线路加密处理,所以内容仍有被篡改的风险。
    请添加图片描述

二、不验证通信方的身份,因此有可能遭遇伪装。防范:数字证书
三、无法证明报文的完整性,所以有可能已遭篡改。防范:常用的是MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。提供文件下载服务的Web网站也会提供相应的以PGP创建的数字签名及MD5算法生成的散列值。但是用这些方法也依然无法百分百保证确认结果正确。因为PGP和MD5本身被改写的话,用户是没有办法意识到的。

PGP是用来证明创建文件的数字签名,MD5是由单向函数生成的散列值。不论使用哪一种方法,都需要操纵客户端的用户本人亲自检查验证下载的文件是否就是原来服务器上的文件。

请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击。在某些情况下,比如下载资源是海外资源,通过劫持域名纂改到国内提前缓存好的服务器上,可以减少成本。当然,这必须是在用户允许的情况下。

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

一、https来解决http的问题:

  1. 加密:通过使用ssl,ssl是在http层和tcp层增加了一层,http数据要先发送给ssl,ssl在发送给tcp。ssl其实是建立了一个加密通道,采用非对称加密和对称加密,分别使用它们的优点。在交换对称加密(共享加密)密钥时候使用非对称加密,交换完成加密数据使用对称加密密钥进行加密(对称加密效率高)。
  2. 发送者身份验证:密钥认证证书验证(去第三方信的过的机构验证)。一般都是对服务器证书进行验证。服务器下发密钥认证证书,客户端收到后去机构验证,验证通过后,进行后面流程。

二、经常会在Web的登录页面和购物结算界面等使用HTTPS通信。
三、HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。

SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。

四、如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。或许在公开密钥传输途中,真正的公开密钥已经被攻击者替换掉了。为了解决上述问题,可以使用由数字证书认证机构(CA,Certificate Authority)和其相关机关颁发的公开密钥证书。
五、数字证书认证机构的业务流程。

  1. 服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
  2. 服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。公钥证书也可叫做数字证书或直接称为证书。
  3. 接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:一,认证服务器的公开密钥的是真实有效的数字证书认证机构。二,服务器的公开密钥是值得信赖的。

此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。

六、客户端证书存在的问题:

  1. 证书的获取及发布:想获取证书时,用户得自行安装客户端证书。但由于客户端证书是要付费购买的,且每张证书对应到每位用户也就意味着需支付和用户数对等的费用。另外,要让知识层次不同的用户们自行安装证书,这件事本身也充满了各种挑战。现状是,安全性极高的认证机构可颁发客户端证书但仅用于特殊用途的业务。比如那些可支撑客户端证书支出费用的业务。例如,银行的网上银行就采用了客户端证书。在登录网银时不仅要求用户确认输入ID和密码,还会要求用户的客户端证书,以确认用户是否从特定的终端访问网银。
  2. 客户端证书毕竟只能用来证明客户端实际存在,而不能用来证明用户本人的真实有效性。也就是说,只要获得了安装有客户端证书的计算机的使用权限,也就意味着同时拥有了客户端证书的使用权限。

七、如果使用OpenSSL这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。但该服务器证书在互联网上不可作为证书使用,似乎没什么帮助。浏览器访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告消息。

由自认证机构颁发的服务器证书之所以不起作用,是因为它无法消除伪装的可能性

八、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的通信。

入侵者假如过早的发送了一个TCP FIN来终止正常的ssl连接,接收方收到的数据就不完整,所以结束报文是在ssl记录中发生的,指定一个ssl记录终止会话过程,因为记录中附加的mac密钥是无法被劫持篡改的

CBC模式(Cipher Block Chaining)又名密码分组链接模式。在此模式下,将前一个明文块加密处理后和下一个明文块做XOR运算,使之重叠,然后再对运算结果做加密处理。对第一个明文块做加密时,要么使用前一段密文的最后一块,要么利用外部生成的初始向量

九、HTTPS存在的问题:那就是当使用SSL时,它的处理速度会变慢。SSL的慢分两种。一种是指通信慢。另一种是指由于大量消耗CPU及内存等资源,导致处理速度变慢。和使用HTTP相比,网络负载可能会变慢2到100倍。除去和TCP连接、发送HTTP请求·响应以外,还必须进行SSL通信,因此整体上处理通信量不可避免会增加。另一点是SSL必须进行加密处理。在服务器和客户端都需要进行加密和解密的运算处理。因此从结果上讲,比起HTTP会更多地消耗服务器和客户端的硬件资源,导致负载增强。可以使用SSL加速器这种(专用服务器)硬件来改善该问题。

十、既然HTTPS那么安全可靠,那为何所有的Web网站不一直使用HTTPS?

  1. 因为与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。
    因此,如果是非敏感信息则使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS加密通信。特别是每当那些访问量较多的Web网站在进行加密处理时,它们所承担着的负载不容小觑。在进行加密处理时,并非对所有内容都进行加密处理,而是仅在那些需要信息隐藏时才会加密,以节约资源。
  2. 想要节约购买证书的开销

确认访问用户身份的认证

何为认证

一、需要核对“登录者本人才知道的信息”、“登录者本人才会有的信息”。核对的信息通常是指以下这些:

  1. 密码:只有本人才会知道的字符串信息。
  2. 动态令牌:仅限本人持有的设备内显示的一次性密码。
  3. 数字证书:仅限本人(终端)持有的信息。
  4. 生物认证:指纹和虹膜等本人的生理信息。
  5. IC卡等:仅限本人持有的信息。

二、HTTP/1.1使用的认证方式:BASIC认证(基本认证)、DIGEST认证(摘要认证)、SSL客户端认证、FormBase认证(基于表单认证)。此外还有Windows统一认证(Keberos认证、NTLM认证)。如大数据组件,包含 Kafka,HBase,Zookeeper 等等

BASIC认证

一、认证步骤:

  1. 当请求的资源需要BASIC认证时,服务器会随状态码401 Authorization Required,返回带WWW-Authenticate首部字段的响应。该字段内包含认证的方式(BASIC)及Request-URI安全域字符串(realm)。
  2. 接收到状态码401的客户端为了通过BASIC认证,需要将用户ID及密码发送给服务器。发送的字符串内容是由用户ID和密码构成,两者中间以冒号(:)连接后,再经过Base64编码处理。
  3. 接收到包含首部字段Authorization请求的服务器,会对认证信息的正确性进行验证。如验证通过,则返回一条包含Request-URI资源的响应。

二、缺点:BASIC认证虽然采用Base64编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,由于明文解码后就是用户ID和密码,在HTTP等非加密通信的线路上进行BASIC认证的过程中,如果被人窃听,被盗的可能性极高。除此之外想再进行一次BASIC认证时,一般的浏览器却无法实现认证注销操作,这也是问题之一。

DIGEST认证

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

  1. 请求需认证的资源时,服务器会随着状态码401 Authorization Required,返回带WWW-Authenticate首部字段的响应。该字段内包含质问响应方式认证所需的临时质询码(随机数,nonce)。首部字段WWW-Authenticate内必须包含realm和nonce这两个字段的信息。客户端就是依靠向服务器回送这两个值进行认证的。
  2. 接收到401状态码的客户端,返回的响应中包含DIGEST认证必须的首部字段Authorization信息。
    首部字段Authorization内必须包含username、realm、nonce、uri和response的字段信息。其中,realm和nonce就是之前从服务器接收到的响应中的字段。
    username是realm限定范围内可进行认证的用户名。
    uri(digest-uri)即Request-URI的值,但考虑到经代理转发后Request-URI的值可能被修改,因此事先会复制一份副本保存在uri内。
    response也可叫做Request-Digest,存放经过MD5运算后的密码字符串,形成响应码。
  3. 接收到包含首部字段Authorization请求的服务器,会确认认证信息的正确性。认证通过后则返回包含Request-URI资源的响应。

总结:客户端发送经过md5(根据服务端要求的加密方式进行加密,现在假设要求用md5)加密的[用户名:随机数:密码],并且同时附上字段如username:admin(不需要加密),nonce:xxxxx(随机数,不需要加密),服务端收到后根据username查找密码,然后进行md5加密[username:随机数:password],得到的结果与客户端发来的结果比对,对不上就肯定密码或者用户名错误。

三、Diguest认证首次向服务端发送用户和密码进行身份认证,认证通过后;在后续的通信过程中,每次由服务器提供一次性的nonce信息替换用户密码,从而防止了用户密码被监听窃取,但仍然不能防止用户拦截后被伪造。即:DIGEST认证提供防止密码被窃听的保护机制,但并不存在防止用户伪装的保护机制。

SSL客户端认证

一、从使用用户ID和密码的认证方式方面来讲,只要二者的内容正确,即可认证是本人的行为。但如果用户ID和密码被盗,就很有可能被第三者冒充。利用SSL客户端认证则可以避免该情况的发生。
二、认证步骤:

为达到SSL客户端认证的目的,需要事先将客户端证书分发给客户端,且客户端必须安装此证书。

  1. 接收到需要认证资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书。
  2. 用户选择将发送的客户端证书后,客户端会把客户端证书信息以Client Certificate报文方式发送给服务器。
  3. 服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始HTTPS加密通信。

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

基于表单认证

一、基于表单认证本身是通过服务器端的Web应用,将客户端发送过来的用户ID和密码与之前登录过的信息做匹配来进行认证的。但鉴于HTTP是无状态协议,之前已认证成功的用户状态无法通过协议层面保存下来。即,无法实现状态管理,因此即使当该用户下一次继续访问,也无法区分他与其他的用户。于是我们会使用Cookie来管理Session,以弥补HTTP协议中不存在的状态管理功能。
二、认证步骤:

  1. 客户端把用户ID和密码等登录信息放入报文的实体部分,通常是以POST方法把请求发送给服务器。而这时,会使用HTTPS通信来进行HTML表单画面的显示和用户输入数据的发送。
  2. 服务器会发放用以识别用户的Session ID。通过验证从客户端发送过来的登录信息进行身份认证,然后把用户的认证状态与Session ID绑定后记录在服务器端。

向客户端返回响应时,会在首部字段Set-Cookie内写入Session ID(如PHPSESSID=028a8c…)。

  1. 客户端接收到从服务器端发来的Session ID后,会将其作为Cookie保存在本地。下次向服务器发送请求时,浏览器会自动发送Cookie,所以Session ID也随之发送到服务器。服务器端应如何保存用户提交的密码等登录信息等也没有标准化。通常,一种安全的保存方法是,先利用给密码加盐(salt)的方式增加额外信息,再使用散列(hash)函数计算出散列值后保存。

cookie,session在公司的用户认证中基本不会使用,正常都是以用户登录后返回token形式进行身份认证,服务端会保存token信息,一般都会存在如redis等缓存中,并设置一个过期时间

salt其实就是由服务器随机生成的一个字符串,但是要保证长度足够长,并且是真正随机生成的。然后把它和密码字符串相连接(前后都可以)生成散列值。当两个用户使用了同一个密码时,由于随机生成的salt值不同,对应的散列值也将是不同的。这样一来,很大程度上减少了密码特征,攻击者也就很难利用自己手中的密码特征库进行破解。

基于http的功能追加协议

消除HTTP瓶颈的SPDY

一、以下这些HTTP标准就会成为瓶颈。

  1. 一条连接上只可发送一个请求。
  2. 请求只能从客户端开始。客户端不可以接收除响应以外的指令。
  3. 请求/响应首部未经压缩就发送。首部信息越多延迟越大。
  4. 发送冗长的首部。每次互相发送相同的首部造成的浪费较多。
  5. 可任意选择数据压缩格式。非强制压缩发送。

二、解决方法:

  1. Ajax的解决方法:Ajax的核心技术是名为XMLHttpRequest的API,通过JavaScript脚本语言的调用就能和服务器进行HTTP通信。借由这种手段,就能从已加载完毕的Web页面上发起请求,只更新局部页面。而利用Ajax实时地从服务器获取内容,有可能会导致大量请求产生。另外,Ajax仍未解决HTTP协议本身存在的问题。
  2. Comet通信:请添加图片描述
    内容上虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间,为了维持连接会消耗更多的资源。另外,Comet也仍未解决HTTP协议本身存在的问题。
  3. SPDY没有完全改写HTTP协议,而是在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。使用SPDY后,HTTP协议额外获得以下功能。
    (1)多路复用流:通过单一的TCP连接,可以无限制处理多个HTTP请求。所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高。
    (2)赋予请求优先级:SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题。
    (3)压缩HTTP首部:压缩HTTP请求和响应的首部。这样一来,通信产生的数据包数量和发送的字节数就更少了。
    (4)推送功能:支持服务器主动向客户端推送数据的功能。这样,服务器可直接发送数据,而不必等待客户端的请求。
    (5)服务器提示功能:服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求。

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

一、WebSocket,即Web浏览器与Web服务器之间全双工通信标准。一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。
二、WebSocket协议的主要特点。

  1. 推送功能:支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求。
  2. 减少通信量:只要建立起WebSocket连接,就希望一直保持连接状态。和HTTP相比,不但每次连接时的总开销减少,而且由于WebSocket的首部信息很小,通信量也相应减少了。
    为了实现WebSocket通信,在HTTP连接建立之后,需要完成一次“握手”(Handshaking)的步骤

HTTP连接的建立,又包含了TCP的三次握手。在HTTP连接建立好之后,要采用HTTP的request和response再进行一次HTTP协议层面的握手,从而升级为websocket协议。此后的数据传输,就采用web socket的协议报了。

  1. 握手·请求:为了实现WebSocket通信,需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变,以达到握手的目的。
  2. 握手·响应:对于之前的请求,返回状态码101 Switching Protocols的响应。

成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。

Web服务器管理文件的WebDAV

一、WebDAV(Web-based Distributed Authoring and Versioning,基于万维网的分布式创作和版本控制)是一个可对Web服务器上的内容直接进行文件复制、编辑等操作的分布式文件系统。除了创建、删除文件等基本功能,它还具备文件创建者管理、文件编辑过程中禁止其他用户内容覆盖的加锁功能,以及对文件内容修改的版本控制功能。
二、 使用HTTP/1.1的PUT方法和DELETE方法,就可以对Web服务器上的文件进行创建和删除操作。可是出于安全性及便捷性等考虑,一般不使用。
三、WebDAV为实现远程文件管理,向HTTP/1.1中追加了以下这些方法。

  1. PROPFIND:获取属性
  2. PROPPATCH:修改属性
  3. MKCOL:创建集合
  4. COPY:复制资源及属性
  5. MOVE:移动资源
  6. LOCK:资源加锁
  7. UNLOCK:资源解锁

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

  1. 102 Processing:可正常处理请求,但目前是处理中状态
  2. 207 Multi-Status:存在多种状态
  3. 422 Unprocessible Entity:格式正确,内容有误
  4. 423 Locked:资源已被加锁
  5. 424 Failed Dependency:处理与某请求关联的请求失败,因此不再维持依赖关系
  6. 507 Insufficient Storage:保存空间不足

锁(Lock):把文件设置成无法编辑状态。多人同时编辑时,可防止在同一时间进行内容写入。
防火墙的基本功能就是禁止非指定的协议和端口号的数据包通过

构建web内容的技术

HTML

HTML(HyperText Markup Language,超文本标记语言)是为了发送Web上的超文本(Hypertext)而开发的标记语言。超文本是一种文档系统,可将文档中任意位置的信息与其他信息(文本或图片等)建立关联,即超链接文本。标记语言是指通过在文档的某部分穿插特别的字符串标签,用来修饰文档的语言。我们把出现在HTML文档内的这种特殊字符串叫做HTML标签(Tag)

Web应用

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

之前提及的CGI,由于每次接到请求,程序都要跟着启动一次。因此一旦访问量过大,Web服务器要承担相当大的负载。而Servlet运行在与Web服务器相同的进程中,因此受到的负载较小

数据发布的格式及语言

可扩展标记语言xml

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

HTML倾向于数据的展示,XML更倾向于数据的描述和存储。至于原因,简单说就是HTML的标签被预设好了,便于浏览器去识别。XML的标签可自定义,便于人类去阅读。所以可读性上XML明显更高,但相对于H略显繁琐。利用一些手段两者也可以相互转换。

发布更新信息的RSS/Atom

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

avaScript衍生的轻量级易用JSON

JSON(JavaScript Object Notation)是一种以JavaScript(ECMAScript)的对象表示法为基础的轻量级数据标记语言。能够处理的数据类型有false/null/true/对象/数组/数字/字符串,这7种类型。

web的攻击技术

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

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

跨站攻击可以认为是一种恶意的网络资源,通常网站上会从多个地方加载资源,比如专门的图库,css或者js公共cdn等。而攻击者通过某些方法让浏览器客户端加载了恶意脚本(并执行)

跨站脚本攻击有可能造成以下影响。

  1. 利用虚假输入表单骗取用户个人信息。
  2. 利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
  3. 显示伪造的文章或图片。

二、OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。可以从Web应用中通过Shell来调用操作系统命令。倘若调用Shell时存在疏漏,就可以执行插入的非法OS命令。

OS命令注入攻击可以向Shell发送命令,让Windows或Linux操作系统的命令行启动程序。也就是说,通过OS注入攻击可执行OS上安装着的各种程序。

三、SQL注入攻击
四、HTTP首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。HTTP首部注入攻击有可能会造成以下一些影响。

  1. 设置任何Cookie信息
  2. 重定向至任意URL
  3. 显示任意的主体(HTTP响应截断攻击)

通过和会话固定攻击(攻击者可使用指定的会话ID)攻击组合,攻击者可伪装成用户。攻击者输入的%0D%0A,原本应该属于首部字段Location的查询值部分,但经过解析后,%0D%0A变成了换行符,结果插入了新的首部字段。

A登陆了,b没登录,获取a的cookie设置到b上面,b就可以冒充a的身份了

五、向首部主体内添加内容的攻击称为HTTP响应截断攻击。将两个%0D%0A%0D%0A并排插入字符串后发送。利用这两个连续的换行就可作出HTTP首部与主体分隔所需的空行了,这样就能显示伪造的主体,达到攻击目的。这样的攻击叫做HTTP响应截断攻击。利用这个攻击,已触发陷阱的用户浏览器会显示伪造的Web页面,再让用户输入自己的个人信息等,可达到和跨站脚本攻击相同的效果。另外,滥用HTTP/1.1中汇集多响应返回功能,会导致缓存服务器对任意内容进行缓存操作。这种攻击称为缓存污染。使用该缓存服务器的用户,在浏览遭受攻击的网站时,会不断地浏览被替换掉的Web网页。
六、邮件首部注入攻击:攻击者通过向邮件首部To或Subject内任意添加非法内容发起的攻击。%0D%0A在邮件报文中代表换行符。一旦咨询表单所在的Web应用接收了这个换行符,就可能实现对Bcc邮件地址的追加发送。使用两个连续的换行符就有可能篡改邮件文本内容并发送。
七、目录遍历(Directory Traversal)攻击是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。这种攻击有时也称为路径遍历(Path Traversal)攻击。

固然存在输出值转义的问题,但更应该关闭指定对任意文件名的访问权限。

查询字段为了读取攻击者盯上的/etc/passwd文件,会从/www/log/目录开始定位相对路径

因此部署web程序的时候往往会单独使用一个用户且赋予很小的权限,这样就算被攻击,也会因为没有权限打开那些隐私文件

八、远程文件包含漏洞(Remote File Inclusion)是指当部分脚本内容需要从其他文件读入时,攻击者利用指定外部服务器的URL充当依赖文件,让脚本读取之后,就可运行任意脚本的一种攻击

固然存在输出值转义的问题,但更应控制对任意文件名的指定。

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

一、强制浏览(Forced Browsing)安全漏洞是指,从安置在Web服务器的公开目录下的文件中,浏览那些原本非自愿公开的文件。
对那些原本不愿公开的文件,为了保证安全会隐蔽其URL。可一旦知道了那些URL,也就意味着可浏览URL对应的文件。直接显示容易推测的文件名或文件目录索引时,通过某些方法可能会使URL产生泄露。

即使没有对这篇日记的访问权限,只要知道这图片的URL,通过直接指定URL的方式就能显示该图片。日记的功能和文本具有访问对象的控制,但不具备对图片访问对象的控制,从而产生了安全漏洞。

二、不正确的错误消息处理(Error Handling Vulnerability)的安全漏洞是指,Web应用的错误信息内包含对攻击者有用的信息。攻击者利用进行不同的输入会提示不同的错误信息这条,就可用来确认输入的邮件地址是否已在这个Web网站上注册过了。为了不让错误消息给攻击者以启发,建议将提示消息的内容仅保留到“认证错误”这种程度即可。

攻击者从这条消息中可读出数据库选用的是MySQL,甚至还看见了SQL语句的片段。这可能给攻击者进行SQL注入攻击以启发。

各系统应对详细的错误消息进行抑制设定,或使用自定义错误消息,以避免某些错误信息给攻击者以启发。

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

可信度高的Web网站如果开放重定向功能,则很有可能被攻击者选中并用来作为钓鱼攻击的跳板。

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

一、会话劫持(Session Hijack)是指攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。攻击者在得知该Web网站存在可跨站攻击(XSS)的安全漏洞后,就设置好用JavaScript脚本调用document.cookie以窃取Cookie信息的陷阱,一旦用户踏入陷阱(访问了该脚本),攻击者就能获取含有会话ID的Cookie。攻击者拿到用户的会话ID后,往自己的浏览器的Cookie中设置该会话ID,即可伪装成会话ID遭窃的用户,访问Web网站了。

将cookie设置成httponly为true,或对cookie重要信息加密,签名等手段都是解决cookie信息安全管理或泄露。

二、会话固定攻击(Session Fixation)攻击会强制用户使用攻击者指定的会话ID。步骤:

  1. 攻击者准备陷阱,先访问Web网站拿到会话ID(SID=f5d1278e8109)。此刻,会话ID在服务器上的记录仍是(未认证)状态。(步骤①~②)
  2. 攻击者设置好强制用户使用该会话ID的陷阱,并等待用户拿着这个会话ID前去认证。一旦用户触发陷阱并完成认证,会话ID(SID=f5d1278e8109)在服务器上的状态(用户A已认证)就会被记录下来。(步骤③)
  3. 攻击者估计用户差不多已触发陷阱后,再利用之前这个会话ID访问网站。由于该会话ID目前已是(用户A已认证)状态,于是攻击者作为用户A的身份顺利登录网站。(步骤④)

Session Adoption是指PHP或ASP.NET能够接收处理未知会话ID的功能。
攻击者可私自创建会话ID构成陷阱,中间件却会误以为该会话ID是未知会话ID而接受。

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

  1. 在该留言板系统上,受害者用户A是已认证状态。它的浏览器中的Cookie持有已认证的会话ID(步骤①)。
  2. 攻击者设置好一旦用户访问,即会发送在留言板上发表非主观行为产生的评论的请求的陷阱。用户A的浏览器执行完陷阱中的请求后,留言板上也就会留下那条评论(步骤②)。

Django 里面有CSRF防护机制,即在HTTP响应的 cookie里面,会添加一个 csrftoken字段,其值是一个自动生成的token。在客户端的所有POST表单中,必须包含一个 csrfmiddlewaretoken 字段。在处理POST之前,Django 会验证这个请求的 cooike 里面的 csrftoken 字段和提交的表单里面的字段值是否一样。如果一样,说明是合法请求,如果不一样就可能是 csrf攻击。

其他安全漏洞

一、密码破解有以下两种手段:通过网络的密码试错、对已加密密码的破解(指攻击者入侵系统,已获得加密或散列处理的密码数据的情况)。主要有以下两种方式:穷举法、字典攻击

  1. 穷举法(Brute-force Attack,又称暴力破解法)是指对所有密钥集合构成的密钥空间(Keyspace)进行穷举。即,用所有可行的候选密码对目标的密码系统试错,用以突破验证的一种攻击。
  2. 字典攻击是指利用事先收集好的候选密码(经过各种组合方式后存入字典),枚举字典中的密码,尝试通过认证的一种攻击手法。

利用别处泄露的ID·密码进行攻击:字典攻击中有一种利用其他Web网站已泄露的ID及密码列表进行的攻击。很多用户习惯随意地在多个Web网站使用同一套ID及密码,因此攻击会有相当高的成功几率

二、从加密过的数据中导出明文通常有以下几种方法:通过穷举法、字典攻击进行类推、彩虹表、拿到密钥、加密算法的漏洞

  1. 通过穷举法·字典攻击进行类推:尝试调用相同的散列函数加密候选密码,然后把计算出的散列值与目标散列值匹配,类推出密码。
  2. 彩虹表(Rainbow Table)是由明文密码及与之对应的散列值构成的一张数据库表,是一种通过事先制作庞大的彩虹表

从彩虹表内搜索散列值就可以推导出对应的明文密码。

  1. 使用共享密钥加密方式对密码数据进行加密处理的情况下,如果能通过某种手段拿到加密使用的密钥,也就可以对密码数据解密了。

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

iframe引入,透明遮罩层覆盖

四、DoS攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫做服务停止攻击或拒绝服务攻击。主要有以下两种DoS攻击方式。

  1. 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态。
  2. 通过攻击安全漏洞使服务停止。

其中,集中利用访问请求的DoS攻击,单纯来讲就是发送大量的合法请求。

理解dos就要从syn泛洪攻击来说,简单地讲,前文提到的tcp三次握手,客户端不断给服务器发送syn,然后服务端响应syn和ack,此时第三步客户端不再给予回应,导致大量地一直处于确认握手状态链接,服务器端最终会因为拥挤而崩溃。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值