第一章、了解Web及网络基础
HTTP:HyperText Transfer Protocol,超文本传输协议。
HTML:HyperText Markup Language,超文本标记语言。
URL:Uniform Resource Locator,统一资源定位符。
把与互联网相关联的协议集合起来总称为TCP/IP。也有说法认为TCP/IP是指TCP和IP这两种协议。还有一种说法认为TCP/IP是在IP协议的通信过程中,使用到的协议族的统称。
TCP/IP协议族里最重要的一点就是分层。分别分为:应用层,传输层,网络层和数据链路层。
分层的好处:当有需要变动时,只需要改变某一层,不需要整体都改变。
应用层: 应用层决定了向用户提供应用服务时通信的活动。有FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统)和HTTP协议。
传输层: 传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。有TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
网络层: 网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传送给对方。
链路层: 用来处理连接网络的硬件部分。
TCP/IP通信传输流
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。
发送端在曾与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在曾与曾传输数据时,每经过一层时会把对应的首部去掉。
负责传输的IP协议:
IP(Internet Protocol)网际协议位于网络层。TCP/IP协议族中的IP指的就是网际协议。IP与IP地址不一样,IP是一种协议的名称。
IP协议的作用就是把各种数据包传送给对方。而确保传送到对方那里,则需要满足各类条件,其中最重要的就是IP地址和MAC地址。
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可以变换,但MAC地址基本不会更改。
IP间的通信依赖于MAC地址。通常通信都需要进行多次中转才能发送到目标计算机上,在进行中转时,会采用ARP协议(Address Resolution Protocol)。ARP是地址解析协议,根据通信方的IP地址就可以反查出对应的MAC地址。
确保可靠性的TCP协议:
TCP位于传输层,提供可靠的字节流服务。字节流服务就是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。为了确保准确无误的将数据送到目标处,TCP协议采用了三次握手策略。握手过程中使用了TCP的标志(flag)——SYN和ACK
负责域名解析的DNS服务:
DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。DNS服务可以通过域名查找IP地址,或逆向从IP地址反查找域名的服务。
各种协议与HTTP协议的关系:
URL格式:
绝对URL格式:
可选项:登录信息,查询字符串,片段标识符
第二章、简单的HTTP协议
请求报文的构成:
请求报文是由请求方法,请求URL,协议版本,可选的请求首部字段和内容实体构成的。
下面是一段请求报文:
响应报文的构成:
响应报文基本上由协议版本,状态码(表示请求成功或失败的数字代码),用于解释状态码的原因短语,可选的响应首部字段以及实体主体构成。
HTTP是不保存状态的协议:
HTTP是一种不保护状态,即无状态协议。是为了更快地处理大量事务,确保协议的可伸缩性。但是有些网站为了保存用户的信息,这时我们就需要使用Cookie。
告知服务器意图的HTTP方法
GET:获取资源
GET方法用来请求访问已被URL识别的资源
POST:传输实体主体
POST方法用来传输实体的主体。GET也可以但一般不用。POST和GET很相似,但POST的主要目的并不是获取响应的主体内容。
PUT:传输文件
PUT方法用来传输文件 。但鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全问题,因此不推荐使用。
HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URL的有效性及资源更新日期等。
DELETE:删除文件
DELETE方法用来删除文件,与PUT一样,不需要身份验证,故不推荐使用。
OPTIONS:询问支持的方法
OPTIONS方法用来查询针对请求URL指定资源支持的方法。
RTRACE:追踪路径
TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。不常用。
CONNECT:要求用隧道协议连接代理
CONNECT发放要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后通过网络隧道传输。
使用格式:
持久连接节省通信量:
在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接,增加了通信量的开销。因此HTTP/1.1提出了持久连接(HTTP Persistent Connections,也称为HTTP keep-alive)的方法。该方法的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
管线化:
从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应就可以直接发送下一个请求。
与之前相比,持久化连接可以让请求更快结束,而管线化技术则比持久化连接还快。
使用Cookie的状态管理:
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务端发现客户端发送过来的Cookie后,回去检查究竟从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
第三章、HTTP报文内的HTTP信息
HTTP报文结构:
HTTP报文大致可分为报文首部和报文主体两块。二者之间以空行划分。通常,并一定要有报文主体。
请求报文和响应报文的结构:
请求报文和响应报文的首部内容有以下 数据组成。
请求行:包含用于请求的方法,请求URL和HTTP版本。
状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
首部字段:包含表示请求和响应的各种条件和属性的各类首部。
其他:可能包含HTTP的RFC里未定义的首部(Cookie等)。
报文主体和实体主体的差异:
报文(Message):是HTTP通信中的基本单位,由8位字节流组成,通过HTTP通信传输。
实体(entity):作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
HTTP报文的主体用于传输请求或响应的实体主体。
通常报文主体等于实体主体。
获取部分内容的范围请求:
假如下载到一半,突然中断,下次下载的时候我们可以继续接着上次下载开始。要实现该功能需要我们指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求(Range Request)。
执行范围请求时,会用到首部字段Range来指定资源的byte范围。
byte范围的指定形式如下:
针对范围请求,响应会返回状态码为206 Partial Content的响应报文。
若服务端无法响应范围请求,则会返回状态码200 OK 和完整的实体内容。
内容协商返回最合适的内容:
当浏览器的默认语言为中文或英文时,访问相同URL的Web页面时,则会显示对应的英文版或中文版的Web页面。这样的机制称为内容协商(Content Negotiation)。
内容协商有以下三种类型:
- 服务器驱动协商:有服务端进行内容协商。
- 客户端驱动协商:由客户端进行内容协商的方式。用户可以从浏览器显示的可选项列表中手动选择。
- 透明协商:是服务器驱动与客户端驱动的结合体,是由客户端和服务器端各自进行内容协商的一种方法。
第四章、返回结果的HTTP状态码
状态码告知从服务器端返回的请求结果:
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
200 OK
表示从客户端发来的请求在服务器端被正常处理了。
在响应报文内,随状态码一起返回的信息会因为方法的不同而发生改变。
204 Not Content
表示服务器端接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。比如当浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不会更新。
206 Partial Content:
表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
301 Moved Permanently
永久性重定向。该状态码表示请求的资源已被分配了新的URL,以后应使用资源现在所指的URL。
302 Found
临时性重定向。该状态码表示请求的资源已被分配了新的URL,希望用户(本次)能够使用新的URL访问。
303 See Other
该状态码表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。
303状态码和302 Found 状态码有着相同的功能,但303状态码明确表示客户端应使用GET方法获取资源。
304 Not Modified
307 Temporary Redirect
临时重定向。与302有着相同的含义。
400 Bad Request
该状态码表示请求报文中存在语法错误。
401 Unauthorized
该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。另外如果之前已经进行过一次请求,则表示用户认证失败。
403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。但不会给出拒绝的详细理由。
404 Not Found
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
500 Internal Server Error
该状态表示服务器端在执行请求时发生了错误。也有可能是Web应用存在bug或某些临时的故障。
503 Service Unavailable
该状态码表明服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。
第五章、与HTTP协作的Web服务器
5.1、通信数据转发程序:代理,网关,隧道
代理:
代理是一种有转发功能的应用程序,它扮演了位于服务器与客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
在HTTP通信过程中,可级联多台代理服务器。请求和响应的转发会经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加Via首部字段以标记出经过的主机信息。
使用代理服务器的理由有:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
代理的方法按两种基准分类。一种是是否使用缓存,另外一种是是否会修改报文。
-
缓存代理:
代理转发响应时,缓存代理会预先将资源的副本(缓存)保存在代理服务器上。
当代理再次接到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。 -
透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。
网关:
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,他就像自己拥有资源的服务器一样对请求进行处理。
网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非HTTP协议服务。
利用网关可以提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。
隧道:
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
隧道本身不会去解析HTTP请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
5.2、保存资源的缓存
缓存服务器是代理服务器的一种,并归类在缓存代理类型中。当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。
5.3、缓存的有效期限
即便缓存服务器内有缓存,也不能保证每次都会返回对同资源的请求。
5.4、客户端的缓存
缓存不仅存在于缓存服务器内,还可以存在于客户端浏览器中。其缓存也具有时效性。
第六章、HTTP首部
6.1、HTTP请求报文:
6.2、HTTP响应报文:
6.3、HTTP首部字段传递重要信息
无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。
6.4、HTTP首部字段结构:
HTTP首部字段是由首部字段名和字段值构成的,中间用冒号“:”分割。
格式:首部字段名:字段值
例如,在HTTP首部中以Content-Type 这个字段来表示报文主体的对象类型
Content-Type: text/html
首部字段名为Content-Type ,字符串text/html是字段值,(字段值也可以有多个)
6.5、4种HTTP首部字段类型
通用首部字段:请求报文和响应报文两方都会使用的首部。
请求首部字段:从客户端向服务器端发送请求报文时使用的首部。
响应首部字段:从服务器端向客户端返回响应报文时使用的首部。
实体首部字段:针对请求报文和响应报文的实体部分使用的首部。
HTTP/1.1规范定义了如下47种首部字段:
6.6、End-to-end首部和Hop-by-hop首部
HTTP/1.1中的逐跳首部字段:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
6.7、HTTP/1.1通用首部字段
Cache-Control:
通过指定首部字段Cache-Control的指令,就能操作缓存的的工作机制。
指令的参数是可选的,多个指令之间通过“,”分割。
Cache-Control指令按请求和响应分类如下所示:
使用no-cache指令的目的是为了防止从缓存中返回过期的资源。
Connection:
Connection首部字段具备如下两个作用:
- 控制不再转发给代理的首部字段
Connection: 不再转发的首部字段名
- 管理持久连接
Connection:close
HTTP/1.1版本的默认连接是持久连接。当服务器想断开连接时,则指定Connection首部字段值为Close。
Date:
首部字段Date表明创建HTTP报文的日期和时间。
格式如下:
Pragma:
Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容定义。
规范定义的形式唯一,如下所示。
Pragma: no-cache
Trailer:
首部字段Trailer会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在HTTP/1.1版本分块传输编码时。
Transfer-Encoding:
首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。
HTTP/1.1的传输编码方式仅对分块传输编码有效。
Upgrade:
首部字段Upgrade用于检测HTTP协议以及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
使用首部字段Upgrade时,还需要额外指定Connection:Upgrade
Via:
使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发。
首部字段Via不仅用于追踪报文的转发,还可避免请求回环的发生。
Warning
该首部通常会告知一些与缓存相关的问题的警告。
格式:
6.8、请求首部字段
请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。
Accept:
Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。
若想要给显示的媒体类型增加优先级,则使用q= 来额外表示权重值,用分号隔开。权重值q的范围是0~1。
Accept-Charset:
用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。也可用q=来表示权重。
Accept-Encoding:
用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
也可采用q值来表示相对优先级,另外,也可以使用星号(*)作为通配符,指定任意的编码格式。
Accept-Language:
用来告知服务器用户代理能够处理的自然语言集(指中文或英文),以及自然语言及的相对优先级。
Authorization:
用来告知服务器,用户代理的认证信息(证书值)。
Expect:
客户端使用首部字段Expect来告知服务器,期望出现的某种特定行为。因为服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417 Expectation Failed。
From:
首部字段From用来告知服务器使用用户代理的用户的电子邮件地址。其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。
Host:
告知服务器,请求的资源所处的互联网主机名和端口号。
if-Matvh:
形如If-xxx这种样式的请求首部字段,都可以称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
If-Modified-Since:
属于附带条件之一,它会告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。
If-None-Match:
与If-Match作用相反。用于指定If-None-Match字段值的实体标记(ETag)值与请求资源的ETag不一致时,它就告知服务器处理该请求。
If-Range:
告知服务器若指定的If-Range字段值和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。
If-Unmodified-Since:
和If-Modified-Since的作用相反。它的作用是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。反之,以状态码412 Precondition failed
作为响应返回。
Max-Forwards:
通过TRACE方法或OPTIONS方法,发送包含首部字段Max-Forwards的请求时,该字段以十进制整数形式指定可经过的服务器的最大数目。
Proxy-Authorization:
接收到代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需的信息。
Range:
告知服务器资源的指定范围。
接收到带有Range请求的服务器,会在处理请求之后返回状态码为206 Partial Content的响应。无法处理该范围请求时,则会返回状态码200 OK 的响应及全部资源。
Referer:
Referer会告知服务器请求的原始资源的URL。
TE:
User-Agent:
User-Agent用于传达浏览器的种类。
6.9、响应首部字段
Accept-Range:
用于告知客户端服务器是否能处理范围请求,已制定获取服务器端某个部分的资源。
可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定为none。
Age:
告知客户端,源服务器在多久前创建了响应。单位为秒。
ETag:
告知客户端实体标识。它是一种可以将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值。
强ETag值:无论实体发生多么细微的变化都会改变其值。
弱ETag值:只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变ETag值。这是会在字段值最开始处附加W/。
Location:
可以将响应接收方引导至某个与请求URL位置不同的资源。
Proxy-Authenticate:
把由代理服务器所要求的认证信息发送给客户端。
Retry-After:
告知客户端应该在多久之后再次发送请求。主要配合状态码503 Service Unavailable响应,或3xx Redirect响应一起使用。
Server:
首部字段Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
Vary:
首部字段Vary可对缓存进行控制。源服务器会对代理服务器传达关于本地缓存使用方法的命令。
WWW-Authenticate:
首部字段WWW-Authenticate用于HTTP访问认证。他会告知客户端适用于访问请求URL所指定资源的认证方案(Basic或是Digest)和带参数提示的质询(challenge)。
6.10、实体首部字段
Allow:
用于通知客户端能够支持Request-URL指定资源的所有HTTP方法。当首部接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为响应返回。还会把所有能支持的HTTP方法写入首部字段Allow后返回。
Content-Encoding:
告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。
主要采用以下四种内容编码的方式:gzip,compress,deflate,identity。
Content-Language:
告知客户端,实体主体使用的自然语言。
Content-Length:
表明了实体主体部分的大小(单位是字节)
Content-Location:
给出与报文主体部分相对应的URL。和Location不同,Content-Location表示的是报文主体返回资源对应的URL。
Content-MD5:
是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,已确认传输到达。
Content-Range:
针对范围请求,返回响应时使用的首部字段Conten-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。
Content-Type:
说明了实体主体内对象的媒体类型。和Accept一样,字段值用type/subtype形式赋值。
Expires:
会将资源失效的日期告知客户端。
Last-Modified:
指明资源最终修改的时间。
6.11、为Cookie服务的首部字段
Set-Cookie:
expires属性:
Cookie的expires属性指定浏览器可发送Cookie的有效期。
当省略expires属性时,其有效期仅限于维持浏览器会话(Session)时间段内。
另外,一旦Cookie从服务器端发送至客户端,服务器端就不存在可以显式删除Cookie的方法。但可以通过覆盖已过期的Cookie,实现对客户端Cookie的实质性删除操作。
path属性:
Cookie的path属性可用于限制指定Cookie的发送范围的文件目录。
domain属性:
通过Cookie的domain属性指定的域名可做到与结尾匹配一致。
secure属性:
Cookie的secure属性用于限制Web页面仅在HTTPS安全连接时,才可以发送Cookie。
HttpOnly属性:
Cookie的HttpOnly属性是Cookie的扩展功能,它使JavaScript脚本无法获得Cookie。其主要目的为防止跨站脚本攻击(Cross-site scripting,XSS)对Cookie的信息窃取。
Cookie:
第七章、确保Web安全的HTTPS
7.1、HTTP的缺点
HTTP的缺点如下:
由于通信使用的是明文,所以可能会被窃听。因此我们需要进行加密操作。
通信的加密:
通过和SSL(Secure Socket layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用,加密HTTP的通信内容。
与SSL组合使用的HTTP被称为HTTPS(HTTP Secure,超文本传输安全协议)。
内容的加密:
对HTTP协议传输的内容本身加密,加密后再发送请求。
为了做到有效的内容加密,前提是要求客户端和服务器同时具备加密和解密机制。由于该方式不同于SSL或TLS将整个通信线路加密处理,所以内容仍有被篡改的风险。
不验证通信方的身份就可能遭遇伪装
HTTP协议中的请求和响应不会对通信方进行确认,会存在以下隐患。
虽然使用HTTP协议无法确定通信方,但如果使用SSL则可以,可以通过查询证书来确定通信双方。
无法证明报文完整性,可能已遭篡改:
完整性是指信息的准确度。若无法证明其完整性,通常也就意味着无法判断信息是否准确。其内容可能会被中间人进行篡改,为了防止这些弊端,有必要使用HTTPS。
7.2、HTTP+加密+认证+完整性保护=HTTPS
HTTP加上加密处理和认证以及完整性保护后即是HTTPS
当浏览器的地址栏出现带锁的标记,就证明使用的是HTTPS。
HTTPS采用的是共享密钥加密和公开密钥加密两者并用的混合加密机制。
公开密钥加密方式还是存在一些问题,那就是无法验证密钥的真实性,为此可使用数字证书(CA)。
可证明组织真实性的EV SSL证书:
可证明通信一方的服务器是否规范,还可确认对方服务器背后运营的企业是否真实存在。
拥有EV SSL证书的网站的浏览器地址栏背景是绿色的。
使用OpenSSL这套开源程序,每个人都可以构建一套属于自己的认证机构,从而自己给自己颁发服务器证书。这种叫做自签名证书,基本没有什么用处。浏览器在访问该服务器时,会显示“无法确认连接安全性”或“该网站的安全证书存在问题”等警告信息。
7.3、HTTPS的安全通信机制
HTTPS的通信步骤:
在以上流程中,应用层发送数据时会附加一种叫MAC(Message Authentication Code)的报文摘要。MAC能够差值报文是否遭到篡改,从而保护报文的完整性。
7.4、SSL的缺点
使用SSL时,处理速度会变慢。
SSL的慢分为两种,一种是指通信慢。另一种是指由于大量消耗CPU以及内存等资源,导致处理器速度变慢。
而且,SSL必须进行加密处理,在服务器和客户端之间都需要进行加密和解密的运算处理,会消耗更多的硬件资源,导致负荷增强。买证书也得花钱。
针对速度慢,只能采用SSL加速器这种硬件来解决问题。因此只要不是特别重要的网页,一般都是用HTTP,只有当涉及到一些个人隐私安全问题时,才使用HTTPS。
第八章、确认访问用户身份的认证
当某些网站只想让特定的人浏览,为了实现这个目标,就需要认证功能。
8.1、HTTP使用的认证方式
HTTP/1.1使用的认证方式如下所示。
- BASIC认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase认证(基于表单认证)
8.2、BASIC认证
是Web服务器与通信客户端之间进行的认证方式。
BASIC认证的认证步骤:
BASIC认证虽然采用Base64编码方式,但这不是加密处理。若在HTTP等非加密通信的线路上进行BASIC认证的过程中,如果被人窃听,被盗的可能性极高。
而且,若想在进行一次BASIC认证时,一般的浏览器却无法实现认证注销操作。
8.3、DIGEST认证
DIGEST认证使用质询/响应的方式,但不会像BASIC认证那样直接发送明文密码。
所谓质询响应方式是指,一开始一方会先发送认证要求给另一方,接着使用从另一方那接收到的质询码计算生成响应码。最后将响应码返回给对方进行认证的方式。
DIGEST认证的步骤:
8.4、SSL客户端认证
认证步骤:
为了达到SSL客户端认证的目的,需要事先将客户端证书分发给客户端,且客户端必须安装此证书。
步骤一:接收到需要认证资源的请求,服务器会发送Certificate Request 报文,要求客户端提供客户端证书。
步骤二:用户选择将发送的客户端证书后,客户端会把客户端证书信息以Client Certificate报文方式发送给服务器。
步骤三:服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始HTTPS加密通信。
SSL客户端认证采用双因素认证:
在多数情况下,SSL客户端认证不会仅依靠证书完成认证,一般会和基于表单认证组合形成一种双因素认证来使用。
SSL所需要的证书每年也是一笔不小的花销。
8.5、基于表单认证
基于表单的认证方法并不是在HTTP协议中定义的。 客户端会向服务器上的Web应用程序发送登录信息,按登录信息的验证结果认证。
认证多半为基于表单认证。
Session管理以及Cookie应用:
基于表单认证本身是通过服务器端的Web应用,将客户端发送过来的用户ID和密码与之前登录过的信息做匹配来进行认证。
但是HTTP是无状态协议,之前已认证成功的用户状态无法保留。于是,使用Cookie来管理Session。
第九章、基于HTTP的功能追加协议
9.1、HTTP的瓶颈
9.2、消除HTTP瓶颈的SPDY
SPDY的设计与功能:
SPDY以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立通信连接。
使用SPDY后,HTTP协议额外获得以下功能。
多路复用流:
通过单一的TCP连接,可以无限制处理多个HTTP请求。所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高。
赋予请求优先级:
SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。可以解决因宽带低而导致响应变慢的问题。
压缩HTTP首部:
压缩HTTP请求和响应的首部。这样一来,通信产生的数据包数量和发送的字节数就更少了。
推送功能:
支持服务器主动向客户端推送数据的功能。
服务器提示功能:
服务器可以 主动提示客户端请求所需的资源。
9.3、使用浏览器进行全双工通信的WebSocket
WebSocket协议的主要特点:
推送功能:
支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求。
减少通信量:
只要建立起WebSocket连接,就希望一直保持连接状态。
为了实现WebSocket通信,在HTTP连接建立之后,需要完成一次“握手”的步骤。
握手 请求:
为了实现WebSocket通信,需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变,以达到握手的目的。
握手 响应:
对于之前的请求,返回状态码101 Switching Protocols的响应。
HTTP/2.0的7项技术及讨论:
第十一章、Web的攻击技术
11.1、针对Web的攻击技术
针对Web应用的攻击模式:
- 主动攻击
- 被动攻击
以服务器为目标的主动攻击:
主动攻击(active attack)是指攻击者通过直接访问Web应用,把攻击代码传入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源。
主动攻击模式里具有代表性的攻击是SQL注入攻击和OS命令注入攻击。
以服务器为目标的被动攻击:
被动攻击(passive attack)是指利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对目标Web应用访问发起攻击。
被动攻击通常的攻击模式如下所示:
11.2、跨站脚本攻击
跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript 进行的一种攻击。动态创建的HTML部分有可能隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击。
11.3、SQL注入攻击
会执行非法SQL的SQL注入攻击:
SQL注入是指针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。
SQL注入攻击有可能会造成以下影响:
- 非法查看或篡改数据库内的数据
- 规避认证
- 执行和数据库服务器业务关联的程序等
11.4、OS命令注入攻击
OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。
11.5、HTTP首部注入攻击
HTTP首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。属于被动攻击模式。
可能会造成以下影响:
- 设置任何Cookie信息
- 重定向至任意URL
- 显示任意的主体(HTTP响应截断攻击)