HTTP和HTTPS
目录
HTTP
请求行
方法
get和post的区别:
URL
查询语句:
版本号
请求报头
3:Content-Type:
4:User-Agent(UA):
6:Cookie:
HTTP格式简略图为:
HTTP的响应
响应行
常见的状态码以及状态状态码的描述
重定向
HTTPS
加密
对称加密
非对称加密
对称加密和非对称加密结合
引入中间人攻击
引入CA证书
引入HTTPS的工作流程
小结HTTPS
HTTP
HTTP协议是基于应用层的网络传输协议中文名为超文本传输协议,应用层协议解释的是应用层传输的数据要干啥。由于HTTP协议是应用层协议更依赖于下层的TCP或UDP协议。 高版本的HTTP会基于UDP,HTTP的应用场景主要有web开发网页前后端的通信,移动端的APP和其他服务器之间的通信……
客户端与服务器之间的交互模型有很多比如:
多问一答:多个独立请求一条响应
一问多答:单次请求多条响应,比如下载一个大文件将这个文件分成一块一块持续发放
多问多答:多个请求多个响应,请求和响应之间数量对等但没有必然的顺序关系
一问一答:一个请求一个响应一一对应,是HTTP协议的基础
HTTP请求的技基础格式主要是四大部分
请求行,请求报头,空行,请求正文
请求行
请求行有三部分组成:Method,url,version
每个部分之间用空格区分
方法
主要的方法有get 、post、 put、 delete ……
get的用途是获取资源,post是传输实体主体或者说请求体和响应体,put也是传输文件,delete是删除文件,方法之间有规范但可以混用比如post可以查询更新删除
get和post是最常见的方法, get请求中大多数没有正文,数据一般在url中
post请求中一般有正文,数据一般在正文中,在登录或者说上传文件(比如更新头像的场景时容易出现)
get和post的区别:
语义不同get一般用于获取数据post一般是提交数据
get请求一般是幂等的post不是,所以get可以被缓存而post不行(幂等指的是多次请求得到的响应结果一样)
get请求的正文一般为空数据是是在查询语句中, post的查询语句一般为空数据在正文中
URL
请求首行的第二部分URL中文名叫做唯一资源定位符,它不是HTTP中特有的很多协议都有
POSThttps://leetcode.cn/graphql/HTTP/1.1
GEThttps://passport.baidu.com/passApi/js/wrapper.js?cdnversion=1784190973616&_=1784190973332HTTP/1.1
POSThttps://nav-edge.smartscreen.microsoft.com/api/browser/edge/navigate/3HTTP/1.1
加粗的部分就是首行当中的Url,格式一般为
http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1
http 协议类型
:// 分隔协议与地址(现在的URL中一般没有用户和密码协议后面就紧跟着地址)
user 用户名
: 分隔用户名和密码
pass 密码
@ 分隔认证信息(用户和密码)和主机地址
www.example.jp 域名
: 分隔域名和端口号
80 端口号
/ 分隔主机和带层次的资源路径
index.htm 资源路径
? 分隔资源路径和查询语句
uid=1 查询语句
# 分隔查询语句和锚点
ch1 锚点
查询语句:
由键值对组成以=连接(键=值),键值对可以有多个,彼此之间用&连接,由于由于由于查询语句的键和值是自定义的,但像“/”“?”“=”等字符已经被URL当作特殊意义理解,所以这些字符不能在查询语句中随意出现需要对这些特殊字符进行转义,汉字也需要转义。将待转义的字符转成16进制,每两个16进制为一组每组前加上一个%(%xy)例如李转义为%E6%9D%8E
版本号
当前协议的版本类型
请求报头
Host: miao.baidu.com
Connection: keep-alive
Content-Length: 2139
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36 Edg/150.0.0.0
sec-ch-ua: "Not;A=Brand";v="8", "Chromium";v="150", "Microsoft Edge";v="150"
Content-Type: text/plain;charset=UTF-8
sec-ch-ua-mobile: ?0
Accept: */*
Origin: https://image.baidu.com
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://image.baidu.com/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: BAIDUID=1234567896824AC0977CC218FB359726F:FG=1;……
报头中有几个关键的字段:字段之间换行区分
1:Host:表示服务器主机的地址和端口(可能被省略)
2:Content-Length:表示正文中的数据长度
3:Content-Type:
正文中的数据类型
Content-Type: text/plain;charset=UTF-8
格式为:类型/子类型
multipart/form-data
application/json
text/html
image/png
……
4:User-Agent(UA):
表示浏览器,操作系统的属性,可以被人为地篡改服务器不能通过UA判断客户端的真实信息
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36Edg/150.0.0.0
Mozilla/5.0 --> 兼容老旧网页
Windows NT 10.0; Win64; x64 --> 操作系统信息
AppleWebKit/537.36 (KHTML, like Gecko) --> 浏览器内核
Edg/150.0.0.0 --> 本次访问的浏览器(在UA末尾出现)
Chrome/150.0.0.0 Safari/537.36 --> Edge浏览器是基于Chrome的内核上开发的,所以会保留Chrome的版本号,Safari/537.36是一个兼容标记
比如:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/150.0.0.0 Safari/537.36
本次访问的浏览器是谷歌
Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/150.0.0.0Mobile Safari/537.36
本次访问的是移动端的谷歌
5:Referer(referrer):当前请求是从哪个界面跳转过来的
6:Cookie:
cookie(请求报头中)由服务器通过set cookie(响应报头中)下发保存在浏览器本地,后续浏览器发起请求时自动会把cookie当中的信息发送给服务器,储存的数据有时效。 cookie当中储存的是键值对,键和值=隔开对与对之间;隔开。这像是小区的门禁卡,户主第一次进入小区需要登记注册信息,这份信息物业的服务器会储存一份还有一份以门禁卡的形式分发给户主,下次回家时刷门禁卡就可以开门不需要到门卫那儿排查核对。
户主:浏览器
物业:网站服务器
户主第一次进小区:浏览器首次访问网站
物业登记户主所有信息存入系统:服务端生成session
物业发放门禁卡:服务器通过响应头set cookie下发cookie给浏览器( cookie不会储存所有信息只储存一段编号sessionId,这个编号与session对应)
在门禁卡的有效期内出示门禁卡进出小区:服务器读取cookie当中的sessionId到对应的session数据
空行:隔开报头和正文
正文:传输的数据
HTTP格式简略图为:
HTTP的响应
响应也分为四个部分响应行、响应报头、空行、响应正文
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Fri, 17 Jul 2026 09:05:32 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: http://www.jd.com/
……
响应行
响应行由三个部分组成版本、状态码、状态码的描述
常见的状态码以及状态状态码的描述
即使请求不合法但依然会有响应,状态码表示的是访问一个页面的响应(结果)
404状态码,它表示访问的资源在服务器上不存在,出错的地方在于客户端的请求首行当中的URL中的带层次的资源路径错误……
重定向
301/302 重定向:访问URL1实际上访问的是URL2,像是手机换了一个号码但为了交流方便办理了呼叫转移的业务,当别人拨打旧号码时就会转接到我的新号码上。
临时和永久的区别在于浏览器是否缓存新的地址。永久重定向当浏览器第一次访问时,服务器响应301并附带location字段表示应该访问新的地址,同时储存在本地浏览器当中,第二次访问浏览器先查本地缓存若有就直接跳转到新的地址若没找到就判断是否是其他情况。临时重定向不会被浏览器缓存,每次需要接收响应后跳转新的地址。无论是301还是302在首次访问时都需要至少两次的HTTP请求,第一次请求访问旧地址,第二次请求访问新地址
总体顺序为:用户输入URL时浏览器检索本地是否存在该URL的301跳转缓存记录,如果存在直接跳转到新地址不会发送给服务器用于获取新地址。如果没有则发送请求,在收到服务器的响应报文后读取状态码,如果是重定向判断是永久还是临时,临时的话不写入缓存,永久的话把新地址存入到本地的跳转缓存中,接着发起请求访问目标地址。
状态码的总结
1xx :信息状态码,表示接收的请求正在处理
2xx :成功状态码,表示请求正常处理完毕
3xx :重定向状态码,表示需要进行附加操作以完成请求
4xx :客户端错误状态码,表示服务器无法处理请求
5xx :服务器错误状态码,表示服务器请求出错
HTTPS
HTTPS = HTTP + SSL / TLC
HTTP是明文传输数据容易被劫持、窃取、篡改。
HTTPS是在HTTP的基础上加了加密安全层,具有加密传输、身份认证、防篡改的功能
加密
加密:明文-->密文
对称加密:一个密钥既能加密也能解密
非对称加密:两个密钥一个用于加密一个用于解密,其中一个公开出去称之为公钥,另一个自己保存称之为私钥
解密:密文-->明文
密钥:对称密钥非对称密钥
对称加密
通过一个密钥把明文加密成密文并且能通过这个密钥把密文解密成明文,像密码本通过密码本将情报加密
信息沟通时通信双方需要同一个密钥才能进行加解密,密钥的传输过程存在风险,线下传输太麻烦低效,网络传输更方便管理和密钥分配,但如果密钥是明文传输这会导致传输的信息很容易被解密,这样加密就成了无用功。单纯的对称加密的核心痛点就是密钥传输的安全问题,优点在于能加密大量数据也能更容易加密数据
非对称加密
非对称加密其中一把密钥公布出去用于加密,另一把密钥自己持有用于解密,这样沟通对方按照公钥进行加密别人无法知道其真正意思,但自己可以通过私钥解密得知正文这样就形成了加密传输。但是单纯的非对称加密缺点在于加密速度慢对加密的明文长度有限制
对称加密和非对称加密结合
利用非对称加密当中的公钥对对称加密当中的对称密钥进行加密,私钥持有方才能知道对称加密的密钥。这样沟通双方就可以使用对称加密进行加密交流。但是这样还是有一个缺点,收到公钥的一方是否能够确定这个公钥来自于我想要进行加密沟通的对象。
引入中间人攻击
中间人劫持客户端的数据报文, 并自己向服务器发送请求得到公钥a,中间人在把自己的公钥b传给客户端,让客户端误以为自己是服务器,客户端再用公钥b加密对称密钥c,再被中间人劫持使用私钥B解密得知对称密钥c,再以公钥a传递给服务器,让服务器能够通过私钥A解密,让其误认为自己是客户端。这样对于客户端来说中间人是服务器,对于服务器来说中间人是客户端
要解决的新问题是怎样辨别公钥是我需要加密通讯的对象?
引入CA证书
证书类似于网站的官方身份证,证书包含域名网站的公钥,CA机构的签名和有效期等等,是一种身份证明,证明证书当中的公钥是你加密通信对象的公钥。
证书内存放网站的公钥, CA证书本身也有一套独立公钥和私钥与网站的公钥和私钥不同,CA证书的公钥内置于操作系统当中
CA证书:CA私钥用于加密哈希摘要形成数字签名, CA公钥用于解密校验证书签名。 CA的公钥被作操作系统内置并非网络传输,且CA公钥用于解密这样客户端就可以得知CA证书当中的签名,而CA私钥用于加密被严格保存。
由于签名是由正文进行哈希摘要在进行CA私钥加密得来,用证书当中的签名解密后和本身的哈希摘要进行比较如果相同这证明证书是对的
引入HTTPS的工作流程
1,客户端与服务器完成TCP连接,发起TLS握手,服务器发放证书
2,客户端使用系统内置的CA公钥校验证书签名,确认证书的有效
3,校验完成后客户端随机生成对称密钥
4,客户端使用证书内的网站公钥加密对称密钥,发送给服务器
5,服务器使用本地的网站私钥解密,得到同一个对称密钥
6,双方后续所有的HTTP通信均使用该对称密钥加密传输
小结HTTPS
https用到两类加密对称加密和非对称加密
非对称的有网站密钥对和CA的密钥对
网站的密钥对:私钥解密服务器保存,公钥加密存放于数字证书中
CA证书密钥对:私钥加密做数字签名,公钥解密(操作系统内置并非网络传输获得)校验证书
