首页  |  学习总览  |  ← 上一章:JavaScript 核心 阶段三 · 第 3 章,共 10 章
阶段三 · 预计 80 小时

浏览器原理与网络 —— 页面如何运行

学完本章,你能完整回答前端面试的经典问题「从输入 URL 到页面显示发生了什么」,能独立配置缓存策略,能说清跨域和安全的底层原理。这是从「会用浏览器」到「懂浏览器」的转折点。

1浏览器架构:多进程模型

现代浏览器为什么快、为什么一个页面崩溃不影响其他页面——答案是进程隔离。

1.1 进程与线程

  • 进程:程序运行的最小资源单位,有独立的内存空间。一个进程崩了不影响其他进程。
  • 线程:进程内的执行单元,同一进程的线程共享内存。

Chrome 是多进程浏览器,主要进程:

进程职责关键点
浏览器主进程界面、标签页管理、网络请求负责与操作系统交互
渲染进程(每标签页)HTML/CSS/JS 解析与渲染包含主线程、合成线程等;沙箱隔离
GPU 进程图形处理合成加速、3D 渲染
网络进程网络资源加载统一管理请求
插件进程运行插件隔离,防止插件拖垮浏览器
💡 为什么要多进程? ① 稳定性:一个标签页崩溃不影响其他标签;② 安全性:沙箱隔离,网页代码不能直接访问系统;③ 性能:多核 CPU 并行。代价是内存占用高——这是浏览器的经典取舍。

1.2 渲染进程内部的关键线程

  • 主线程:解析 HTML/CSS、执行 JS、布局、绘制——JS 在这里跑,所以 JS 卡顿会卡住渲染。
  • 合成线程:把图层拼合成最终画面,transform/opacity 动画在这里做,不占主线程。
  • 事件触发线程:管理事件队列。
  • 定时器线程:管理 setTimeout 计时(JS 线程忙时定时器会被推迟)。

这也是阶段二事件循环的「物理载体」:主线程跑同步代码和微任务,宏任务从事件队列取。

2从输入 URL 到页面显示(面试必考主线)

这条主线串起网络、缓存、渲染、JS 执行的全过程。

2.1 完整流程(八步)

① 输入 URL
→
② DNS 解析
→
③ 建立连接
TCP/HTTPS
→
④ 发请求
查缓存
→
⑤ 服务器响应
→
⑥ 解析 HTML
→
⑦ 构建渲染树
→
⑧ 布局绘制合成
  1. 输入 URL:地址栏判断是网址还是搜索词。
  2. DNS 解析:把域名翻译成服务器 IP(先查本地缓存,再逐级向上查询)。
  3. 建立连接:TCP 三次握手 + HTTPS 的 TLS 握手(加密通道协商)。
  4. 发送请求:浏览器先查本地缓存,命中则直接使用,不发请求。
  5. 服务器响应:返回 HTML(含状态码 200/304 等)。
  6. 解析 HTML:构建 DOM 树,遇到 CSS 构建 CSSOM,遇到 JS 先下载执行(可被 defer/async 改变)。
  7. 构建渲染树:DOM + CSSOM 合并,剔除 display:none 等不可见节点。
  8. 布局 → 绘制 → 合成:计算每个节点位置(布局)、画出像素(绘制)、分层合成(合成)。

2.2 解析 HTML 的细节:为什么 JS 会阻塞

<!-- 普通 script:会阻塞 HTML 解析,先下载并执行完才继续 -->
<script src="a.js"></script>

<!-- defer:并行下载,但等 HTML 解析完才执行(按顺序)-->
<script defer src="a.js"></script>

<!-- async:并行下载,下载完立即执行(不保证顺序)-->
<script async src="a.js"></script>

// 推荐:普通脚本放 body 底部,或使用 defer
⚠️ CSS 也会阻塞渲染 浏览器要等 CSSOM 构建完才开始渲染,所以 CSS 放 head、JS 放底部(或用 defer/async)。这就是「关键渲染路径」优化——首屏前越少的阻塞资源越好。

