一道面试题是如何引发深层次的灵魂拷问? (5)

一般来说,需要将网站升级到 https,需要后端支持(后端需要申请证书等),然后 https 的开销比 http 大(因为要额外的简历安全链接和加密等),所以一般来说 http2.0 配合 https 的体验更佳(http2.0 更快)。

主要关注的就是 SSL/TLS 的握手流程,如下(简述):

(1)浏览器请求建立 SSL 链接,并向服务端发送一个随机数(client random)和客户端支持的加密方法,比如是 RSA 加密,此时是明文传输。

(2)服务端从中选出一组加密算法和 hash 算法,回复一个随机数(server random),并将自己的身份信息以证书的形式发回给浏览器(证书中包含了网站地址,非对称加密的公钥,以及证书颁发机构等信息)。

(3)浏览器收到服务端证书后:

1、首先验证证书的合法性(颁发机构是否合法,证书包含的网站是否和正在访问的一样),如果证书信任,浏览器会显示一个小头锁,否则会有提示。

2、用户接受到证书后(不管信任不信任),浏览器会产生一个新的随机数(Premaster secret),然后证书中的公钥以及制定的加密方法加密Premaster secret(预主密码),发送给服务器。

3、利用 client random,server random 和 premaster secret 通过一定的算法生成 HTTP 链接数据传输的对称加密 key-‘sessionkey’

4、使用约定好的 hash 算法计算握手消息,并使用生成的 session key 对消息进行加密,最后将之前生成的所有信息发送给服务端。

(4)服务端收到浏览器的回复

1、利用已知的加密方式与自己的私钥进行解密,获取 Premaster secret,

2、和浏览器相同规则生成 session key,

3、使用 session key 解密浏览器发来的握手消息,并验证 hash 是否与浏览器发来的一致,

4、使用 session key 加密一段握手消息,发送给浏览器

(5)浏览器解密并计算握手消息的 hash 值,如果与服务端发来的 hash 一致,此时握手结束。

之后所有的 https 通信数据将由之前浏览器生成的 session key 并利用对称加密算法进行加密

八、缓存问题:http 缓存

http 交互中,缓存很大程度上提升效率。

1、强缓存与弱缓存

缓存可以简单划分为两种类型:强缓存(200 from cache)与协商缓存(304);

区别简介一下:

(1)强缓存(200 from cache)时,浏览器如果判断本地缓存未过期,就直接使用,无需发起http请求。 (2)协商缓存(304)时,浏览器会向服务器发起http请求,然后服务端告诉浏览器文件未改变,让浏览器使用户本地缓存。

对于协商缓存,可以使用 ctrl/command + F5 强制刷新,使得协商缓存无效。

对于强制缓存,在未过期,必须更新资源路径才能发送新的请求。

2、缓存头部简述

怎么在代码中区分强缓存和协商缓存?

通过不同的 http 的头部控制。

属于强制缓存的:

(http1.1)Cache-Control/Max-Age (http1.0)Pragma/Expires

注意:cache_control 的值:public,private,no-store,no-cache,max-age

属于协商缓存的:

(http1.1)If-None-Match/E-tag (http1.0)If-Modified-Since/Last-Modified

再提一点,其实 HTML 页面中也有一个 meta 标签可以控制缓存方案-Pragma

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

不过,这种方案还是比较少用到,因为支持情况不佳,譬如缓存代理服务器肯定不支持,所以不推荐。

3、缓存头部区别

在 http1.1 中,出现了一些新内容,弥补 http1.0 不足。

http1.0 中的缓存控制:

(1)Pragma:严格来说不算缓存控制的头部,设置了 no-cache 会让本地缓存失效(属于编译控制,来实现特定的指令)。

(2)Expires:服务端配置,属于强缓存,用来控制在规定的时间之前,浏览器不会发送大量请求,而直接使用本地缓存,注意:Expires 一般对应服务器端时间,比如:Expires:Fri, 30 Oct 1998 14:19:41

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsszjw.html