HTTP 全称为 Hypertext Transfer Protocol,翻译为中文是“超文本传输协议”的意思,它是互联网中应用最为广泛的一种网络协议。自 1990 年万维网(也就是互联网)诞生以来,HTTP 就成为万维网通信的基础协议。HTTP 协议是由万维网之父蒂姆·贝纳斯·李(Tim Berners-Lee)提出的,随后他还成立了万维网联盟(WWW Consortium),并组织了 IETF(Internet Engineering Task Force)小组来进一步完善和发布 HTTP 协议。
HTTP 协议是用于网络通信的,因此不论是程序开发人员还是使用程序的用户,对信息的安全都应该特别注意。面对各种各样的风险,就需要有针对的方法来应对。
HTTP 协议无法加密数据,所有通信数据都在网络中明文“裸奔”,这是导致数据泄露、数据篡改、流量劫持、钓鱼攻击等安全问题的重要原因。而 HTTPS 是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输安全。
http与https区别
区别:
1、加密:http协议对传输的数据不进行加密;https协议对传输的数据使用SSL安全协议进行加密,https加密需要CA签发的证书。
2、端口:http协议使用TCP的80端口;https协议使用TCP的443端口
3、网络分层模型:http可以明确是位于应用层;https是在http的基础上加上了SSL安全协议,而SSL是运输层协议,所以https是应用层和传输层的结合(我不同意网上将https粗暴地归为运输层的说法)
HTTPS 名字里的“S”,它把 HTTP 下层的传输协议由 TCP/IP 换成了 SSL/TLS,由“HTTP over TCP/IP”变成了“HTTP over SSL/TLS”,让 HTTP 运行在了安全的 SSL/TLS 协议上,收发报文不再使用 Socket API,而是调用专门的安全接口。参见下图:
HTTPS 的语法、语义仍然是 HTTP,但把下层的协议由 TCP/IP 换成了 SSL/TLS;SSL/TLS 是信息安全领域中的权威标准,采用多种先进的加密技术保证通信安全。
SSL/TLS
SSL 即安全套接层(Secure Sockets Layer),互联网工程组 IETF 在 1999 年把它改名为 TLS(传输层安全,Transport Layer Security),正式标准化,目前应用的最广泛的 TLS 是 1.2。
TLS 的密码套件命名非常规范,格式很固定。基本的形式是“密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法”
https如何保障安全
https使用SSL安全协议来保障安全性。具体体现在密钥和证书验证上。
密钥:
1、服务端生成一对公钥和私钥,将公钥和证书发送给客户端;
2、客户端验证证书通过后生成一个对称加密的密钥,并使用服务器生成的公钥加密,发送给服务器;
3、服务器使用私钥解密获得对称加密密钥。
4、客户端和服务器相互发送消息认可对称加密密钥,至此加密通道建立。
5、开始数据传输,在检验数据完整性的基础上,使用对称加密密钥进行加密解密。
证书验证:
一般来说浏览器都内置了权威CA的根证书,客户端使用根证书的密钥对服务器发来的证书进行解密验证,若域名、有效期、签发机关等验证项符合则通过,否则认定证书无效,断开连接。
流程如下:
1. 客户端发起一个https的请求,把自身支持的一系列Cipher Suite(密钥算法套件,简称Cipher)发送给服务端。
2. 服务端保存一个公匙和私匙。
3. 服务端,接收到客户端所有的Cipher后与自身支持的对比,如果不支持则连接断开,反之则会从中选出一种加密算法和HASH算法以证书的形式返回给客户端 证书中还包含了 公钥 颁证机构 网址 失效日期等等。
4. 客户端收到服务端响应后会做以下几件事
(1)验证证书的合法性
颁发证书的机构是否合法与是否过期,证书中包含的网站地址是否与正在访问的地址一致等,证书验证通过后,在浏览器的地址栏会加上一把小锁(每家浏览器验证通过后的提示不一样 不做讨论)。
(2)生成随机密码
如果证书验证通过,或者用户接受了不授信的证书,此时浏览器会生成一串随机数,然后用证书中的公钥加密。
(3)HASH握手信息
用最开始约定好的HASH方式,把握手消息取HASH值, 然后用 随机数加密 “握手消息+握手消息HASH值(签名)” 并一起发送给服务端。
在这里之所以要取握手消息的HASH值,主要是把握手消息做一个签名,用于验证握手消息在传输过程中没有被篡改过。
5. 客户端将加密后的内容传给服务端
6. 服务端拿到客户端传来的密文,用自己的私钥来解密握手消息取出随机数密码,再用随机数密码 解密 握手消息与HASH值,并与传过来的HASH值做对比确认是否一致。
7. 然后用随机密码加密一段握手消息(握手消息+握手消息的HASH值 )给客户端。
8. 客户端用随机数解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
因为这串密钥只有客户端和服务端知道,所以即使中间请求被拦截也是没法解密数据的,以此保证了通信的安全。
URL
URL是Uniform Resource Location的缩写,含义是统一资源定位符(器),用来指明文件在互联网中的位置。基本格式如下:
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
一个完整的URL包括以下几部分:
协议模式部分(schema):指定底层使用的协议,在Internet中可使用多种协议,如FTP、HTTP、HTTPS。
域名部分(host):服务器的域名或者IP地址
端口号(port):跟在域名后的端口,域名和端口之间使用 冒号 作为分隔符,一般端口号默认是80,使用默认端口号时可以省略不写。
虚拟目录部分(path):从域名第一个"/"开始到最后一个"/"为止,指访问资源的路径
文件名部分(url-params):指具体访问的是哪个文件资源,如果没有,则使用默认文件名,如 index.vue、index.html、index.asp。
参数部分(query-string):发送给http服务器的数据,允许有多个参数,使用&链接多个参数。
锚部分(anchor):锚用来定位页面展示的开始位置,是非必须的。
【URI = Uniform Resource Identifier (统一资源标识符),是一个用于标识某一互联网资源名称的字符串。
URN = Uniform Resource Name(统一资源名),是带有名字的因特网资源。
URL = Uniform Resource Locator (统一资源定位符),因特网的万维网服务程序上用于指定信息位置的表示方法。
URI是抽象的定义,不管用什么方法表示,只要能定位一个资源,就叫URI,有两种方法定位:1,URL,用地址定位;2,URN 用名称定位。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN)。
标识互联网上的内容 - HTTP | MDN 】
进一步学习
https://segmentfault.com/a/1190000038629499
https://www.jb51.net/article/134653.htm