2.3 回流(Reflow)与重绘(Repaint)

  • 回流:元素尺寸、位置变了,浏览器要重新计算布局(最贵)。触发:改 width/height/margin/padding、增删 DOM、窗口缩放。
  • 重绘:样式变了但布局没变,只重新绘制(较便宜)。触发:改 color/background。
  • 合成:transform/opacity 变化只触发合成(最便宜,GPU 处理,不占主线程)。
✅ 避免回流的实战建议 ① 用 transform 代替 top/left 动画;② 批量修改 DOM(用 DocumentFragment 或一次性 innerHTML);③ 读布局属性(offsetHeight 等)会强制刷新渲染队列,避免在循环里读;④ 使用 will-change 或 transform 提升图层。
3HTTP 协议基础

前端开发每天都和 HTTP 打交道,这些基础必须烂熟。

3.1 请求与响应结构

// 请求(请求行 + 请求头 + 请求体)
POST /api/login HTTP/1.1              // 方法 路径 版本
Host: example.com
Content-Type: application/json
Authorization: Bearer <token>

{"username":"zhangsan","password":"***"}

// 响应(状态行 + 响应头 + 响应体)
HTTP/1.1 200 OK                       // 版本 状态码 原因短语
Content-Type: application/json
Cache-Control: max-age=3600

{"token":"eyJ..."}

常用状态码(必须脱口而出)

范围代表含义
2xx 成功200 / 201 / 204成功 / 创建成功 / 无内容
3xx 重定向301 / 302 / 304永久重定向 / 临时重定向 / 缓存未修改
4xx 客户端错误400 / 401 / 403 / 404 / 429参数错 / 未登录 / 无权限 / 不存在 / 请求过频
5xx 服务端错误500 / 502 / 503 / 504服务器错 / 网关错 / 服务不可用 / 超时

3.2 请求方法

方法语义特点
GET获取资源参数在 URL,有长度限制,会被缓存/历史记录
POST提交数据参数在请求体,无长度限制,不缓存
PUT / PATCH整体替换 / 部分更新RESTful 风格
DELETE删除资源RESTful 风格
OPTIONS预检请求CORS 跨域时自动发出
HEAD只要响应头检测资源是否存在
⚠️ 语义差异 GET 是「读」,POST 是「写」。不要用 GET 做删除等有副作用的操作——会被爬虫、预加载、缓存影响。
4HTTP 缓存(性能的关键)

缓存是性能优化性价比最高的一环,也是面试高频考点。

4.1 强缓存:不请求服务器

// 服务器在响应头里返回,浏览器下次直接用缓存,不发请求
Cache-Control: max-age=3600          // 1 小时内直接用缓存
Cache-Control: no-cache              // 每次都要重新验证(协商)
Cache-Control: no-store              // 完全不缓存
Expires: Wed, 21 Oct 2026 07:28:00 GMT // 老方案,HTTP/1.0,已被 Cache-Control 取代
  • 命中强缓存:状态码 200(from memory/disk cache),无网络请求。
  • max-age 优先级高于 Expires。

4.2 协商缓存:问服务器还新不新

// 第一次请求:服务器返回资源 + 标识
ETag: "abc123"                        // 内容的指纹(优先级高)
Last-Modified: Wed, 19 Aug 2026 08:00:00 GMT  // 最后修改时间

// 第二次请求:浏览器带上标识问服务器
If-None-Match: "abc123"               // 对应 ETag
If-Modified-Since: Wed, 19 Aug 2026 08:00:00 GMT  // 对应 Last-Modified

// 服务器判断:没变 → 返回 304(无响应体),浏览器用缓存
// 变了 → 返回 200 + 新资源
💡 经典缓存策略(背下来) 静态资源(JS/CSS/图片):文件名带内容哈希(如 app.a1b2c3.js)+ 长缓存(max-age=31536000),文件变了哈希变,URL 变自动拉新。HTML:no-cache 每次协商,保证拿到最新入口。这套策略是「版本更新」的最佳实践。
5HTTPS、HTTP/2 与 HTTP/3

协议演进史就是性能与安全的历史。

