HTTP协议和HTTPS协议


https://blog.csdn.net/weixin_51367845/article/details/123313047

补充1:https://blog.csdn.net/weixin_47257473/article/details/132640371 //所有的补充1都来自本处,内部还有一个程序等待我实现

HTTP基本知识

HTTP:超文本传输协议,
是应用层协议,基于TCP/IP通信协议传递数据,HTTP1.0/1.1和HTTP2.0基于TCP实现,HTTP3.0基于UDP实现
协议:通信双方达成的一套通信规则,具体体现在网络传输中数据包的格式。
补充1:HTTP特征:简单快速、无连接(TCP三次握手已经连接了)、无状态(但我们实际使用的时候,网站会记录的,就是Cookie的作用)

HTTP工作过程

当我们在浏览器上输入一个网址,通过浏览器发送给服务器,就是发送了一个HTTP请求,服务器接收到请求后,进行处理,并向浏览器进行响应,这是一次HTTP交互。当我们访问一个网站的时候,可能涉及到多个HTTP请求和响应。
HTTP协议是一发一收,一问一答的模式;

抓包工具

抓包工具:FIddler
很多网站返回的html都是被压缩过的(压缩后,网络传输的数据量变少,节省带宽);所以我们需要解压缩看具体信息;
抓包原理:Fiddler充当了一个代理程序,我们会将我的请求发送给抓包工具,抓包工具再把请求装发给我们访问的服务器;服务器的响应也是也发给抓包工具,抓包工具再发送给客户端浏览器;
请添加图片描述

HTTP协议格式

HTTP请求格式:
首行:请求方法 URL HTTP版本号
协议头:键值对,每个键值对占一行,键值之间空格:隔开
空行:协议头结束的标志
正文:正文允许空字符串,如果存在正文,那么在协议头connect-Length就会标志正文的长度;
HTTP响应格式:
首行:版本号 状态码 状态码解释
协议头:
空行
正文

为什么HTTP协议中存在空行?

1、因为HTTP协议没有规定报头存在多少键值对,使用空行来区分报头和正文,充当分隔符;
2、HTTP在传输层依赖于TCP协议,TCP面向字节流,如果没有空行,就会出现粘包问题;

HTTP请求

