题目 16- 题目 20
16,说说你对 http 协议中 HSTS 的理解
HSTS,全称是 HTTP Strict Transport Security,即 HTTP 严格传输安全,是一种 Web 安全机制。HSTS 可以通过 HTTP 响应头 Strict-Transport-Security,指示浏览器在一段时间内强制使用 HTTPS 来访问某个网站,禁止通过 HTTP 连接,从而防止中间人攻击(MITM)和协议降级攻击。
HSTS 的工作原理
-
服务器启用 HSTS:服务器通过响应头 Strict-Transport-Security 告诉浏览器,该站点应该始 终通过 HTTPS 访问。
-
浏览器强制 HTTPS:
- 浏览器会记录 HSTS 策略,接下来的访问会自动从 HTTP 跳转到 HTTPS,无需服务器返回重定向。
- 即使用户手动输入 http://example.com,浏览器也会直接使用 https://example.com。
3.保护作用:避免中间人通过拦截 HTTP 请求或劫持协议的方式,实施攻击。
基础配置
仅强制主域名使用 HTTPS:
Strict-Transport-Security: max-age=31536000
包括子域名
强制主域名及所有子域名使用 HTTPS:
Strict-Transport-Security: max-age=31536000; includeSubDomains
加入预加载列表
在主域名、子域名启用 HSTS,并支持预加载:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
HSTS 的优势
-
防止协议降级攻击:
即使攻击者尝试通过 HTTP 劫持用户连接,HSTS 也会强制浏览器直接使用 HTTPS。
-
提高数据传输安全性:
所有的传输内容都会通过 HTTPS 加密,防止敏感数据被窃取。
-
性能优化:
避免 HTTP 到 HTTPS 的 301 重定向,提高首屏加载速度。
-
提升 SEO 排名:
搜索引擎(如 Google)优先处理 HTTPS 站点,HSTS 可以提高安全性评分。
17,CORS 请求中,什么情况下会触发预检请求?
触发预检请求的条件 预检请求会在以下情况下被触发:
- 请求方法不属于简单方法: 请求方法不在以下列表中时会触发预检请求:
- GET
- POST
- HEAD
- 请求头包含非简单头: 如果请求中使用了自定义头或某些不被认为是“简单头”的 HTTP 请求头,浏览器会触发预检请求。例如:
-
自定义头,如 X-Custom-Header。
-
非简单头,如 Content-Type 设置为以下值之外的类型:
- text/plain
- application/x-www-form-urlencoded
- multipart/form-data
- Content-Type 非简单类型:
当 Content-Type 不属于以下简单类型时:
- text/plain
- application/x-www-form-urlencoded
- multipart/form-data
-
credentials 的使用: 如果请求设置了跨域凭据标志(credentials: include),并且跨域时不符合简单请求规则,也可能触发预检请求。
-
使用了其他 HTTP 方法: 如果使用了如 PUT、DELETE、PATCH 等方法,通常会触发预检请求。
18.Blob,ArrayBuffer,Base64 分别有哪些使用场景?
Blob、ArrayBuffer 和 Base64 在 Web 开发中有各自的使用场景:
- Blob:
- 文件上传和下载:Blob 对象可以用于将文件数据存储为二进制形式,并进行上传或下载操作。
- 图片处理:可以将图像数据存储为 Blob 对象,并进行处理、显示或上传。
- 多媒体处理:可用于处理音频和视频等多媒体数据。
- 生成临时 URL:可以使用 Blob 对象创建临时 URL,用于在浏览器中显示或分享文件。
- ArrayBuffer:
- 图像处理:可以使用 ArrayBuffer 来处理图像数据,例如图像解码、图像滤镜等操作。
- 网络请求:可用于处理二进制数据的网络请求,例如 WebSocket 通信或二进制协议的数据传输。
- 数据加密:ArrayBuffer 可以用于加密算法的处理和操作。
- Web Workers:ArrayBuffer 可用于在 Web Worker 中进行多线程数据处理。
- Base64:
- 图片嵌入:Base64 编码可以将图片数据转换为字符串,可用于将图片嵌入到 HTML、CSS 或 JavaScript 中,减少网络请求。
- 图片传输:在文本协议中,如 JSON 或 XML,可以使用 Base64 编码将图片数据传输到服务器或其他系统。
- 数据 URL:可以将 Base64 编码的数据作为数据 URL 嵌入到 HTML 中,用于显示图像或其他媒体内容。
- 数据存储:某些浏览器 API 或本地存储机制支持 Base64 编码的数据存储。
19.Http 3.0 是基于 udp 的,那么它是如何保证传输可靠性的?
HTTP/3 使用的底层传输协议 QUIC 是基于 UDP 的,因此需要在应用层实现可靠的数据传输。QUIC 协议使用了以下几种机制来保证数据的可靠性:
-
连接迁移:QUIC 允许在网络切换或 IP 变更时迁移连接,而不需要重新建立新的连接,从而避免了连接中断和数据丢失的问题。
-
可靠性流控制:QUIC 在每个流上都实现了可靠的流控制机制,可以根据发送方和接收方的负载情况动态调整数据发送速率,从而优化传输效率和可靠性。
-
数据重传:QUIC 中每个数据包都带有唯一标识符(Packet Number),接收方可以根据这个标识符进行数据包的确认和重传,以保证数据传输的可靠性。
-
拥塞控制:QUIC 采用了基于 TCP 的拥塞控制机制,可以根据网络拥塞程度自适应调整发送速率,以避免网络拥塞和丢包等问题。
20.websocket 中的 Handshaking 是什么?
-
客户端向服务器发送升级协议请求:客户端通过普通的 HTTP GET 请求向服务器发送一个包含特殊头部字段 Upgrade 和 Connection 的 HTTP 请求。
-
服务器相应升级协议请求:当服务器收到客户端的升级协议请求后,会对该请求进行处理,并返回一个特殊的响应头部字段 Upgrade 和 Connection,并附上一个随机生成的字符串(Sec-WebSocket-Key)作为握手口令。
-
客户端发送握手确认请求:客户端接收到服务器的响应之后,会对该响应进行处理,并根据约定的算法将服务器返回的 Sec-WebSocket-Key 字符串与一个魔术字符串拼接起来,然后进行 SHA1 加密,并将结果转换成 Base64 编码格式,最后将加密后的结果作为 Sec-WebSocket-Accept 字段值附在新的请求头部中,再次发送给服务器。
-
服务器确认握手请求:当服务器收到客户端的握手确认请求后,会对请求头中的 Sec-WebSocket-Accept 字段进行验证,如果验证通过,则表示握手成功,并且服务器会返回一个状态码为 101 的 HTTP 响应,表示 WebSocket 连接已经建立。
-
WebSocket 连接建立:当客户端收到服务器的确认响应之后,WebSocket 连接就正式建立了,此时客户端和服务器都可以通过 WebSocket 协议进行双向通信。
- 利用 HTTP 建立连接:通过包含特殊头部字段的 HTTP 请求进行握手,以初始化连接。
- 建立 TCP 连接:在 HTTP 连接基础上,客户端和服务器建立 TCP 连接,并交换加密和压缩参数。
- 双向通信:TCP 连接建立后,双方可随时发送消息,无需 HTTP 请求,直接通过连接传递数据。
- 断开连接:任一方发送控制帧来关闭连接。