5.1 HTTPS:加密的 HTTP

  • HTTP 明文传输,内容可被窃听、篡改、冒充。HTTPS = HTTP + TLS(加密层)。
  • 混合加密:非对称加密(RSA/ECC)安全交换密钥 → 对称加密(AES)高效传输数据。
  • 证书的作用:证明「这个网站是真的」——CA 机构签发,浏览器内置信任根。

5.2 HTTP/2 的关键改进

  • 多路复用:一个连接并发多个请求,解决 HTTP/1.1 的队头阻塞(一个请求卡住后面全卡)。
  • 头部压缩(HPACK):重复的请求头大幅压缩。
  • 二进制分帧:数据以二进制帧传输,更高效。
  • 服务端推送:服务器主动推资源(实际用处有限)。

HTTP/3 更进一步:基于 UDP(QUIC),解决了 TCP 层的队头阻塞,连接建立更快(0-RTT),弱网表现更好。

6浏览器存储方案

存数据选哪个?容量、生命周期、场景是关键。

方案容量生命周期特点典型场景
Cookie约 4KB可设置过期;关浏览器不一定消失每次请求自动携带;可被 JS 读(可设 HttpOnly 防读)会话标识(登录态)
localStorage约 5MB永久,需手动清同步 API;只能存字符串主题、偏好、长期缓存
sessionStorage约 5MB标签页关闭即清同步 API;标签页隔离表单草稿、页内临时数据
IndexedDB大(数百 MB+)永久异步 API;对象存储;支持索引与事务离线数据、大文件、复杂结构化数据
// localStorage 使用(只能存字符串,对象要 JSON 序列化)
localStorage.setItem("theme", "dark");
const theme = localStorage.getItem("theme");   // "dark"
localStorage.removeItem("theme");
// 存对象:JSON.stringify / JSON.parse 包裹
⚠️ Cookie 的坑 Cookie 每次请求都自动带上,4KB 虽小但积累多了会拖慢所有请求。登录态放 Cookie(HttpOnly + Secure + SameSite),业务数据尽量用 localStorage/IndexedDB。
7跨域:同源策略与 CORS

跨域是前端开发每天都要处理的现实问题,原理必须清楚。

7.1 同源策略

「源」= 协议 + 域名 + 端口,三者完全相同才算同源。浏览器出于安全,默认禁止跨源读取资源。判断例子:

// 页面在 https://a.com:443/index.html
https://a.com/api        // ✅ 同源
https://a.com:8080/api   // ❌ 端口不同
http://a.com/api         // ❌ 协议不同
https://b.com/api        // ❌ 域名不同

7.2 CORS(跨域资源共享):正规的解法

核心思路:服务器在响应头里「批准」某个源可以访问。浏览器看到许可就放行。

// 服务器返回的响应头(关键就这一行)
Access-Control-Allow-Origin: https://a.com   // 允许哪个源;* 表示任意源

// 复杂请求(自定义头、非简单方法)会先发 OPTIONS 预检
// 服务器回应:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true      // 允许携带 Cookie(此时 Origin 不能是 *)
⚠️ 常见误解 跨域报错是「浏览器拦截」——请求其实发出去了,服务器也处理了,只是浏览器不让 JS 读取响应。所以 CORS 是服务器配合的,前端改不了。开发期用代理(vite/webpack proxy)转发请求绕过,生产期必须服务器配 CORS。

其他跨域方案

  • JSONP:用 script 标签不受同源限制的漏洞,只支持 GET,老方案。
  • 代理:开发期用构建工具代理,生产期用 Nginx 反向代理,把跨域请求变成同源。
  • postMessage:iframe 间跨源通信。
8前端安全:XSS 与 CSRF

安全不是安全团队的专属话题,前端的每一行代码都可能是入口。

8.1 XSS(跨站脚本攻击)

攻击者把恶意脚本注入页面,脚本在受害者浏览器里执行,可偷 Cookie、伪造操作、窃取数据。

// 反射型/存储型:把用户输入当 HTML 输出
// ❌ 危险:用户在评论区输入 <script>偷Cookie</script>,被执行
comment.innerHTML = userInput;