URL:统一资源定位符,互联网上每个文件都存在唯一的URL,它包含的信息指出文件的位置以及浏览器应该如何处理它;
URL标准格式:
协议类型:[//服务器地址[:端口号]][/资源层级 UNIX 文件路径] 文件名 [?查询字符串][#片段标识符]
URL完整格式:
协议类型:[//访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级 UNIX 文件路径] 文件名 [?查询字符串][#片段标识符]

协议类型:http、https
访问资源需要的凭证信息:一般是登录信息(用户名、密码);现在一般省略;
服务器地址:可以是一个ip地址,也可以是一个域名(域名会通过DNS系统解析成一个具体的IP地址,可以使用ping 域名得到该域名的ip地址)
端口号:用来区分一个主机上的不同程序,每个程序在访问网络的时候都会关联一个或多个端口号,通过端口号就可以区分出当前的请求给谁;
资源层级 UNIX 文件路径:表示访问该服务器程序上的某个资源的路径;
文件名:标识访问服务器上哪个资源
查询字符串:查询字符串是一个键值对结构,键值对之间使用&分割,键和值之间使用=分割,表示客户端发送给服务器传递的参数;可以通过此自定制我们需要的信息给服务器。
片段标识符:片段标识符用于页面内跳转,例如调到当前页面的某个部分,章节等;

1、URLencode介绍
当我们抓包看到某些URL时,会发现查询字符串中的值会存在%E8%9B%8B%E7%B3%95这种值,通过URLdecode可以解析出含义;
URL需要进行encode的原因:
1、由于/、?、:等这样的字符,已经被url当做特殊字符理解了,所以不能够随意出现**,如果某个参数中需要带有这些特殊字符,**就必须先对特殊字符进行转义,也就是urlencode;
2、一个中文字符由UTF-8或者GBK这样的编码方式构成,虽然在URL中没有特殊含义,但仍需要转义,否则浏览器可能把UTF-8/GBK编码中的某个字节当做URL中的特殊符号;
转义规则:

将需要转码的字符转为16进制,然后从右到左,取四位(不足四位直接处理),每两位做一位,前面加上%,编码成%XY;

2、方法
HTTP请求首行中的第一个部分,常用的只有GET和POST;

GET:获取资源

GET方法是最常用的HTTP方法,常用于获取服务器上的某个资源;例如在浏览器中输入一个URL或者点击某个链接,此时浏览器就会发送一个GET请求;

特点:首行的第一个部分就是请求方法
URL中的查询字符串可以为空
GET请求中的协议头(header)中存在若干个属性值
GET请求的正文(body)一般是空的

补充1:请求行和报头、空行都是通过\r\n来进行本行结束
请添加图片描述

POST:多用于提交用户输入的数据给服务器(如登录页面);

特点:
首行的第一个部分就是POST
URL中的查询字符串一般是空的;
POST请求的header中存在若干个键值对
POST请求的正文(body)一般不为空(body的具体数据结构由header中的Content-Type来描述,body的具体长度,由header中的Content-Length来描述)

GET和POST区别
GET和POST本质上没有区别,在使用场景上二者可以互相替代,在具体使用上有一些细节:

GET习惯上把客户端的数据通过查询字符串来传输;POST习惯上将客户端数据通过body来传输(查询字符串是空的)
GET习惯用于从服务器获得数据;POST习惯是客户端提交数据;
一般情况下,程序员会把GET请求的处理,实现成“幂等的”;对于POST请求的处理,不要求实现幂等;
GET请求可以被缓存,可以被浏览器保存到收藏夹中,POST请求不能被缓存;

幂等是什么?

一个HTTP方法是幂等的,指的是同样的请求被执行一次和连续执行多次的效果是一样的,服务器的状态也是一样的。
在正确的条件下,GET、HEAD、PUT和DELETE等方法是幂等的,POST不是幂等的;
幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同;

关于GET请求的URL长度问题的误解

GET请求的长度是不存在上限的,表面的存在上限,是由于浏览器和后端服务器设置对URL存在长度限制;
URL的长度取决于浏览器的实现和HTTP服务器端的实现,在浏览器端,不同的浏览器最大长度是不同的;在服务器端,一般这个长度是可以配置的;

关于POST比GET更安全的误解

因为GET将数据信息存放在查询字符串中,浏览器的URL可以看到,就不安全;POST将数据放到body中,看不到就很安全(这种思想是错误的)
安全问题取决于是否加密和加密的强度,和信息存放在查询字符串和正文中无关,我们通过抓包工具都可以抓到这两部分数据;

关于GET只能传输文本数据的误解

GET只能传输文本数据;POST可以传输文本数据和二进制数据(错误)
GET也可以传输二进制数据,虽然不能直接在查询字符串中传输二进制数据,但是可以针对二进制数据进行URLencode,转码后就可以放在URL中;GET还可以直接将二进制数据放到body中;

认识请求报头(header)

整体格式是键值对格式,每个键值对占一行;
常见报文键值对

Host:表示服务器的地址和端口(也可以域名)
User-Agent(简称UA):表示浏览器或者操作系统的属性
Referer:表示这个页面是从哪个页面跳转过来的
Content_length:表示body的数据长度,长度单位是字节
Content-Type:表示body的数据格式,以下介绍三种:

application/x-www-form-urlencoded:body的格式是键值对格式
multipart/form-data:form表单提交的数据格式,通常用于HTML提交图片或文件
application/json:body数据为json格式,

Cookie是什么?

Cookie是浏览器提供的一种让程序员在本地存储数据的能力;补充1:Cookie文件保存了用户输入的账号和密码等,这样再次访问该网站的时候,Cookie会自动带着账户和密码发送给服务端,省去每次登录。
为什么需要cookie?
Cookie可以使得将从服务器得到的数据存储在浏览器上,防止直接将要保存的数据存储在主机硬盘上,出现安全风险。
Cookie里面存储的是什么?
Cookie中存储了一个字符串,是键值对结构的;
Cookie来自哪里?如何网Cookie中存储数据?
Cookie这个数据可能是客户端自行通过JS写入的,也可能来自服务器在HTTP响应的header中通过Set-Cookie字段给浏览器返回数据。Cookie在浏览器端按照域名维度来存储。
Cookie要到哪里去?
Cookie字段会在后续的请求中,把浏览器本地存储的这些键值对再发送回服务器;
请添加图片描述
Cookie的一个经典应用就是保持客户端的登录状态
请添加图片描述
Cookie的缺陷?
每次请求都要把该域名下所有的Cookie通过HTTP请求传给服务器,因此Cookie的存储容量是有限的;
补充1:如果黑客在我们电脑浏览器植入了木马,获取了我们的Cookie信息,账号和密码将全部泄露,所以要在输入用户名和密码的基础上,加上认证

当从客户端输入账号和密码后,服务器端利用算法生成一个唯一id——session id;然后将账号和密码维护在服务器,将session id返回给客户端,此时Cookik文件中不保存账户和密码,而是保存session id;后续再访问服务器时,会将session id传给服务器请添加图片描述

HTTP响应(Response)

状态码:状态码表示访问一个页面的结果,如访问成功、失败或者其他,它是一位三位的整数;分为五个大类;

200OK:访问成功
404 Not Found: 表示没有找到资源
403 Forbidden:表示访问被拒绝
405 Method Not Allowed:表示访问的服务器不能支持请求中的方法
500 Internal Server Error:表示服务器出现内部错误
504 Gatway Timeout :表示当前服务器负载大,出现超时
302 Move temporary:表示临时重定向
301 Moved Permanently:表示永久重定向

响应报头(header):与请求报头的格式基本一致,

Content-Type:body的数据格式,以下介绍三种
text/html:表示数据格式是html
text/css:表示数据格式是CSS
application/JavaScript:表示数据格式是JavaScript;
application/json:表示数据格式是json

补充1:请添加图片描述

通过form表单构造HTTP请求

这就是参考文,这里从本小节的内容没有去看:https://blog.csdn.net/weixin_51367845/article/details/123313047

https://blog.csdn.net/weixin_51367845/article/details/123385750

补充1:https://blog.csdn.net/weixin_47257473/article/details/132721837

HTTPS

HTTPS是一种应用层协议,是一种通过计算机网络进行安全通信的传输协议;
HTTPS经由HTTP进行通信,是在HTTP的基础上引入了一个加密层,使用SSL/TLS来加密数据包
HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私和完整性
HTTPS默认工作在TCP协议443端口
为什么需要HTTPS,为什么需要加密?

使用密文传输保证用户的信息安全

HTTPS的工作过程

加密方式分为对称加密和非对称加密
对称加密:使用一个秘钥,实现加密和解密
补充1:常见对称加密算法:DES、3DES、AES

对称加密效率高,算法公开、计算量⼩、加密速度快、加密效率⾼但是秘钥分发时容易被截获,造成泄密

非对称加密:公钥和私钥,这对秘钥由服务器产生,常用算法:RSA、DSA。算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,⽽使得加密解密速度非常慢
非对称加密运算速度慢,只用其实现秘钥分发,还是由对称密钥实现加密通信

服务器产生一对秘钥后,将私钥保存,公钥分发给客户端
客户端得到公钥后,通过公钥将另一个对称秘钥加密传递给服务器
服务器通过公钥解开密文,得到一个对称密钥;
此后通信双方采用对称加密的方式进行通信加密

引入非对称加密后依旧存在问题(中间人攻击)

在使用非对称加密实现秘钥分发的时候,若黑客在客户端和服务器中间,黑客收到了服务器的公钥,再自己生成一对秘钥,将自己的公钥发送给客户端,然后客户端使用此公钥加密对称密钥发送给黑客,黑客用自己的私钥解密获得对称密钥,再用服务器的公钥加密发送给服务器;如此的话,通信双方的秘密全部泄露;

问题所在:1.中间人可以对数据做篡改
2.客户端⽆法确定收到的含有公钥的数据报⽂,就是⽬标服务器发送过来的!

解决办法:引入证书机制

在客户端和服务器刚建立连接时,服务器给客户端一个证书,这个证书能够证明该服务器的身份,每搭建一个HTTPS网址时都需要在CA机构申请一个证书。
证书内含有的信息:

证书发布机构
证书有效期
公钥
证书所有者
签名

引入证书流程

首先,服务器会先生成一对公钥和私钥,取第三方公正机构申请一个证书,该证书包含公钥信息;
服务器发送证书给客户端,客户端取第三方公正机构取校验该证书是否真实,客户端就可以得到公钥
然后通过公钥加密对称密钥发送给服务器,双方进行加密通信
在这个过程中,即便黑客拿到了证书,也无法伪造证书和取第三方公正机构校验。
请添加图片描述

证书校验方式

判定证书的有效期
判定证书的发布机构是否信任
判定证书是否被篡改(从系统中拿到证书发布机构的公钥,对签名进行解密,得到Hash1,和我们自己计算的证书的hash2是否相等;)

完整流程

对称加密:对称加密的秘钥实现通信的加密
非对称加密:非对称加密实现秘钥分发
证书机制:通过第三方公证机构,给网址颁发一个证书,通过该证书在第三方机构的合法性,可以防止黑客在秘钥分发时的入侵。
补充1:

数据摘要(指纹):利用单向散列函数(Hash函数)对信息进行运算,生成一段固定长度的数字摘要(用来判断数据有无篡改),常见算法:MD5、SHA1、SHA256等;
数字签名:对数据摘要进行加密得到的数据叫做数字签名。

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值