HTTP/1.0:每次请求/响应都需
要建⽴⼀次TCP链接
HTTP/1.1:TCP可以持久连接。
⼀次TCP连接就有⼀次RTT,这
样可以减少多个RTT(往返消息)
⾸部压缩
特性⽬标:很显然,压缩重复的
⾸部传输流量
如何压缩
前置条件
头部信息中,完全匹配字典的键
值对,可以直接⽤字典的key,
即⼀个字符表示
只匹配到键的头部信息,可以使
⽤⼀个字符 + 哈夫曼编码后的内
容 表示
浏览器端可以告知服务器端往动
态字典中添加头部信息
对于不存在静态、动态字典中的
头部信息,可以使⽤哈夫曼编码
压缩体积
⼆进制分帧
在⾼层 HTTP API 与低层 TCP
之间引⼊⼆进制分帧层。⼀个请
求报⽂会被切割成多个帧。常⻅
的帧有HEADERS帧,DATA帧
多个概念
过程
概念包含关系
多路复用
特性⽬标:在⼀个TCP连接可以
并发多个请求/响应
概念
服务器推送
特性⽬标:服务器端拥有主动推
送资源的能⼒
特性注意点
推送过程
优先级与依赖性
特性⽬标:让对等端⾯向并发流
时,如何分配资源。例如:⻚⾯
对js css与图⽚资源并发请求,
肯定需要先为js css资源分配更
多资源,让重要的资源更快完成
响应。
概念
如何设置优先级
优先级只是建议,并不会强制对
等端遵守
优先级树
多路复⽤
资源不必打包。甚⾄由于请求/响
应是并发的,根据⽊桶效应,影
响当前双向数据流的瓶颈在于并
发过程中体积最⼤的包。因此应
该把⼤块的资源细分为多个粒度
更⼩的包
场景
服务器端推送
由于减少了请求的时间,因此速
度更快。⽽且还可以在某个请求
内做主动推送的逻辑
不必内联资源,主动推送即可
优先级与依赖性
服务时通信的活动。常⻅协议
有,HTTP | FTP | DNS
缓存系统是 CDN 的“心脏”,使用 HTTP 缓存代理技术,缓存命中就返回给用户,否则就要回源。
命中
回源
机密性(Secrecy/Confidentiality)是指对数据的“保密”,只能由可信的人访问,对其他人是不可见的“秘密”,简单来说就是不能让不相关的人看到不该看的东西。
实现机密性最常用的手段是“加密”(encrypt),就是把消息用某种方式转换成谁也看不懂的乱码,只有掌握特殊“钥匙”的人才能再转换出原始文本。
对称加密
加密算法
加密分组模式(对称算法还有一个“分组模式”的概念,它可以让算法用固定长度的密钥加密任意长度的明文,把小秘密(即密钥)转化为大秘密(即密文)。)
把上面这些组合起来,就可以得到 TLS 密码套件中定义的对称加密算法。比如,AES128-GCM,意思是密钥长度为 128 位的 AES 算法,使用的分组模式是 GCM;ChaCha20-Poly1305 的意思是 ChaCha20 算法,使用的分组模式是 Poly1305
非对称加密
起因:对称加密看上去好像完美地实现了机密性,但其中有一个很大的问题:如何把密钥安全地传递给对方,术语叫“密钥交换”。
概念:它有两个密钥,一个叫“公钥”(public key),一个叫“私钥”(private key)。两个密钥是不同的,“不对称”,公钥可以公开给任何人使用,而私钥必须严格保密。公钥和私钥有个特别的“单向”性,虽然都可以用来加密解密,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密。
非对称加密算法
DH
DSA
RSA
ECC
混合加密
起因:虽然非对称加密没有“密钥交换”的问题,但因为它们都是基于复杂的数学难题,运算速度很慢,即使是 ECC 也要比 AES 差上好几个数量级。如果仅用非对称加密,虽然保证了安全,但通信速度有如乌龟、蜗牛,实用性就变成了零。
操作:这就是现在 TLS 里使用的混合加密方式,其实说穿了也很简单
完整性(Integrity,也叫一致性)是指数据在传输过程中没有被篡改,不多也不少,“完完整整”地保持着原状。
实现完整性的手段主要是摘要算法(Digest Algorithm),也就是常说的散列函数、哈希函数(Hash Function)。你可以把摘要算法近似地理解成一种特殊的压缩算法,它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。换一个角度,也可以把摘要算法理解成特殊的“单向”加密算法,它只有算法,没有密钥,加密后的数据无法解密,不能从摘要逆推出原文。
特点
摘要算法
如何实现完整性
身份认证(Authentication)是指确认对方的真实身份,也就是“证明你真的是你”,保证消息只能发送给可信的人。
数字签名
数字证书和 CA
第四个特性是不可否认(Non-repudiation/Undeniable),也叫不可抵赖,意思是不能否认已经发生过的行为,不能“说话不算数”“耍赖皮”。
在 HTTP 协议里,建立连接后,浏览器会立即发送请求报文。但现在是 HTTPS 协议,它需要再用另外一个“握手”过程,在 TCP 上建立安全连接,之后才是收发 HTTP 报文。
TLS 协议的组成
TLS1.2握手
Client Hello
Server Hello
Client 验证证书,生成secret
Server 生成 secret
注意事项
RSA 握手过程
TLS1.3
TLS1.3 的三个主要改进目标
最大化兼容性
强化安全
提升性能
TLS1.3握手过程
Client Hello
Server Hello
中间⼈攻击:中间⼈也可以产
⽣⼀对⾮对称密钥,然后代替假
装服务器发布公钥给客户端
避免中间⼈攻击,证明公钥是
服务器的公钥 => 使⽤证书
摘要算法——具有单向性和雪崩性,单向性强调只能加密不能解码,雪崩性强调明文稍微变化一丁点那摘要就会产生巨大的变化。摘要算法怎么使用,把明文和摘要一起发送过去就可以验证明文是否被篡改了。但是防止不了明文修改后把摘要也篡改的情况,所以,后面有了数字签名,数字签名保证完整性
数字签名——私钥加密+摘要算法,用私钥加密摘要然后用公钥验证,就可以实现身份认证以及不可否认的特性。
CA——也即证书认证机制防止黑客伪造公钥,如果用的是黑客伪造的公钥,那自然黑客就能用其私有加密摘要伪造某宝的身份了。所以,公钥只能有可信度比较高的三方来发布,防止黑客伪造
同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。不同域之间相互请求资源,就算作“跨域”
同源策略限制内容有
图像ping
jsonp
请求报文里的起始行也就是请求行(request line),它简要地描述了客户端想要如何操作服务器端的资源。
看完了请求行,我们再看响应报文里的起始行,在这里它不叫“响应行”,而是叫“状态行”status line,意思是服务器响应的状态。
通用字段:在请求头和响应头里都可以出现;
Cache-Control 能够控制缓存的行为
Connection
控制不再转发给代理的首部字段
管理持久连接
Date 表明创建 HTTP 报文的日期和时间
Upgrade
请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件;
Host 会告知服务器,请求的资源所处的互联网主机名和端口号。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段
Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级
文本文件:text/html, text/plain, text/css …
application/xhtml+xml, application/xml …
图片文件:image/jpeg, image/gif, image/png …
视频文件:video/mpeg, video/quicktime …
应用程序使用的二进制文件:application/octet-stream, application/zip …
Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段 Accept 相同的是可用权重 q 值来表示相对优先级。
Accept-Encoding 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
- gzip:由文件压缩程序 gzip(GNU zip)生成的编码格式(RFC1952),采用 Lempel-Ziv 算法(LZ77)及 32 位循环冗余校验(Cyclic Redundancy Check,通称 CRC)。
- compress:由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel-Ziv-Welch 算法(LZW)。
- deflate:组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式。
- identity:不执行压缩或不会变化的默认编码格式
Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。
Authorization 是用来告知服务器,用户代理的认证信息(证书值)。通常,想要通过服务器认证的用户代理会在接收到返回的 401 状态码响应后,把首部字段 Authorization 加入请求中。共用缓存在接收到含有 Authorization 首部字段的请求时的操作处理会略有差异。
附带条件请求(形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。)
首部字段 Referer 会告知服务器请求的原始资源的 URI。
响应字段:仅能出现在响应头里,补充说明响应报文的信息;
实体字段:它实际上属于通用字段,但专门描述 body 的额外信息。
Content-Type 说明了实体主体内对象的媒体类型。和首部字段 Accept 一样,字段值用 type/subtype 形式赋值
Allow:用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。与此同时,还会把所有能支持的 HTTP 方法写入首部字段 Allow 后返回。
Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩
Content-Language 会告知客户端,实体主体使用的自然语言(指中文或英文等语言)
Content-Length 表明了实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用 Content-Length 首部字段
Content-Length 表明了实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用 Content-Length 首部字段
Expires 会将资源失效的日期告知客户端。(到了HTTP/1.1,Expire已经被Cache-Control替代)
Last-Modified 指明资源最终修改的时间。一般来说,这个值就是 Request-URI 指定资源被修改的时间。
Set-Cookie:当服务器准备开始管理客户端的状态时,会事先告知各种信息
1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
2××:成功,报文已经收到并被正确处理;
3××:重定向,资源位置发生变动,需要客户端重新发送请求;
301 Moved Permanently”俗称“永久重定向”,含义是此次请求的资源已经不存在了,需要改用改用新的 URI 再次访问。
“302 Found”,曾经的描述短语是“Moved Temporarily”,俗称“临时重定向”,意思是请求的资源还在,但需要暂时用另一个 URI 来访问。
“304 Not Modified” 是一个比较有意思的状态码,它用于 If-Modified-Since 等条件请求,表示资源未修改,用于缓存控制。它不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件”(即“缓存重定向”)。
4××:客户端错误,请求报文有误,服务器无法处理;
5××:服务器错误,服务器在处理请求时内部发生了错误。
概念:针对CORS(跨域)请求,浏览器将其分成两个类型:简单请求和复杂请求,一般触发预检的请求则称为"复杂请求"。
简单请求
复杂请求
options 关键的首部字段
request header 的关键字段
Access-Control-Request-Method:POST 告知服务器,实际请求将使用 POST 方法
Access-Control-Request-Headers:告知服务器,实际请求将携带的自定义请求首部字段
response header 的关键字段
Options 预请求优化
类型
安全与幂等
安全(在 HTTP 协议里,所谓的“安全”是指请求方法不会“破坏”服务器上的资源,即不会对服务器上的资源造成实质的修改。)
所谓的“幂等”实际上是一个数学用语,被借用到了 HTTP 协议里,意思是多次执行相同的操作,结果也都是相同的,即多次“幂”后结果“相等”。
优点
缺点
明文
无状态
HTTP 队头阻塞
DNS解析 => 得出ip地址
HTTP:⽣成请求报⽂
TCP:将请求报⽂切割为多个报
⽂段,确保报⽂段准确送到对⽅
⼿上。使⽤三次握⼿确保连接可
靠
ip地址:节点被分配的地址
ip
概念
过程:搜索对⽅的地⽅,⼀边中
转 ⼀边传送
TCP:重组报⽂
HTTP:对请求进⾏处理
基于 UDP 协议做的查询
而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手
明显基于TCP协议的DNS更浪费网络资源!
- 数据一致性层面:DNS数据包不是那种大数据包,所以使用UDP不需要考虑分包,如果丢包那么就是全部丢包,如果收到了数据,那就是收到了全部数据!所以只需要考虑丢包的情况,那就算是丢包了,重新请求一次就好了。而且DNS的报文允许填入序号字段,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答是对应的哪个请求
- DNS通常是基于UDP的,但当数据长度大于512字节的时候,为了保证传输质量,就会使用基于TCP的实现方式
浏览器DNS缓存
操作系统缓存
Hosts文件
非权威域名服务器
根域名服务器
顶级域名服务器
权威域名服务器
使用 DNS 可以实现基于域名的负载均衡,既可以在内网,也可以在外网。
“域名屏蔽”
“域名劫持”
IP 协议提供可靠的、字节流形式的通信
的字节流服务
Sequence number:保证传输的
报⽂是有序的,对端可按照序号
拼接报⽂
Acknowledgement Number:表
现数据接收端对下⼀个字节序号
的期望,也表示上⼀个字节已经
收到
Window Size:表示还能接受多
少字节的数据,⽤于流量控制
标识符
第⼀次握⼿:客户端发送⼀个
SYN=1且具备初始序号seq=x的
TCP包,表示想要连接服务器端
接⼝。发送完毕后客户端进⼊
SYN_SEND状态
第⼆次握⼿:服务器端发送⼀个
SYN=1、ACK=1、序号(seq)为服
务器⾃⼰的ISN序列号、且确认
序号(ACKnum)为客户端序号加
⼀(x+1)的TCP包,表示确认应
答。发送完毕后,服务器端进⼊
SYN_ RECEIVED状态
第三次握⼿:客户端发送⼀个
ACK=1、确认序号(ACKnum)为
服务器ISN序号加⼀(y+1)的TCP
包,表示确认连接的应答。发送
完毕后客户端进⼊
ESTABLISHED状态,服务器端
接收到包后也会进⼊
ESTABLISHED状态。TCP握⼿
结束
为什么 TCP 建立连接需要三次握手,明明两次就可以建立起连接?
注意❗️确认序号
第⼀次挥⼿(FIN=1, seq=x):客
户端发送⼀个FIN=1且序号为⾃
⼰ISN序列号的包,表示⾃⼰已
经没有数据要传输了,但仍可以
接收数据
第⼆次挥⼿(ACK=1,
ACKnum=x+1):服务器端发送
⼀个ACK=1且确认序号为客户端
序号+1的包,表示收到客户端关
闭连接的请求,但还没有准备好
关闭,并进⼊CLOSE_WAIT状态
第三次挥⼿(FIN=1, seq=y):服
务器端发送FIN=1且序号为⾃⼰
序列号的包,表示准备好关闭连
接,向客户端确认关闭连接的请
求,并进⼊LAST-ACK 状态
第四次挥⼿(ACK=1,
ACKnum=y+1)
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
序号x为客户端 y是服务端 这样记忆
作出应答才算一次握手或者挥手
类型
反射型
在一个反射型 XSS 攻击过程中,恶意 JavaScript 脚本属于用户发送给网站请求中的一部分(通常是url连接带了攻击脚本参数发送给服务端),随后网站又把恶意 JavaScript 脚本返回给用户(页面会进行渲染)。当恶意 JavaScript 脚本在用户页面中被执行时,黑客就可以利用该脚本做一些恶意操作。
并不是存储在服务端,注意这种反射型攻击是需要特定的链接支持的
存储型
⽤户输⼊数据会被存储到服务器
端,此时攻击者可以传⼊恶意脚
本,上传⾄服务器
场景
DOM型
过程
本质:恶意代码注⼊到浏览器中
运⾏。即攻击者提交代码,浏览
器执⾏代码两⼤步骤。
应对策略
输⼊过滤(应对提交代码⼀
步):由于内容⽤处存在不确定
性。只有在注⼊html时,转义的
地⽅才会正常显示。如果当⼀个
字符串做计算、渲染,或者说内
容不只是给前端⽤的情况会,就
会引发乱码等等问题。因此并不
可靠
应对浏览器执⾏代码
CSP网页安全政策
本质:CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载(请求)和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置
启用CSP
通过 HTTP 头信息的Content-Security-Policy的字段
通过网页的标签
上报策略
httpOnly:避免恶意代码获取
toke
输⼊⻓度限制
验证码
概念
防御措施
CSRF的两个特点
思路
阻⽌不明外域的访问
检查发起请求的origin与referer
是否在⽩名单内
利用Cookie的SameSite属性
请求添加上只能在本域才能获得
的凭证
CSRF token
我的理解:黑客不能利用XHR发起请求 而是利用img src或者表单提交发起请求,但是这些带来的一个就是不能设置请求头,所以我们可以通过设置CSRF TOKEN 请求头来防止攻击
验证码
转账前输⼊密码