// ✅ 安全:用 textContent,内容只当纯文本
comment.textContent = userInput;

三类 XSS

类型原理例子
反射型恶意脚本藏在 URL 参数里,一次性?search=<script>...
存储型恶意脚本存到服务器,所有访问者中招评论区、昵称
DOM 型脚本在客户端由 DOM 操作注入innerHTML 拼接

防御三板斧

  1. 转义输出:所有用户内容按纯文本处理(textContent / 框架自带转义如 React 默认转义)。
  2. CSP(内容安全策略):服务器设 Content-Security-Policy,只允许指定来源的脚本执行。
  3. Cookie 加 HttpOnly:脚本读不到 Cookie,偷了也没用。

8.2 CSRF(跨站请求伪造)

攻击者诱导你点开一个恶意页面,该页面偷偷向你的目标网站发请求——浏览器自动带上你的 Cookie,服务器以为是你在操作。

// 攻击页面里藏着一个自动发出的请求:
<img src="https://bank.com/api/transfer?to=黑客&amount=10000">
// 你的 Cookie 会自动带上,服务器以为是你的操作!

防御三板斧

  1. SameSite Cookie:Cookie 设 SameSite=Lax/Strict,跨站请求不携带(现代浏览器默认 Lax,效果最好)。
  2. CSRF Token:表单里带服务器下发的随机 token,攻击页面拿不到。
  3. 验证请求来源:服务器校验 Origin/Referer 头。
9实战项目(通关必做)

本章以理解为主,但也要动手验证。

项目一:性能面板实战分析

打开自己阶段一的个人主页,用 DevTools 的 Network 面板:① 逐个资源看加载时间、缓存命中情况;② 用 Performance 面板录制加载过程,找到关键渲染路径上的阻塞资源;③ 用 Lighthouse 打分并记录优化前后对比。把分析写成一份报告。

项目二:手写「从输入 URL 到页面显示」图文笔记

用流程图软件或手绘,画出完整链路(DNS → 连接 → 请求缓存 → 响应 → 解析 → 渲染树 → 布局 → 绘制 → 合成),每步标注「谁能优化、怎么优化」。这份笔记未来面试前复习,价值极高。

项目三:跨域实战

① 本地起两个端口互相请求,观察跨域报错;② 用 vite 的 proxy 配置解决开发期跨域;③ 用 Node 写一个带 CORS 头的接口,验证预检请求 OPTIONS 的完整流程。

10通关自检题

本章核心是「能讲清楚」,每题都试着讲给别人听。

1. 完整说出「从输入 URL 到页面显示」的 8 个步骤

答案:① 输入 URL(判断是网址还是搜索词)→ ② DNS 解析(域名翻译成 IP,先查本地缓存)→ ③ 建立连接(TCP 三次握手 + HTTPS 的 TLS 握手)→ ④ 发送请求(先查本地缓存,命中则直接使用)→ ⑤ 服务器响应(返回 HTML 及状态码)→ ⑥ 解析 HTML(构建 DOM 树 + CSSOM 树)→ ⑦ 构建渲染树(DOM + CSSOM 合并,剔除不可见节点)→ ⑧ 布局 → 绘制 → 合成(计算位置、画像素、分层合成最终画面)。

💡 解析这条主线串起网络、缓存、渲染、JS 执行全过程。面试时可以按「导航前 / 网络 / 渲染」三段组织答案。关键细节:第④步查缓存意味着并非每次都有网络请求;第⑥步中遇到普通 script 会阻塞 HTML 解析(defer/async 可改变这一点)。

2. 浏览器为什么用多进程模型?三个好处分别是什么?

答案:① 稳定性——一个标签页崩溃不影响其他标签页(进程有独立内存空间);② 安全性——渲染进程在沙箱中运行,网页代码不能直接访问操作系统;③ 性能——多核 CPU 可并行执行不同进程。代价是内存占用高(浏览器的经典取舍)。

💡 解析Chrome 主要进程包括:浏览器主进程、渲染进程(每标签页一个)、GPU 进程、网络进程、插件进程。渲染进程内部还有主线程、合成线程、事件触发线程等——后者是事件循环的物理载体。

