近年来,随着用户和互联网企业安全意识的提高和 HTTPS 成本的下降,HTTPS 已经越来越普及。HTTPS(全称是Hypertext Transfer Protocol Secure,即安全超文本传输协议)是一种安全的网络传输协议,它在传统的HTTP协议上加入了SSL/TLS加密层,用于保护网络通信过程中的数据安全,防止数据被篡改或窃取。
HTTPS并没有一个确切的发明年份,因为它是在HTTP协议的基础上逐渐发展演变而来的。HTTP协议是在1989年由蒂姆·伯纳斯-李(Tim Berners-Lee)发明的,而HTTPS的安全特性是通过在HTTP协议上添加SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议来实现的。
SSL协议最早是由Netscape公司在1994年引入,目的是为了提供安全的网络通信。随后,SSL协议经过多年的发展和标准化,逐渐演变成了现在的TLS协议。TLS协议是SSL协议的后续版本,它在安全性和兼容性方面进行了改进。
或许有人会提议,我们可以在前端页面对接收到的敏感数据进行加密处理,比如使用MD5加盐加密。但这种想法显然过于天真。首先,MD5并非一种加密算法,其英文全称是Message Digest Algorithm MD5,意为消息摘要算法,它是一种无法逆转的散列算法,这意味着经过前端MD5处理后的数据在服务器端是无法恢复的。
还是以密码为例,前端将用户密码通过MD5处理后,将得到的散列值发送给服务器,服务器由于无法恢复密码,就会直接使用这个散列值来处理用户的请求。因此,一旦第三方获取了这个散列值,就可以绕过前端的登录页面,直接访问服务器,从而引发安全问题。此外,MD5算法本身的安全性能也存在很大的隐患。
HTTPS 解决数据传输安全问题的方案就是使用加密算法,具体来说是混合加密算法,也就是对称加密和非对称加密的混合使用,这里有必要先了解一下这两种加密算法的区别和优缺点。
对称加密,顾名思义就是加密和解密都是使用同一个密钥,常见的对称加密算法有 DES、3DES 和 AES 等,其优缺点如下:
- 优点:算法公开、计算量小、加密速度快、加密效率高,适合加密比较大的数据。
- 缺点:
- 交易双方需要使用相同的密钥,也就无法避免密钥的传输,而密钥在传输过程中无法保证不被截获,因此对称加密的安全性得不到保证。
- 每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一密钥,这会使得发收信双方所拥有的钥匙数量急剧增长,密钥管理成为双方的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。
非对称加密,就是加密和解密需要使用两个不同的密钥:公钥(public key)和私钥(private key)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公钥对外公开;得到该公钥的乙方使用公钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的私钥对加密后的信息进行解密。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。常用的非对称加密算法是 RSA 算法,其优缺点如下:
- 优点:算法公开,加密和解密使用不同的钥匙,私钥不需要通过网络进行传输,安全性很高。
- 缺点:计算量比较大,加密和解密速度相比对称加密慢很多。
HTTPS (Hypertext Transfer Protocol Secure) 是基于 HTTP 的扩展,用于计算机网络的安全通信,已经在互联网得到广泛应用。在 HTTPS 中,原有的 HTTP 协议会得到 TLS (安全传输层协议) 或其前辈 SSL (安全套接层) 的加密。因此 HTTPS 也常指 HTTP over TLS 或 HTTP over SSL。
我们已经知道 TLS 握手的目的是建立安全连接,那么通信双方在这个过程中究竟干了什么呢?下面就是答案:
- 商定双方通信所使用的的 TLS 版本 (例如 TLS1.0, 1.2, 1.3等等);
- 确定双方所要使用的密码组合;
- 客户端通过服务器的公钥和数字证书 (上篇文章已有介绍)上的数字签名验证服务端的身份;
- 生成会话密钥,该密钥将用于握手结束后的对称加密。
- 'client hello'消息:客户端通过发送'client hello'消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个'client random'随机字符串。
- 'server hello'消息:服务器发送'server hello'消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和'server random'随机字符串。
- 验证:客户端对服务器发来的证书进行验证,确保对方的合法身份,验证过程可以细化为以下几个步骤:
- 检查数字签名
- 验证证书链 (这个概念下面会进行说明)
- 检查证书的有效期
- 检查证书的撤回状态 (撤回代表证书已失效)
- 'premaster secret'字符串:客户端向服务器发送另一个随机字符串'premaster secret (预主密钥)',这个字符串是经过服务器的公钥加密过的,只有对应的私钥才能解密。
- 使用私钥:服务器使用私钥解密'premaster secret'。
- 生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY。
- 客户端就绪:客户端发送经过共享密钥 KEY加密过的'finished'信号。
- 服务器就绪:服务器发送经过共享密钥 KEY加密过的'finished'信号。
- 达成安全通信:握手完成,双方使用对称加密进行安全通信。
1、HTTP与HTTPS有什么联系?它们的端口号是多少?
HTTP通常承载于TCP之上,在HTTP和TCP之间添加一个安全协议层(SSL或TSL),这个时候,就成了我们常说的HTTPS。HTTP默认的端口号为80,Https默认的端口号为443。
2、为什么 HTTPS更安全?
在网络请求中,需要有很多服务器、路由器的转发。其中的节点都可能篡改信息,而如果使用HTTPS,密钥在终点站才有。HTTPS之所以比HTTP安全,是因为它利用 SSL/TLS协议传输。它包含证书、卸载、流量转发、负载均衡、页面适配、浏览器适配、 refer传递等技术,保障了传输过程的安全性。
3、关于HTTP/2你知道多少?
HTTP/2引入了“服务器端推送”(server push)的概念,它允许服务器端在客户端需要数据之前主动将数据发送到客户端缓存中,从而提高性能。
HTTP/2提供更多的加密支持。
HTTP2使用多路技术,允许多个消息在一个连接上同时交差。
它增加了头压缩( header compression),因此请求非常小,请求和响应的 header都只会占用很小的带宽比例。
4、说出你知道的HTTP常见状态码。
(1)100 Continue表示继续,一般在发送post请求时,已发送了 HTTP header之后,服务器端将返回此信息,表示确认,之后发送具体参数信息。
(2)200 OK表示正常返回信息
(3)201 Created表示请求成功并且服务器创建了新的资源。
(4)202 Accepted表示服务器已接受请求,但尚未处理。
(5)301 Moved Permanently表示请求的网页已永久移动到新位置。
(6)302 Found表示临时性重定向。
(7)303 See Other表示临时性重定向,且总是使用GET请求新的URI。
(8)304 Not Modified表示自从上次请求后,请求的网页未修改过,
(9)400 Bad Request表示服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
(10)401 Unauthorized表示请求未授权。
(11)403 Forbidden表示禁止访问。
(12)404 Not Found表示找不到如何与URI相匹配的资源。
(13)500 Internal Server error表示最常见的服务器端错误。
(14)503 Service Unavailable表示服务器端暂时无法处理请求(可能是过载或维护)。
5、完整的HTTP事务流程是怎样的?
基本流程如下。
(1)域名解析。
(2)发起TCP的3次握手。
(3)建立TCP连接后发起HTTP请求。
(4)服务器端响应HTTP请求,浏览器得到HTML代码。
(5)浏览器解析HTML代码,并请求HTML代码中的资源。
(6)浏览器对页面进行渲染并呈现给用户。
6、实现一个简单的HTTP服务器。
在Node.js中加载HTTP模块,并创建服务器,监听端口代码。如下所示:
var http = require('http');//加载HTTP模块http.createServer ( function (req,res) { res. writeHead (200,{' Content-Type':'text/htm1'});//200代表状态成功,文档类型是//给浏览器识别用的res. write('< meta charset='UTF-8'><h1>有课前端网</h1>1');//返回给客户端的HTML数据res.end ( );//结束输出流}).listen(3000);//绑定3000
7、什么是HTTP?
HTTP是客户端和服务器端之间数据传输的格式规范,表示“超文本传输协议”。
8、什么是HTTP无状态协议?如何克服HTTP无状态协议的缺陷?
(1)无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续需要处理,需要前面提供的信息。
(2)克服无状态协议缺陷的办法是通过 cookie和会话保存信息。
9、HTTP的请求报文和响应报文包含哪些部分?
请求报文包含3部分。
(1)请求行,包含请求方法、URI、HTTP版本信息。
(2)请求首部字段。
(3)请求内容实体。
响应报文包含3部分。
(1)状态行,包含HTTP版本、状态码、状态码的原因短语。
(2)响应首部字段。
(3)响应内容实体。
10、HTTP中有哪些请求方式?
(1)GET:请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL,给服务器传递参数数据
(2)POST:传输信息给服务器,主要功能与GET方法类似,但传递的数据量通常不受限制。
(3)PUT:传输文件,报文主体中包含文件内容,保存到对应URI位置。
(4)HEAD:获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
(5) DELETE:删除文件,与PUT方法相反,删除对应URL位置的文件。
(6)OPTIONS:查询相应URI支持的HTTP方法。
11、HTTP协议中1.0版本规范与1.1版本规范的区别是什么?
在HTTP1.0中,当建立连接后,客户端发送一个请求,服务器端返回一个信息后就关闭连接,当浏览器下次请求的时候又要建立连接。显然,这种不断建立连接的方式会造成很多问题。
在HTTP1.1中,引入了持续连接的概念。通过这种连接,浏览器可以在建立一个连接之后,发送请求并得到返回信息,然后继续发送请求再次等到返回信息。也就是说,客户端可以连续发送多个请求,而不用等待每一个响应的到来。
12、HTTP的首部字段包括哪些类型?
(1)通用首部字段(请求报文与响应报文都会使用的首部字段)。
它包括以下几部分。
- Date:创建报文的时间
- Connection:连接的管理
- Cache- Control:缓存的控制
- Transfer- Encoding:报文主体的传输编码方式
(2)请求首部字段(请求报文会使用的首部字段)。
它包括以下几部分。
- Host:请求资源所在服务器。
- Accept:可处理的媒体类型。
- Accept-Charset:可接受的字符集。
- Accept- Encoding:可接受的内容编码。
- Accept- Language:可接受的自然语言。
(3)响应首部字段(响应报文会使用的首部字段)。
它包括以下几部分
- Accept- Ranges:可接受的字节范围。
- Location:令客户端重新定向到的URL。
Server : HTTP服务器的安装信息
(4)实体首部字段(请求报文与响应报文的实体部分使用的首部字段)。
它包括以下几部分。
- Allow:资源可支持的HTTP方法。
- Content-Type:实体主体的类型。
- Content- Encoding:实体主体使用的编码方式。
- Content-Language:实体主体的自然语言。
- Content- Length:实体主体的字节数。
- Content- Range:实体主体的位置范围,一般用于发出部分请求时使用。
13、与HTTPS相比,HTTP有什么缺点?
HTTP的缺点如下。
(1)通信使用明文,不加密,内容可能被窃听,也就是被抓包分析。
(2)不验证通信方身份,可能遭到伪装。
(3)无法验证报文完整性,可能被篡改。
HTTPS就是HTTP+加密处理(一般是SSL安全通信线路)+认证+完整性保护。
14、如何优化HTTP请求?
利用负载均衡优化和加速HTTP应用请求;利用HTTP缓存来优化网站请求。
15、HTTP协议有哪些特征?
支持客户端/服务器模式,简单快速,灵活,无连接,无状态。
16、HTTP1.1版本的新特性有哪些?
新特性如下所示。
(1)默认持久连接,节省通信量,只要客户端服务端中任意一端没有明确指出断开TCP连接,就一直保持连接,可以多次发送HTTP请求。
(2)管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应。
(3)断点续传原理。
17、说说TCP传输的三次握手、四次挥手策略。
为了准确无误地把数据送达目标处,TCP采用了三次握手策略。用TCP把数据包发送出去后,TCP不会对传送后的数据置之不理,它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志,即SYN和ACK。
发送端首先给接收端发送一个带SYN标志的数据包。接收端收到后,回传一个带有SYN/ACK标志的数据包以表示正确传达,并确认信息。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结東。若在握手过程中的某个阶段莫名中断,TCP会再次以相同的顺序发送相同的数据包。
断开一个TCP连接则需要“四次握手”。
第一次握手:主动关闭方发送一个FIN,用来关闭主动关闭方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方,主动关闭方已经不会再给被动关闭方发送数据了(当然,在FIN包之前发送出去的数据,如果没有收到对应的ACK确认报文主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接收数据。
第二次握手:被动关闭方收到FIN包后,给对方发送一个ACK,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次握手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,被动关闭方的数据也发送完了,不会再给主动关闭方发送数据了。
第四次握手:主动关闭方收到FIN后,给被动关闭方发送一个ACK,确认序号为收到序号+1,至此,完成四次握手。
18、说说TCP和UDP的区别。
TCP( Transmission control protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过3次“对话”才能建立起来。
UDP( User Datagram Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。UDP适用于次只传送少量数据、对可靠性要求不高的应用环境。
19、一个页面从输入URL到页面加载显示完成,这个过程中都发生了什么?
整个过程可分为4个步骤。
(1)当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上毎个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器上启动一个DNS查询。这能使浏览器获得请求对应的IP地址。
(2)浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCPP连接。该握手包括一个同步报文、一个同步-应答报文和一个应答报文,这3个报文在浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,然后服务器应答并接受客户端的请求,最后由客户端发出已经接受该请求的报文。
(3)一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTP的GET请求。远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态码表示一个正确的响应
(4)此时web服务器提供资源服务,客户端开始下载资源。请求返回后,便进入了浏览器端模块。浏览器会解析HTML生成 DOM Tree,其次会根据CSS生成CSS规则树,而 JavaScript又可以根据 DOM API操作DOM。
20、网络分层模型有哪七层?
七层分别是应用( Application)层、表示( Presentation)层、会话( Session)层传输( Transport)层、网络( Network)层、数据链路(Link)层和物理( Physical)层。
每一层的作用如下。
- 应用层:允许访问OSI环境的手段。
- 表示层:对数据进行翻译、加密和压缩。
- 会话层:建立、管理和终止会话。
- 传输层:提供端到端的可靠报文传递和错误恢复。
- 网络层:负责数据包从源到宿的传递和网际互联。
- 数据链路层:将比特组装成帧并实现点到点的传递。
- 物理层:通过媒介传输比特,确定机械及电气规范。
21、网络七层模型中,你所熟知的协议有哪些?
有以下几种协议。
- ICMP,即因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
- TFTP,即TCPP协议族中一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
- HTTP,即超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷快速的方式,适用于分布式超媒体信息系统。
- DHCP,即动态主机配置协议,是一种让系统得以连接到网络并获取所需要配置参数的手段。
22、讲讲304缓存的原理。
服务器首先为请求生成ETag,服务器可在稍后的请求中,使用它来判断页面是否已经修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)是否缓存。
304是HTTP状态码,服务器用它来标识这个文件没有修改,不返回内容,浏览器在接收到个状态码后,会使用浏览器已缓存的文件。
客户端请求页面A。服务器返回页面A,并给A加上一个ETag。客户端展现该页面,并将页面连同ETag一起缓存。
客户端再次请求页面A,并将上次请求时服务器返回的ETag起传递给服务器。
服务器检查该ETag,并判断岀该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改一 Not modified)和一个空的响应体。
23、什么是Etag?
当发送一个服务器请求时,浏览器首先会进行缓存过期判断。浏览器根据缓存过期时间判断缓存文件是否过期若没有过期,则不向服务器发送请求,直接使用缓存中的结果。
此时,我们在浏览器控制台中可以看到200 OK( from cache),这种情况就是完全使用缓存,浏览器和服务器没有任何交互。
若已过期,则向服务器发送请求。此时,请求中会带上文件修改时间和Etag,然后进行资源更新判断。
服务器根据浏览器传过来的文件修改时间,判断自浏览器上一次请求之后,文件是否被修改过。根据Etag,判断文件内容自上一次请求之后,有没有发生变化。
若两种判断的结论都是文件没有被修改过,服务器就不给浏览器发送新的内容,而是直接告诉浏览器,文件没有被修改过,可以继续使用缓存—-304 Not Modified。
此时,浏览器就会从本地缓存中获取请求资源的内容,这种情况叫协议缓存,浏览器和服务器之间有一次请求交互。
若修改时间或文件内容判断中有任意一个没有通过,则服务器会受理此次请求,并返回新的数据注意,只有get请求会被缓存,post请求不会。
24、说说ETag的应用。
Etag由服务器端生成,客户端通过 If-Match或者If-None- Match这个条件判断请求来验证资源是否修改。常见的是使用I-None- Match。请求一个文件的流程如下。
第一次请求时,客户端发起 Http Get请求,以获取一个文件,服务器处理请求,返回文件内容和请求头(包括Eag),并返回状态码200第二次请求时,客户端发起 Http Get请求,以获取一个文件。
注意,这个时候客户端同时发送一个If-None- Match头,这个头的内容就是第一次请求时服务器返回的Etag服务器判断发送过来的Etag和计算出来的Etag是否匹配。
如果If- None-Match为 False,不返回200,返回304,客户端继续使用本地缓存。
如果服务器设置了 Cache- Control:max-age和 Expires,服务器端在完全匹配 If-Modified- Since和 If-None-Match后,即检查完修改时间和Etag之后,才能返回304。
25、Expires和 Cache- Control的作用是什么?
Expires要求客户端和服务器端的时间严格同步。HTTP1.1引入Cache-Control来克服 Expires头的限制。如果max-age和 Expires同时出现,则max-age有更高的优先级。
具体代码如下所示。
[1] HTTPS详解一:
https://segmentfault.com/a/1190000021494676
[2] HTTPS详解一:
https://segmentfault.com/a/1190000021559557
[3] SSL/TLS详解:
https://segmentfault.com/a/1190000002554673