HTTP和HTTPS
目录HTTP请求行方法get和post的区别URL查询语句版本号请求报头3Content-Type4User-Agent(UA)6CookieHTTP格式简略图为HTTP的响应响应行常见的状态码以及状态状态码的描述重定向HTTPS加密对称加密非对称加密对称加密和非对称加密结合引入中间人攻击引入CA证书引入HTTPS的工作流程小结HTTPSHTTPHTTP协议是基于应用层的网络传输协议中文名为超文本传输协议应用层协议解释的是应用层传输的数据要干啥。由于HTTP协议是应用层协议更依赖于下层的TCP或UDP协议。 高版本的HTTP会基于UDPHTTP的应用场景主要有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.1GEThttps://passport.baidu.com/passApi/js/wrapper.js?cdnversion1784190973616_1784190973332HTTP/1.1POSThttps://nav-edge.smartscreen.microsoft.com/api/browser/edge/navigate/3HTTP/1.1加粗的部分就是首行当中的Url格式一般为http://user:passwww.example.jp:80/dir/index.htm?uid1#ch1http 协议类型:// 分隔协议与地址现在的URL中一般没有用户和密码协议后面就紧跟着地址user 用户名 分隔用户名和密码pass 密码 分隔认证信息用户和密码和主机地址www.example.jp 域名 分隔域名和端口号80 端口号/ 分隔主机和带层次的资源路径index.htm 资源路径 分隔资源路径和查询语句uid1 查询语句# 分隔查询语句和锚点ch1 锚点查询语句由键值对组成以连接键值键值对可以有多个彼此之间用连接由于由于由于查询语句的键和值是自定义的但像“/”“?”“”等字符已经被URL当作特殊意义理解所以这些字符不能在查询语句中随意出现需要对这些特殊字符进行转义汉字也需要转义。将待转义的字符转成16进制每两个16进制为一组每组前加上一个%%xy例如李转义为%E6%9D%8E版本号当前协议的版本类型请求报头Host: miao.baidu.comConnection: keep-aliveContent-Length: 2139sec-ch-ua-platform: WindowsUser-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.0sec-ch-ua: Not;ABrand;v8, Chromium;v150, Microsoft Edge;v150Content-Type: text/plain;charsetUTF-8sec-ch-ua-mobile: ?0Accept: */*Origin: https://image.baidu.comSec-Fetch-Site: same-siteSec-Fetch-Mode: corsSec-Fetch-Dest: emptyReferer: https://image.baidu.com/Accept-Encoding: gzip, deflate, br, zstdAccept-Language: zh-CN,zh;q0.9,en;q0.8,en-GB;q0.7,en-US;q0.6Cookie: BAIDUID1234567896824AC0977CC218FB359726F:FG1;……报头中有几个关键的字段字段之间换行区分1Host表示服务器主机的地址和端口可能被省略2Content-Length表示正文中的数据长度3Content-Type正文中的数据类型Content-Type: text/plain;charsetUTF-8格式为类型/子类型multipart/form-dataapplication/jsontext/htmlimage/png……4User-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.0Mozilla/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本次访问的是移动端的谷歌5Referer(referrer)当前请求是从哪个界面跳转过来的6Cookiecookie请求报头中由服务器通过set cookie响应报头中下发保存在浏览器本地后续浏览器发起请求时自动会把cookie当中的信息发送给服务器储存的数据有时效。 cookie当中储存的是键值对键和值隔开对与对之间;隔开。这像是小区的门禁卡户主第一次进入小区需要登记注册信息这份信息物业的服务器会储存一份还有一份以门禁卡的形式分发给户主下次回家时刷门禁卡就可以开门不需要到门卫那儿排查核对。户主浏览器物业网站服务器户主第一次进小区浏览器首次访问网站物业登记户主所有信息存入系统服务端生成session物业发放门禁卡服务器通过响应头set cookie下发cookie给浏览器 cookie不会储存所有信息只储存一段编号sessionId这个编号与session对应在门禁卡的有效期内出示门禁卡进出小区服务器读取cookie当中的sessionId到对应的session数据空行隔开报头和正文正文传输的数据HTTP格式简略图为HTTP的响应响应也分为四个部分响应行、响应报头、空行、响应正文HTTP/1.1 301 Moved PermanentlyServer: nginxDate: Fri, 17 Jul 2026 09:05:32 GMTContent-Type: text/htmlContent-Length: 178Connection: keep-aliveLocation: http://www.jd.com/……响应行响应行由三个部分组成版本、状态码、状态码的描述常见的状态码以及状态状态码的描述即使请求不合法但依然会有响应状态码表示的是访问一个页面的响应结果404状态码它表示访问的资源在服务器上不存在出错的地方在于客户端的请求首行当中的URL中的带层次的资源路径错误……重定向301/302 重定向访问URL1实际上访问的是URL2像是手机换了一个号码但为了交流方便办理了呼叫转移的业务当别人拨打旧号码时就会转接到我的新号码上。临时和永久的区别在于浏览器是否缓存新的地址。永久重定向当浏览器第一次访问时服务器响应301并附带location字段表示应该访问新的地址同时储存在本地浏览器当中第二次访问浏览器先查本地缓存若有就直接跳转到新的地址若没找到就判断是否是其他情况。临时重定向不会被浏览器缓存每次需要接收响应后跳转新的地址。无论是301还是302在首次访问时都需要至少两次的HTTP请求第一次请求访问旧地址第二次请求访问新地址总体顺序为用户输入URL时浏览器检索本地是否存在该URL的301跳转缓存记录如果存在直接跳转到新地址不会发送给服务器用于获取新地址。如果没有则发送请求在收到服务器的响应报文后读取状态码如果是重定向判断是永久还是临时临时的话不写入缓存永久的话把新地址存入到本地的跳转缓存中接着发起请求访问目标地址。状态码的总结1xx 信息状态码表示接收的请求正在处理2xx 成功状态码表示请求正常处理完毕3xx 重定向状态码表示需要进行附加操作以完成请求4xx 客户端错误状态码表示服务器无法处理请求5xx 服务器错误状态码表示服务器请求出错HTTPSHTTPS HTTP SSL / TLCHTTP是明文传输数据容易被劫持、窃取、篡改。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通信均使用该对称密钥加密传输小结HTTPShttps用到两类加密对称加密和非对称加密非对称的有网站密钥对和CA的密钥对网站的密钥对私钥解密服务器保存公钥加密存放于数字证书中CA证书密钥对私钥加密做数字签名公钥解密操作系统内置并非网络传输获得校验证书