3. script 的 defer 和 async 有什么区别?

答案:两者都让 script 并行下载不阻塞 HTML 解析。区别在执行时机:defer 等 HTML 全部解析完才执行,多个 defer 按顺序执行(适合有依赖的脚本,放在 head 中);async 下载完立刻执行,多个 async 不保证顺序(适合独立脚本如广告、统计代码)。普通 script 会阻塞解析,先下载并执行完才继续。

💡 解析记忆口诀:defer = defer(推迟)执行,async = 异步乱序。CSS 也会阻塞渲染(需等 CSSOM),所以 CSS 放 head、JS 放底部或用 defer。推荐普通脚本放 body 底部,或使用 defer。

4. 回流和重绘的区别?哪些属性变化只触发合成?

答案:回流(Reflow):元素尺寸、位置改变,浏览器须重新计算布局(最耗性能)。触发:改 width/height/margin/padding、增删 DOM、窗口缩放、读 offsetHeight/offsetTop 等布局属性。重绘(Repaint):样式改变但布局不变,只重新绘制像素(较便宜)。触发:改 color/background/border-color 等。合成:transform / opacity 变化只触发合成(最便宜,由合成线程在 GPU 处理,不占主线程)。

💡 解析回流一定触发重绘,重绘不一定触发回流。性能优化核心:用 transform 代替 top/left 做动画、批量修改 DOM(DocumentFragment)、避免在循环中读布局属性(会强制刷新渲染队列)、用 will-change 或 transform: translateZ(0) 提升独立图层。

5. 说出 200 / 301 / 304 / 401 / 403 / 404 / 500 / 502 的含义

答案:200 成功(资源正常返回);301 永久重定向(资源永久迁移到新 URL,浏览器会缓存);304 协商缓存命中(资源未修改,用本地缓存);401 未认证(未登录,需身份验证);403 禁止访问(已登录但无权限);404 资源不存在(URL 写错或资源已删除);500 服务器内部错误(后端代码异常);502 网关错误(上游服务器无响应或返回无效,常见于 Nginx → 后端链路)。

💡 解析速记分组:2xx 成功(200/201/204)、3xx 重定向/缓存(301 永久/302 临时/304 未修改)、4xx 客户端问题(400 参数错/401 未登录/403 无权限/404 不存在/429 请求过频)、5xx 服务端问题(500 代码错/502 网关错/503 不可用/504 超时)。区分 401 和 403:401 是「你是谁?」;403 是「我知道你是谁,但你不能进来」。

6. 强缓存和协商缓存的区别?各自的响应头是什么?

答案:强缓存——浏览器直接使用本地缓存,不发任何请求。响应头:Cache-Control: max-age=3600(HTTP/1.1,优先级高)或 Expires: <绝对时间>(HTTP/1.1 之前)。命中时状态码 200(from memory/disk cache)。协商缓存——每次请求都发向服务器,由服务器判断资源是否更新。响应头:ETag(内容指纹,优先级高)+ 请求头 If-None-Match;或 Last-Modified(修改时间)+ 请求头 If-Modified-Since。未更新返回 304,更新了返回 200。

💡 解析Cache-Control 关键值:max-age=N(强缓存 N 秒)、no-cache(强缓存失效,每次都协商)、no-store(完全不缓存)。ETag 比 Last-Modified 更精准(后者只能精确到秒,且改了内容再改回来会误判)。两者同时存在时服务器优先用 ETag 判断。

7. 静态资源的经典缓存策略是什么?为什么文件名要带哈希?

答案:静态资源(JS/CSS/图片)使用「文件名带内容哈希 + 长期强缓存」策略——如 app.a1b2c3.js 配置 Cache-Control: max-age=31536000(一年)。文件名用哈希是因为文件内容一变哈希就变,URL 随之改变,浏览器视为全新资源自动拉取最新版本,彻底解决缓存一致性问题。HTML 则配 no-cache,每次都走协商缓存,确保永远拿到最新的入口文件。

