转载和积累系列 - HTTPS原理和HTTP缓存机制
目录
HTTPS原理
HTTPS
HTTPS 的实现原理
为什么数据传输是用对称加密?
为什么需要 CA 认证机构颁发证书?
HTTP缓存机制和原理
HTTP报文
缓存规则解析
强制缓存
Expires
Cache-Control
对比缓存
Last-Modified / If-Modified-Since
Etag / If-None-Match(优先级高于Last-Modified / If-Modified-Since)
原理总结
之前转载的HTTP相关文章《转载和积累系列 - 深入理解HTTP协议》
HTTPS原理
HTTPS
随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议。大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关的概念有 SSL 、非对称加密、 CA证书等,但对于以下灵魂三拷问可能就答不上了:
1.为什么用了 HTTPS 就是安全的?2.HTTPS 的底层原理如何实现?3.用了 HTTPS 就一定安全吗?
本文将层层深入,从原理上把 HTTPS 的安全性讲透。
HTTPS 的实现原理
大家可能都听说过 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但其实,HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。
HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:
① 证书验证阶段
浏览器发起 HTTPS 请求
服务端返回 HTTPS 证书
客户端验证证书是否合法,如果不合法则提示告警
② 数据传输阶段
- 当证书验证合法后,在本地生成随机数
- 通过公钥加密随机数,并把加密后的随机数传输到服务端
- 服务端通过私钥对随机数进行解密
- 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输
为什么数据传输是用对称加密?
首先,非对称加密的加解密效率是非常低的,而 http 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的;
另外,在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。
为什么需要 CA 认证机构颁发证书?
HTTP 协议被认为不安全是因为传输过程容易被监听者勾线监听、伪造服务器,而 HTTPS 协议主要解决的便是网络传输的安全性问题。
首先我们假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的“中间人攻击”问题。
“中间人攻击”的具体过程如下:
过程原理:
1.本地请求被劫持(如DNS劫持等),所有请求均发送到中间人的服务器 2.中间人服务器返回中间人自己的证书 3.客户端创建随机数,通过中间人证书的公钥对随机数加密后传送给中间人,然后凭随机数构造对称加密对传输内容进行加密传输 4.中间人因为拥有客户端的随机数,可以通过对称加密算法进行内容解密 5.中间人以客户端的请求内容再向正规网站发起请求 6.因为中间人与服务器的通信过程是合法的,正规网站通过建立的安全通道返回加密后的数据 7.中间人凭借与正规网站建立的对称加密算法对内容进行解密 8.中间人通过与客户端建立的对称加密算法对正规内容返回的数据进行加密传输 9.客户端通过与中间人建立的对称加密算法对返回结果数据进行解密
由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。
HTTP缓存机制和原理
HTTP报文
HTTP报文就是浏览器和服务器间通信时发送及响应的数据块。
浏览器向服务器请求数据,发送请求(request)报文;服务器向浏览器返回数据,返回响应(response)报文。
报文信息主要分为两部分
包含属性的首部(header):附加信息(cookie,缓存信息等)与缓存相关的规则信息,均包含在header中
包含数据的主体部分(body):HTTP请求真正想要传输的部分
缓存规则解析
为方便大家理解,我们认为浏览器存在一个缓存数据库,用于存储缓存信息。
在客户端第一次请求数据时,此时缓存数据库中没有对应的缓存数据,需要请求服务器,服务器返回后,将数据存储至缓存数据库中。
HTTP缓存有多种规则,根据是否需要重新向服务器发起请求来分类,我将其分为两大类(强制缓存,对比缓存)
在详细介绍这两种规则之前,先通过时序图的方式,让大家对这两种规则有个简单了解。
已存在缓存数据时,仅基于强制缓存,请求数据的流程如下
已存在缓存数据时,仅基于对比缓存,请求数据的流程如下
对缓存机制不太了解的同学可能会问,基于对比缓存的流程下,不管是否使用缓存,都需要向服务器发送请求,那么还用缓存干什么?
这个问题,我们暂且放下,后文在详细介绍每种缓存规则的时候,会带给大家答案。
我们可以看到两类缓存规则的不同,强制缓存如果生效,不需要再和服务器发生交互,而对比缓存不管是否生效,都需要与服务端发生交互。
两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。
强制缓存
从上文我们得知,强制缓存,在缓存数据未失效的情况下,可以直接使用缓存数据,那么浏览器是如何判断缓存数据是否失效呢?
我们知道,在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应header中。
对于强制缓存来说,响应header中会有两个字段来标明失效规则(Expires/Cache-Control)
使用chrome的开发者工具,可以很明显的看到对于强制缓存生效时,网络请求的情况
Expires
Expires的值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据。
不过Expires 是HTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。
另一个问题是,到期时间是由服务端生成的,但是客户端时间可能跟服务端时间有误差,这就会导致缓存命中的误差。
所以HTTP 1.1 的版本,使用Cache-Control替代。
Cache-Control
Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发(对于前端开发来说,缓存越多越好,so…基本上和它说886)
举个板栗
图中Cache-Control仅指定了max-age,所以默认为private,缓存时间为31536000秒(365天)
也就是说,在365天内再次请求这条数据,都会直接获取缓存数据库中的数据,直接使用。
对比缓存
对比缓存,顾名思义,需要进行比较判断是否可以使用缓存。
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。
再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。
第一次访问:
再次访问:
通过两图的对比,我们可以很清楚的发现,在对比缓存生效时,状态码为304,并且报文大小和请求时间大大减少。
原因是,服务端在进行标识比较后,只返回header部分,通过状态码通知客户端使用缓存,不再需要将报文主体部分返回给客户端。
对于对比缓存来说,缓存标识的传递是我们着重需要理解的,它在请求header和响应header间进行传递,一共分为两种标识传递,接下来,我们分开介绍。
Last-Modified / If-Modified-Since
Last-Modified:
服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since:
再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间。
服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。
若资源的最后修改时间大于If-Modified-Since,说明资源又被改动过,则响应整片资源内容,返回状态码200;若资源的最后修改时间小于或等于If-Modified-Since,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。
Etag / If-None-Match(优先级高于Last-Modified / If-Modified-Since)
Etag:
服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。
If-None-Match:
再次请求服务器时,通过此字段通知服务器客户段缓存数据的唯一标识。
服务器收到请求后发现有头If-None-Match 则与被请求资源的唯一标识进行比对,不同,说明资源又被改动过,则响应整片资源内容,返回状态码200;相同,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。
原理总结
转载和积累系列 - HTTPS原理和HTTP缓存机制相关推荐
- HTTPS原理和CA证书申请
转载自:HTTPS原理和CA证书申请(满满的干货) 众所周知,WEB服务存在http和https两种通信方式,http默认采用80作为通讯端口,对于传输采用不加密的方式,https默认采用443,对于 ...
- 转载与积累系列 - Docker 核心技术与实现原理
目录 Namespaces 进程 网络 Libnetwork 挂载点 Chroot CGroups UnionFS 存储驱动 AUFS 其他存储驱动 总结 提到虚拟化技术,我们首先想到的一定是 Doc ...
- 转载和积累系列 - Linux tcpdump命令详解
简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...
- HTTPS 工作原理和 TCP 握手机制
1.HTTPS的工作原理 HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息.TLS/SSL协议不仅仅是一套加密传输的协议,更是 ...
- 转载和积累系列 - L4负载均衡的设计与实现
目录 简介 一.LVS的局限性 1. 数据包转发性能问题 2. HA-主备结构的浪费 3. 转发模式的优缺点 二.google maglev负载均衡 Maglev Consistent Hash Go ...
- 转载和积累系列 - 基于JavaScript的DDoS攻击
基于JavaScript的DDoS攻击 DDoS,即Distributed Denial of Service,中文译为分布式拒绝服务攻击,是一种常见的网络攻击方式.它的基本思想就是像一台服务器发送大 ...
- HTTPS原理和CA证书申请(满满的干货)
读到这篇博客,对https的原理介绍的比较详细且生动,为了防止丢失,mark一下,以下是原文链接 https://blog.51cto.com/11883699/2160032 众所周知,WEB服务存 ...
- 转载和积累系列 - linux 生成KEY的方法与使用
服务器A: 192.168.1.1 服务器B: 192.168.1.2 服务器A: 配置: ssh-keygen -b 2048 -t rsa #这里的-b 2048 是密钥加密的长度,最好设大点,有 ...
- 转载和积累系列 - 为什么 HashMap 加载因子是0.75?而不是0.8,0.6?
目录 为什么HashMap需要加载因子? 解决冲突有什么方法? 1. 开放定址法 2. 再哈希法 3. 建立一个公共溢出区 4. 链地址法(拉链法) 为什么HashMap加载因子一定是0.75?而不是 ...
最新文章
- Error in exists(x): 第一个参数不对
- 【Hibernate】dao层 +getHibernateTemplate()方法解析
- 6、HTML有序列表+无序列表+定义列表
- 简述微型计算机的工作原理,高教自学考试微机原理及应用模拟试题
- ObjectFactory对象工厂类
- 操纵浏览器历史记录 : popstate() 、 history.pushState() 、 window.history.pushState()
- Hadoop学习笔记—10.Shuffle过程那点事儿
- 下载 嵌入式qt实战教程pdf_Qt之JSON教程-实战篇
- linux下哪些软件能跑pin,Linux下4款常见远程工具比较
- C51单片机——指令系统
- LeetCode50. Pow(x, n)(二进制位运算)
- Chrome快捷键大全
- 一纬度横直线等于多公里_【高中物理】必修一知识点总结
- 用于PDF文件转曲,方法介绍
- 华为荣耀计算机在哪,华为荣耀手机如何连接电脑
- 页面监听-iframe子父页面信息传递与监听
- 宁向东认为的沟通分类
- bch纠错码 码长8_密码学BCH纠错编码算法
- flex 两列多行布局
- tosmana使用教程_20款最流行的免费定性数据分析工具