HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议
HTTP( Hypertext Transfer Protocol)超文本传输协议
HTTPS和HTTP的区别:
1. https协议需要到CA申请证书,一般免费证书很少,需要交费。
2. https 采用具有安全性的ssl加密传输协议,是需要身份认证的网络协议;http是超文本传输协议,信息是明文传输。
3. https实际上应用了Netscape的安全全套接字层(SSL)作为http应用层的子层,使用端口443;http使用端口80来和TCP/IP进行通信。
HTTPS解决的问题:
1 . 信任主机的问题.
采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书。 该证书只有用于对应的server 的时候,客户度才信任次主机。
2 . 通讯过程中的数据的泄密和被窜改
1. 一般意义上的https, 就是 server 有一个证书。
a) 主要目的是保证server 就是它声称的server,这个跟第1点一样。
b) 服务端和客户端之间的所有通讯都是加密的。
i. 具体讲:客户端产生一个对称的密钥,通过server 的证书来交换密钥, 一般意义上的握手过程。
ii. 加下来所有的信息往来就都是加密的, 第三方即使截获也没有任何意义。因为他没有密钥.,当然窜改也就没有什么意义了。
2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书。
a) 这里客户端证书其实就类似表示个人信息的时候,除了用户名/密码,还有一个CA 认证过的身份。 因为个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份。
b) 目前少数个人银行的专业版是这种做法,,具体证书可能是拿U盘作为一个备份的载体。。
HTTPS 一定是繁琐的.
a) 本来简单的http协议,一个get一个response。由于https 要还密钥和确认加密算法的需要,单握手就需要6/7 个往返。
i. 任何应用中过多的round trip 肯定影响性能。
b) 接下来才是具体的http协议,每一次响应或者请求,, 都要求客户端和服务端对会话的内容做加密/解密。
i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片。 如果CPU 信能比较低的话,肯定会降低性能,从而不能serve 更多的请求。
ii. 加密后数据量的影响, 所以才会出现那么多的安全认证提示。
https四次通信
、
客户端发出请求(ClientHello)
服务器回应(SeverHello)
客户端回应
服务器的最后回应
整个过程涉及的信息有:协议,随机数(用来生成对话密钥),加密算法,证书等信息。
头部 | 优势和特点 | 劣势和问题 |
---|---|---|
Expires | 1、HTTP 1.0 产物,可以在HTTP 1.0和1.1中使用,简单易用。2、以时刻标识失效时间。 | 1、时间是由服务器发送的(UTC),如果服务器时间和客户端时间存在不一致,可能会出现问题。2、存在版本问题,到期之前的修改客户端是不可知的。 |
Cache-Control | 1、HTTP 1.1 产物,以时间间隔标识失效时间,解决了Expires服务器和客户端相对时间的问题。2、比Expires多了很多选项设置。 | 1、HTTP 1.1 才有的内容,不适用于HTTP 1.0 。2、存在版本问题,到期之前的修改客户端是不可知的。 |
Last-Modified | 1、不存在版本问题,每次请求都会去服务器进行校验。服务器对比最后修改时间如果相同则返回304,不同返回200以及资源内容。 | 1、只要资源修改,无论内容是否发生实质性的变化,都会将该资源返回客户端。例如周期性重写,这种情况下该资源包含的数据实际上一样的。2、以时刻作为标识,无法识别一秒内进行多次修改的情况。3、某些服务器不能精确的得到文件的最后修改时间。 |
ETag | 1、可以更加精确的判断资源是否被修改,可以识别一秒内多次修改的情况。2、不存在版本问题,每次请求都回去服务器进行校验。 | 1、计算ETag值需要性能损耗。2、分布式服务器存储的情况下,计算ETag的算法如果不一样,会导致浏览器从一台服务器上获得页面内容后到另外一台服务器上进行验证时发现ETag不匹配的情况。 |
http报文中与缓存相关的首部字段
我们先来瞅一眼RFC2616规定的47种http报文首部字段中与缓存相关的字段,事先了解一下能让咱在心里有个底:
1. 通用首部字段(就是请求报文和响应报文都能用上的字段)
2. 请求首部字段
3. 响应首部字段
4. 实体首部字段
浏览器第一次请求时:
浏览器后续在进行请求时:
强缓存与协商缓存的区别,可以用下表来进行描述:
获取资源形式 | 状态码 | 发送请求到服务器 | |
强缓存(expires,cache-control) | 从缓存取 | 200(from cache) | 否,直接从缓存取 |
协商缓存(Etag/If-None-Match,Last-Modified/If-Modified-Since) | 从缓存取 | 304(not modified) | 是,正如其名,通过服务器来告知缓存是否可用 |
参考链接:
https://www.cnblogs.com/wonyun/p/5524617.html
https://segmentfault.com/a/1190000006689795