💡 解析这套策略是现代前端构建工具(Webpack/Vite)的默认行为,也是「版本更新」的最佳实践。核心逻辑:HTML 是入口(必须最新),JS/CSS 的 URL 由内容决定(内容不变 URL 不变 = 命中缓存;内容变了 URL 变了 = 自动更新)。这样既保证性能(资源不变则零网络请求)又保证版本一致性(更新后用户拿到的永远是配套的新旧文件组合)。

8. Cookie / localStorage / sessionStorage / IndexedDB 的对比(容量、生命周期、场景)

答案:Cookie — 约 4KB;可设置过期时间,关浏览器不自动消失;每次请求自动携带;会话标识(登录态),可设 HttpOnly/Secure/SameSite。localStorage — 约 5MB;永久,需手动清除;同步 API,只能存字符串;主题、偏好、长期缓存。sessionStorage — 约 5MB;标签页关闭即清除;同步 API,标签页隔离;表单草稿、页内临时数据。IndexedDB — 数百 MB+;永久;异步 API,支持索引和事务;离线数据、大文件、复杂结构化数据。

💡 解析选择策略:需要服务器看到的放 Cookie(带 HttpOnly 防 XSS 窃取);纯前端长期数据放 localStorage;临时会话级数据放 sessionStorage;数据量大或需要查询能力的放 IndexedDB。Cookie 每次请求自动带上,多会拖慢请求,业务数据尽量别放 Cookie。

9. 什么是同源策略?跨域报错是浏览器还是服务器的问题?CORS 怎么解决?

答案:「源」= 协议 + 域名 + 端口,三者完全相同才算同源。浏览器出于安全默认禁止跨源读取资源。跨域报错是浏览器的问题——请求其实发出去了,服务器也正常处理并返回了,但浏览器发现响应头没有许可,就拦截了 JS 读取响应。CORS 解法:服务器在响应头里返回 Access-Control-Allow-Origin: https://a.com(允许的源),浏览器看到许可就放行了。需要带 Cookie 时加 Access-Control-Allow-Credentials: true,此时 Origin 不能写 *,必须指定具体源。

💡 解析常见误解:跨域不是服务器拒绝,是浏览器拦截。所以开发期用代理(dev server proxy)可以把跨域请求同源化绕过。生产期必须服务器配置 CORS 头。其他方案:JSONP(只 GET、已淘汰)、Nginx 反向代理、postMessage(iframe 通信)。

10. 预检请求是什么?什么情况下会触发?

答案:预检请求(Preflight)是浏览器在发送「复杂请求」之前自动发出的一个 OPTIONS 请求,用于询问服务器「这个跨域请求是否被允许」。服务器需在响应中返回:Access-Control-Allow-Methods(允许方法)、Access-Control-Allow-Headers(允许请求头)、Access-Control-Allow-Credentials(允许携带 Cookie)。只有服务器通过了预检,浏览器才会真正发出实际请求。

💡 解析触发条件(三者满足任一即触发):① 方法不是 GET/POST/HEAD;② Content-Type 不是 application/x-www-form-urlencoded、multipart/form-data、text/plain(常见:application/json 会触发);③ 请求中包含自定义头(如 Authorization: Bearer token)。注意:每次跨域复杂请求都会预检,可通过 Access-Control-Max-Age 设置预检结果缓存时间(秒)来减少预检频率。

11. XSS 三种类型的区别?防御手段有哪些?

答案:反射型——恶意脚本藏在 URL 参数中,服务器未过滤直接把参数拼进 HTML 返回,用户点开链接即中招(一次性,需诱导点击)。存储型——恶意脚本被保存到服务器(评论区、昵称、私信等),所有访问该页面的用户都会中招(危害最大)。DOM 型——恶意脚本由客户端 JS 的 DOM 操作直接注入(如使用 innerHTML 拼接用户输入),不经过服务器。防范要点:前两类是服务器输出时未转义,第三类是前端 JS 未做文本化处理。

