文章目录
一、理解HTTP协议
HTTP协议是应用层最广泛使用的协议。浏览器获取到页面,就是基于HTTP。
简单来说,HTTP就是浏览器和服务器之间的桥梁。
二、HTTP工作过程
上述会涉及到一个URL,浏览器会根据这个URL,构造出一个HTTP请求,发给服务器,服务器就会返回一个HTTP响应(包含了html网页、图片…)。浏览器再把得到的响应进行显示出来(渲染)。
三、HTTP协议格式
HTTP协议的详细交互过程,可以借助第三方抓包工具fiddler·。
fiddler本质上是一个代理的程序,使用的时候有两个注意事项。
1.可能和别的代理程序冲突,使用的时候,要关闭其他代理程序(包括一些浏览器插件)。
2.要想正确抓包,还要开启https功能。https是http搞出来的进化版协议。当下互联网大多数协议都是ttps的。fiddler默认不能抓https的包,需要我们手动启动一下https,并且安装证书。
http请求是有一定格式的,fiddler·会按照格式进行解析,呈现出不同的效果,此处看到的就是最原始的效果。
通过抓包可以看到,http请求其实是个行文本格式,方便阅读、
http响应也是文本,但是有的服务器会对相应进行二进制压缩,为了节省带宽。
3.1 HTTP请求
3.1.1 首行属性
GET https://ie.sogou.com/ HTTP/1.1
GET:HTTP的方法(method)
方法描述了这次的请求的语义。实际开发中,这里的方法最常见的就是 GET 和 POST。
https://ie.sogou/com/ : URL唯一资源定位符,俗称的网址
认识URL
URL最核心的四个部分:域名、端口号、层级路径、查询字符串
https://ie.sogou.com/
此处的URL省略了端口,浏览器会默认提供一个端口,http默认端口80,https默认端口443。
/ 表示路径,代表根目录,是HTTP服务器上的根目录。
这个URL有查询字符串(query string)
HTTP/1.1 : HTTP版本号
如何构造一个 GET 请求?
1.在浏览器地址栏里直接输入 url
2.html 里面的link、script、img、a…
3.通过js来构造GET
POST请求,最常见用于登录,登录跳转的时候会涉及到POST。另一个就是上传文件。
POST请求一般分成四个部分:首行、请求头(header)、空行、正文(body)
经典面试题:简述一下GET和POST最典型区别?
GET 和 POST 本质上没有什么区别,典型的区别主要是体现在习惯用法上。
1.GET通过 query string 给服务器传递信息,POST通过 body 给服务器传递信息。
2.GET请求一般从服务器上获取数据,POST请求一般给服务器提交数据。
3.GET通常会被设置成幂等,POST不要求幂等。
幂等:相同的输入,得到的结果也是确定的
4.GET可以被缓存,POST一般不被缓存。
把请求的结果保存下来,下次请求的时候,就没必要真请求,直接读取缓存中的数据。
3.1.2 header 属性
header 部分就是一堆键值对,这些键值对都是 HTTP 事先定义好的,有特殊的含义。
HOST:大概描述了服务器所在的地址和端口。用来你最终要访问的目标。
Connect-Length:表示POST请求中 body 的长度。
Content-Type:表示 body 中数据是啥格式。
GET请求没有 body,请求中没有这两个字段。
POST请求有 body,请求中必须有这两个字段。
User-Agent:描述了浏览器和操作系统的版本。
Referer:当前页面来源。如果直接在地址栏输入地址、收藏夹点击地址…都是没有Referer的。
Cookie:非常重要的header属性。
本质上是浏览器给网页提供的本地存储数据的机制。网页默认是不允许访问里的硬盘的(线程安全)。
注意!! cookie中具体存啥内容也是程序猿自定义的。
学习Cookie,要了解cookie三个问题?
-
Cookie 从哪里来?
cookie中的数据来自于服务器,服务器会通过响应的header部分设置cookie(Set-Cookie字段),服务器来决定浏览器的Cookie要存什么。 -
Cookie在哪里存的?
可以理解为Cookie存在浏览器,存在硬盘中的。Cookie在存的时候,是按照浏览器+域名来细分的,不同的浏览器各自存各自的Cookie,同一个浏览器不同域名存不同的Cookie,Cookie里面的内容不光是键值对,还有过期时间。 -
Cookie要到哪里去?
Cookie回到服务器中,同一时刻客户端是有很多的,客户端会通过Cookie保存当前用户使用的中间状态,当客户端再次访问浏览器的时候,会将Cookie带入到请求中,服务器就会知道当前客户端是啥了
3.2 HTTP响应
如下图,是一个HTTP响应。
HTTP状态码:
- 200 OK:代表成功了
- 404 Not Found:代表访问的资源不存在,在服务器上没找到
- 403 Forbidden:访问被拒绝,没有权限
- 302 Move temporarily:重定向,类似于呼叫转移。
重定向和请求转发的区别:
- 500:服务器内部错误
- 504 gatway timeout:响应时间太久,服务器等不及了
四、构造HTTP请求
对于GET请求。
1.地址栏直接输入
2.点击收藏夹
3.html中的link,css,js…
4.from表单
GET请求
下面的HTTP请求中,除了首行之外,其余部分都是浏览器自主添加的。
POST请求
POST请求有body部分。
form标签只能构造GET和POST请求,无法构造PUT、DELETE等其他请求。
- ajax请求:也是浏览器提供的一种,通过js构造HTTP请求。
- postman软件构造HTTP请求。
五、HTTPS
HTTPS = HTTP + 安全层(SSL),安全层表示用来加密的协议。网络上如果明文传输数据,是非常危险的,此时就需要加密。
5.1 对称加密
加密最简单的一种方式就是“对称加密”。
a(明文) + key(密钥) => b(密文) 加密过程
b(密文) + key(密钥) => a(明文) 解密过程
加密和解密过程共用一个密钥。
然而,对称加密的前提是,黑客不知道你的密钥。
如下图所示,客户端生成密钥发给服务器,由于密钥刚刚生成,服务器不知道密钥,此时密钥只能明文传输,那么黑客很可能就截取到你的密钥了。
所以,此时的问题就是,想办法怎么将密钥给加密了。
5.2 非对称加密
此时可以引入,非对称加密。生成一对密钥,公钥和私钥。
明文 + 公钥 => 密文
密文 + 私钥 => 明文
使用公钥加密,使用私钥解密,公钥是公开的,私钥是私有的。
如下图所示,服务器生成一对密钥,服务器持有私钥,客户端持有公钥。
此时,客户端的公钥从客户端拿,黑客得到公钥也没用。
客户端使用公钥对数据进行加密,传输给服务器,服务器就可以拿着自己的私钥进行加密,来得到对称密钥,此时客户端就可以根据对称密钥进行后续的传输了。
5.3中间人攻击
当客户端向服务器索要公钥的时候,黑客自己也可以生成一套公钥私钥,同时黑客自己存下服务器给的公钥,将自己生成的公钥发给客户端,拿着自己的私钥解密,得到客户端的对称密钥,将对称密钥使用服务器提供的公钥重新加密,发给服务器。
此时服务器不知道对称密钥已经被黑客截取到了,后续继续按照对称密钥进行加密传输了。
解决中间人攻击的关键是,让客户端知道响应的公钥是服务器返回的真实公钥。
5.4 证书
为了解决中间人攻击的问题,我们引入了证书,本质上就是引入第三方的公正机构。
服务器(网站)在建立时候,需要去专门的认证机构申请证书,服务器生成的公钥就在这个证书中。此时客户端向服务器要的不止是公钥,而是整个证书,客户端拿到证书之后,会对证书进行校验,如果发现证书是假的,浏览器就会直接弹框警告。
证书上会有一个特殊的字段,叫做证书的签名。
那么,黑客能否将证书改了,比如将证书里的公钥改了?
一旦替换了公钥,意味着客户端算的hash2和签名解密出来的hash1就对不上了,客户端就知道无效,另外,黑客不知道认证机构的私钥,无法加密生成签名。
---
# 总结
好了,有关HTTP和HTTPS协议的内容就说到这了,有喜欢的小伙伴,可以点点关注,谢谢啦~