文章目录
与HTTP协作的web服务器
用单台虚拟主机实现多个域名
- 虚拟主机:允许一台服务器
HTTP
服务器搭建多个web
站点。 - 在相同
IP
地址下,在发送HTTP
请求时,必须在host
首部内完整指定URI
。
通信数据转发程序:代理、网关、隧道
这些应用程序可以将请求转发给通信线路上的下一站服务器,并且能接受从那台服务器发送的响应再转发给客户端。
代理
- 有转发功能的应用程序,位于服务端和客户端之间。
- 代理不改变
URI
,会将接受到的请求发送给前方持有资源的目标服务器。 via
首部字段标记经过的主机信息。
- 代理包括缓存代理和透明代理。
- 缓存代理:代理转发响应时,会预先将资源的副本缓存到代理服务器上,当再次接收到相同资源的请求时,将之前缓存的资源作为响应返回。
- 透明代理:不对报文做任何加工的代理类型;反正,对报文进行加工的代理称为非透明代理。
- 使用代理服务器的理由:利用缓存技术减少网络带宽的流量、组织内部针对特定网站的访问控制,以获取访问日志为主要目的。
网关
- 为通信线路上的服务器提供非
HTTP
协议服务。 - 利用网关能提高通信的安全性,在客户端与网关之间的通信线路上加密。
隧道
- 要求建立起一条与其他服务器的通信线路,并使用
SSL
等加密手段进行通信。 - 隧道的目的是确保客户端与服务端进行安全通信。
- 隧道不会解析
HTTP
请求,则原样中转,会在通信双方断开连接时结束。
保存资源的缓存
类似于上方的缓存代理,缓存服务器是代理服务器的一种。
缓存服务器可以避免多次从服务器转发资源。
缓存的有效期限
- 若源服务器资源更新,则缓存服务器会项源服务器确认资源的有效性。若判断缓存失效,则缓存服务器会再次从源服务器上获取新资源。
客户端的缓存
- 缓存不仅在缓存服务器中,也可以在客户端浏览器中。
- 客户端缓存称为临时网络文件。缓存有效,则直接从本次磁盘读取。
- 在有效期限上与缓存服务器性质相同。
HTTP首部
HTTP报文首部
HTTP首部字段
HTTP首部字段传递重要信息
- 首部字段给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容
HTTP首部字段结构
首部字段名:字段值
例如
content-type:text/html
- 单个字段名可对应多个字段值
- 若字段重复,不同浏览器处理放肆不同。
HTTP首部字段类型
- 通用首部字段
请求报文和响应报文均会使用的首部字段
2. 请求首部字段
- 响应首部字段
- 实体首部字段
请求报文和响应报文均使用的首部字段。
HTTP通用首部字段
Cache-Control
Cache-Control:private,max-age=0,no-cache
指令参数多选,且用逗号分隔。
Cache-Control:public
Cache-Control:private
Cache-Control:no cache //防止返回过期的资源
Cache-Control:no-store //暗示请求或响应中包含机密信息
Cache-Control:max-age=64088
Cache-Control:s-maxage=604800
与max-age
指令相同,区别在于s-maxage
只适用于供多用户使用的公共缓存服务器。
当使用这个指令时则直接忽略max-age
指令的处理。
Cache-Control:min-fresh=60 //过了60秒的资源无法作为响应返回
指令要求缓存服务器返回至少还未过指定时间的缓存资源。
Connection
Connection:close
HTTP默认连接为持久连接,该指令表示服务端想明确断开连接。
Connection:不再转发的首部字段名
表示可控制不在转发给代理的首部字段
Data
表明创建HTTP报文的日期和时间
Pragma
发送时同时含有下面两个首部字段
Cache-Control:no-cache
Pragma:no-cache
Trailer
事先说明在报文主体后记录了那些首部字段,可应用在分块传输编码。
Transfer-Encoding
规定传输报文主体时采用的编码方式,仅对分块传输编码有效。
Upgrade
用于检测HTTP
协议及其他协议是否可使用更高的版本进行通信。
via
- 使用
var
是为了追踪客户端与服务器之间的请求和响应报文的传输路径 - 每经过一层代理附加该首部字段信息。
Warning
HTTP警告码
请求首部字段
Authorization
Expect
Expect:100-continue //等待状态码100响应
If-xxx
附带条件的请求。服务器收到附带条件的请求,只有判断指定条件为真时,才会执行请求。
If-Match
If-Modified-Since
If-Range
Max-Forwards
与TRACE
方法类似
Referer
告知服务器请求的原始资源的URI
,知道请求的URI
从哪个web
页面发起,即当前访问URL
的上一个URL
。
User-Agent
将创建请求的浏览器和用户代理名称等信息传达给服务器。
Host
被请求资源的主机和端口号
Host:www.xxxx.com:801
cookie
表示请求者身份
X-Forworded-For
代表请求端的IP,可多个使用逗号隔开。
响应首部字段
Accept-Ranges
Accept-Ranges:bytes
Accept-Ranges:none
ETag
强ETag
不论多么细微的变化都会改变其值,但弱ETag
只用于提示资源是否相同。
Vary
WWW.Authenticate
用于HTTP
访问认证,告知客户端适用于访问请求URI
所指定资源的认证方案。
server
实体首部字段
用于补充内容的更新时间等与实体相关的信息。
Content-Encoding
告知服务器端对实体的主体部分选用的内容编码方式
主要内容编码方式有以下四种
gzip
compress
deflate
identify
Content-MD5
Content-Range
Content-Range:bytes 5001-10000
为cookie服务的首部字段
cookie
指某些网站为了辨别用户身份,进行session
跟踪而存储在用户本地终端上的数据,而这些数据通常会进行加密处理
Set-Cookie
cookie
可通过用新的cookie
来覆盖过期的cookie
,即可实现对客户端cookie
的实质性删除操作。path
属性安全机制效果较差- 不指定
domain
属性更安全 HttpOnly
属性可以避免xss
利用javascript
劫持cookie
其他首部字段
X-Frame-Options
属于HTTP
响应首部,用于控制网站内容在其他web
网站的Frame
标签内的显示问题,主要目的是防止点击劫持的攻击。
X-Frame-Options:DENY //拒绝
X-Frame-Options:SAMEORIGIN
X-XSS-Protection
- 属于
HTTP
响应首部,针对xss
的一种对策,用于控制浏览器xss
防护机制的开关 - 需要服务器对
DNT
作对应的支持
X-XSS-Protection:0 //xss过滤设置为无效状态
X-XSS-Protection:1 //xss过滤设置为有效状态
DNT
属于HTTP
请求首部,do not track
DNT:0 同意被追踪
DNT:1 拒绝被追踪
P3P(在线隐私偏好平台)
- 属于
HTTP
响应首部 - 可以让个人隐私变为一种仅供程序可理解的形式,以达到保护用户的隐私
确保web安全的HTTPS
HTTP的缺点
通信使用明文(不加密),可能会被窃听
HTTP
本身不具有加密的功能,无法对请求和响应的内容进行加密。- 为防止窃听,加密对象有通信的加密和内容的加密。
- 通信的加密:
HTTP
协议与SSL
或TLS
组合使用,用SSL
建立安全通信线路后,其中与SSL
组合使用的HTTP
被称为HTTPS
或者HTTP over SSL
。 - 内容的加密:对
HTTP
协议传输的内容本身加密,即把HTTP
报文进行进行先加密再发送。 - 内容加密的前提是要求客户端和服务器同时具备加密和解密机制。
不验证对方的身份就可能遭遇伪装
HTTP
协议不会确认通信方,不管是谁发过来的请求都会返回响应。- 无法阻止
DoS
攻击,无法确认正在通信的对方是否具备访问权限等等。 SSL
不仅提供加密处理,还提供一种证书的手段,来确认通信方。- 证书由值得信赖的第三方机构颁发。
无法证明报文完整性,可能被纂改。
- 所谓完整性即信息的准确度。
- 接受的内容可能有误,无法判断。像这样,请求或响应在传输途中遭攻击者拦截并纂改内容的攻击称为中间人攻击。
- 常用
MD5
和SHA-1
等散列值校验以及确认文件的数字签名方法来防止纂改内容。
HTTP+加密+认证+完整性保护=HTTPS
HTTPS
访问HTTPS
通信有效的web网站时,浏览器的地址栏内会出现一个带锁的标记,对HTTPS
的显示方式会因浏览器的不同而有所改变。
HTTPS是身披SSL外壳的HTTP
HTTPS
并非是应用层的一种新协议,只是HTTP
通信接口部分用SSL
和TLS
协议来代替。- 其他应用层上的协议均可配合
SSL
协议来使用。 SSL
是当今世界上最为广泛的网络安全技术。
相互交换密钥的公开密钥加密技术
SSL
采用公开密钥加密的加密处理方式。近代加密方法中加密算法是公开的,而密钥却是保密的。加密和解密均会用到密钥,即只要持有密钥就能解密。- 加密和解密同用一个密钥的方式称为共享密钥加密,也叫对称密钥加密。
- 密钥发送问题:公开密钥加密。即使一组非对称密钥,一把私有密钥,一把公开密钥。发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,使用自己的私有密钥进行解密。
HTTPS
采用共享密钥加密和公开密钥加密两者并用的混合加密机制。在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段使用共享密钥加密方式。- 公开密钥加密的处理速度比共享密钥加密较慢。
证明公开密钥正确性的证书
- 为了证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥,可以使用有数字证书认证机构和其相关机关颁发的公开密钥证书。
- 数字认证机构颁发公钥证书的流程:
EV SSL
证书可证明通信一方的服务器其是否规范,也可确认对方服务器背后运营的企业是否真实存在。- 拥有
EV SSL
证书的web
网站的浏览器地址栏出的背景色是绿色,而且在地址栏的右侧显示了SSL
证书中记录的组织名称以及颁发证书的认证机构的名称。 EV SSL
证书可防止用户被钓鱼攻击。HTTP
中还使用客户端证书,来证明服务器正在通信的对方是预料之内的客户端,作用跟服务器证书相同,但客户端证书只能证明客户端存在,不能证明用户本人的有效性。- 独立构建的认证机构——自认证机构颁发的自签名证书是无用的,当浏览器访问该服务器时,会显示无法确认连接安全性或该网站的安全证书存在问题。
- 大多数浏览器会预先植入备受信赖的认证机构的证书,但有的浏览器会植入中级认证机构的证书,有的浏览器当作正规证书,有的浏览器当作自签名证书。
HTTP的安全通信机制
HTTP的通信步骤
- 客户端发送
Client Hello
报文开始进行SSL
通信。报文中包含客户端支持的SSL
的指定版本、加密组件列表(所使用的加密算法以及密钥长度)。 - 服务端可进行
SSL
通信时,会以Server Hello
报文作为应答。报文中包含的内容与客户端的的类别相同。服务器的加密组件内容时从接收到的客户端加密组件内筛选出来的。 - 服务器发送
Certificate
报文,报文中包含公开密钥证书。 - 服务器发送
Server Hello Done
报文通知客户端,最初阶段的SSL握手协商部分结束。 SSL
第一次握手结束后,客户端以Client Key Exchange
报文作为回应。报文中包含通信加密中使用的一种Pre-master secret
的随机密码串,该报文已被步骤3中的公开密钥加密,- 接着客户端发送
Change Cipher Spec
报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret
密钥加密。 - 客户端发送
Finished
报文。该报文包含连接至今全部报文的整体校验值。这次握手协商能否成功以服务器能否正确解密该报文作为判定标准。 - 服务器发送同样
Change Cipher Spec
报文。 - 服务器同样发送
Finished
报文。 - 服务器和客户端
Finished
报文交换完毕之后,SSL
连接就算建立完成,通信也会受到SSL
的保护,从此开始进行应用层协议的通信,即发送HTTP
响应。 - 应用层协议通信,即发送
HTTP
响应。 - 最后有客户端端来连接,断开连接时,发送
close_notify
报文 - 最后发送
TCN FIN
报文来管不与TCP
的通信 (这步上图中作了省略)
- 第十一步中应用层发送数据时会附加一种叫做
MAC
的报文摘要,MAC
能查知报文是否遭到纂改,从而保护报文的完整性。
SSL和TLS
HTTPS
使用SSL
和TLS
这两个协议。
- 为什么不一直使用
HTTPS
通信?
因为与纯文本通信相比,加密不严谨速度慢,而且消耗资源较多,能够处理的请求数量较少,且还需要向认证机构狗奶证书。因此,如果是非敏感信息使用HTTP
通信。而HTTPS
加密只是对一部分敏感信息加密来节约资源。