💡 解析防御三板斧:① 转义输出——所有用户内容按纯文本处理(React/Vue 框架默认转义);必须插入 HTML 时使用白名单过滤(如 DOMPurify);② CSP(内容安全策略)——服务器返回 Content-Security-Policy 响应头,限制只能执行指定来源的脚本;③ Cookie 加 HttpOnly——JS 通过 document.cookie 读不到该 Cookie,被 XSS 偷了也没用。一句话总结:永远不要信任用户输入,输出前必须转义。

12. CSRF 的攻击原理?SameSite Cookie 为什么能防住它?

答案:攻击原理:用户登录了银行网站(Cookie 有效),然后访问了攻击者构造的恶意页面。该页面自动向银行发起带副作用的请求(如 <img src="https://bank.com/transfer?to=hacker&amount=10000">),浏览器自动携带用户的 Cookie,银行误以为是用户本人的操作。SameSite Cookie 防御原理:Cookie 设 SameSite=Lax(默认值)时,第三方站点发起的请求(如 img/iframe/submission)不会带上该 Cookie。于是银行收到的转账请求没有登录 Cookie,认为未认证从而拒绝。SameSite=Strict 更强,连从第三方站点点击链接跳转时都不带 Cookie。

💡 解析防御三件套(层层加固):① SameSite Cookie(现代浏览器默认 Lax,成本低效果好,首选);② CSRF Token(表单嵌入服务器下发的随机 token,攻击页面无法获取);③ 服务器校验 Origin/Referer(判断请求来源是否在白名单)。SameSite 的局限:老浏览器不支持;Strict 模式用户体验可能受影响(跳转需重新登录),所以 Lax 是最佳平衡点。

13. HTTPS 的加密原理?为什么需要证书?

答案:加密原理——HTTPS = HTTP + TLS(传输层安全协议),采用混合加密:① 非对称加密(RSA / ECC)在握手阶段安全交换一个「会话密钥」;② 之后使用对称加密(AES)高效传输实际数据。非对称加密只用来解决密钥分发问题(计算慢但安全),对称加密负责数据传输(速度快)。为什么需要证书——证明「这个网站是真的,不是中间人伪装的」。证书由受信任的 CA(数字证书认证机构)签发,浏览器内置信任根证书。没有证书,中间人可以伪造服务器拿到会话密钥,混合加密就形同虚设。

💡 解析记忆口诀:非对称交换密钥(解决密钥分发难题)→ 对称加密传输数据(解决性能问题)。证书链验证原理:网站证书由中间 CA 签发,中间 CA 证书由根 CA 签发,浏览器内置根CA证书,逐级验证。Let's Encrypt 可免费申请证书,现代部署必备。TLS 1.3 已支持 1-RTT 握手(甚至 0-RTT 恢复),性能开销大幅降低。

14. HTTP/2 解决了 HTTP/1.1 的什么问题?

答案:HTTP/2 四大改进:① 多路复用——一个 TCP 连接并发多个请求/响应流,解决 HTTP/1.1 的队头阻塞(一个请求卡住后面全卡),无需开多个 TCP 连接(告别域名分片等 hack);② 头部压缩(HPACK)——重复的请求头只传增量,大幅减少 header 体积(HTTP/1.1 每次请求均带完整 header);③ 二进制分帧——数据拆为帧传输,比 HTTP/1.1 的文本协议更高效解析;④ 服务端推送——服务器可主动推送客户端需要的资源(实际采用率不高)。HTTP/3 进一步基于 QUIC(UDP)解决 TCP 层的队头阻塞,连接建立更快(0-RTT)。

💡 解析面试回答公式:HTTP/1.1 的核心问题是队头阻塞和 header 冗余 → HTTP/2 用多路复用和 HPACK 解决 → HTTP/3 进一步优化连接层(QUIC 替代 TCP)。多路复用是最大亮点:HTTP/1.1 为了并发要开 6-8 个 TCP 连接,HTTP/2 一个连接搞定所有请求。注意 HTTP/2 的队头阻塞在 TCP 层面仍存在(丢包会阻塞所有流),这就是 HTTP/3 存在的原因。
✅ 全部通关? 你已经具备「页面运行原理」的完整认知。下一阶段《工程化与构建》将进入工具链的世界——Vite、Webpack、Git、TypeScript,把你的知识变成生产力。