HTTP 语义与缓存与 HTTP/2 与浏览器安全边界

共 30 题
#

1. HTTP 范围请求 Range/Accept-Ranges/Content-Range 与 206、416 状态码的语义如何在断点续传与视频切片中落地?

A 服务端以 206 返回指定字节区间,并用 Content-Range 描述区间与总长,非法范围返回 416 ✓ 正确答案
B Range 请求失败重传时客户端应从文件头部重新下载
C 服务端收到非法范围请求时应返回 200 并附带完整资源
D Accept-Ranges 由客户端在请求头中声明以启用范围请求
#

2. HTTP 303 See Other 与 302 Found 在浏览器 POST-Redirect-GET 模式上的差异,为什么支付回调强制使用 303?

A 303 与 302 在 POST 重定向上行为完全一致
B 浏览器收到 303 后会用 GET 访问新地址且不携带原请求体 ✓ 正确答案
C PRG 模式下刷新结果页会导致订单重复提交
D 302 的语义是强制把 POST 改写为 GET
#

3. HTTP 内容协商如何用 Accept、Accept-Encoding、Accept-Language 及质量因子 q 选择表示?无匹配时为何返回 406?

A q=0 表示该表示优先级最低但仍可被选择
B 内容协商完全由服务端单方面决定,客户端无法参与
C Accept 头只用于声明压缩算法偏好
D 客户端偏好与服务器表示无交集时,服务端返回 406 Not Acceptable ✓ 正确答案
#

4. Cache-Control 中 no-cache、no-store、private、s-maxage 的实际语义是什么?

A no-store 禁止所有缓存存储响应副本,适用于敏感信息 ✓ 正确答案
B s-maxage 对浏览器私有缓存生效并覆盖 max-age
C no-cache 表示响应不允许被任何缓存存储
D private 表示响应可以被 CDN 等共享缓存缓存
#

5. Vary: Accept-Encoding 与 Vary: Accept-Language 对 CDN 缓存命中率的影响,缓存键设计时应避免哪些过度膨胀?

A Vary 头的作用是让所有请求共享同一缓存条目
B Vary: Accept-Encoding 不会拆分 gzip 与 br 变体
C 将高基数请求头(如 User-Agent)纳入 Vary 会导致缓存键膨胀、命中率下降 ✓ 正确答案
D 缓存键只由 URL 组成,与请求头无关
#

6. Cookie 的 Path、Domain、SameSite、Secure、HttpOnly、__Host- 前缀组合如何防御 CSRF/XSS/会话固定攻击?

A HttpOnly 属性用于阻止 Cookie 在跨站请求中被携带
B __Host- 前缀要求 Cookie 必须带 Secure、Path=/ 且无 Domain ✓ 正确答案
C SameSite=Lax 允许跨站 POST 表单携带 Cookie
D Secure 属性允许 Cookie 在 HTTP 与 HTTPS 下均传输
#

7. If-Modified-Since 只精确到秒且属弱校验,经过多级代理时为何精度与一致性会下降?与 ETag 相比有何局限?

A Last-Modified 可以精确区分同一秒内的多次内容修改
B 多级代理下时钟不同步会导致基于时间的校验一致性下降 ✓ 正确答案
C 强 ETag 依赖服务器时钟生成,跨代理时会不一致
D If-Modified-Since 属于强校验器,能反映字节级变化
#

8. Vary 头部如何依据内容协商的请求头划分缓存变体?过多 Vary 字段为何会拉低缓存命中率?

A Vary 字段越多,缓存变体越少,命中率越高
B 缓存命中只要求 URL 相同,不校验 Vary 声明的请求头
C Vary 只对 URL 生效,与请求头取值无关
D 多个 Vary 字段会使缓存变体按取值组合成笛卡尔积膨胀,拉低命中率 ✓ 正确答案
#

9. 代理返回陈旧内容时,如何检查 Age、Vary、Date、缓存键与 stale-while-revalidate?

A Vary 与缓存键是否匹配不影响命中结果的正确性
B Age 头表示响应已存在于缓存系统中的时间,可用于判断新鲜度 ✓ 正确答案
C stale-while-revalidate 会阻塞用户请求直到回源完成
D Date 头表示代理转发响应的时间
#

10. HEAD 与 GET 在性能测试中的等价性,搜索引擎优化为何仍存在差异?304 Not Modified 与 200 OK 的带宽差异如何度量?

A 304 Not Modified 不携带响应实体,传输字节数远小于 200 全量响应 ✓ 正确答案
B HEAD 响应包含完整响应体,只是不带状态码
C HEAD 与 GET 在所有服务器上表现完全一致,可互换压测
D 304 响应比 200 响应消耗更多带宽
#

11. HTTP multipart/form-data 与 application/x-www-form-urlencoded 在大文件与二进制上传场景下的工程取舍?

A application/x-www-form-urlencoded 适合直接传输二进制大文件
B multipart/form-data 以 boundary 分隔 part,可直接承载文件原始字节流 ✓ 正确答案
C multipart/form-data 无法在一个请求中同时携带文件与普通字段
D 两种编码类型都要求对二进制内容做百分号转义
#

12. HTTP/2 的流、帧、连接级流控如何配合,多路复用为何仍可能受 TCP 队头阻塞?

A HTTP/2 多路复用可以完全消除 TCP 层的队头阻塞
B 流控窗口由发送方单方面设定,接收方无需干预
C HTTP/2 每条流使用独立 TCP 连接传输
D HTTP/2 一条连接承载多条流,帧通过流 ID 归属到具体流,但 TCP 丢包仍会造成跨流队头阻塞 ✓ 正确答案
#

13. HTTP/2 server push 为何在 Chrome 中默认关闭,103 Early Hints 与 preload link 关系如何?

A preload 只能通过 HTML 标记声明,无法出现在响应头中
B 103 Early Hints 会携带完整响应体提前发给浏览器
C server push 在 Chrome 中默认关闭,主因之一是推送无法感知浏览器缓存状态导致浪费 ✓ 正确答案
D server push 推送的资源永远不会与浏览器缓存冲突
#

14. TLS 1.3 与 ALPN 协商在 HTTP/2、HTTP/3 部署中的 h2、h2c、h3 标识差异,未加密 HTTP/2 适用场景是什么?

A h2c 表示基于明文 TCP 的 HTTP/2,浏览器原生支持
B h3 表示 HTTP/2 over TLS 的另一种写法
C ALPN 是 TLS 扩展,在握手期间协商应用层协议,h2 表示 HTTP/2 over TLS ✓ 正确答案
D 明文连接同样可以借助 ALPN 协商出 h2
#

15. HTTP/2 帧级流量控制(window update)的初始窗口、MAX_FRAME_SIZE 与单向流控策略对响应延迟的影响?

A 初始窗口过小会导致频繁等待 WINDOW_UPDATE 停顿,抬高响应延迟 ✓ 正确答案
B HTTP/2 流控窗口只由发送方自行决定,无需协商
C MAX_FRAME_SIZE 表示连接上允许同时打开的帧总数
D 流控窗口对 DATA 帧无效,只作用于头部帧
#

16. HTTP/2 升级 HTTPS 与 HTTP/2 明文(h2c)的部署场景差异,Spring/Netty 服务器如何协商?

A 浏览器支持通过明文 Upgrade 头协商并使用 h2c
B h2 通过 TLS 握手中的 ALPN 协商,h2c 基于明文,仅适合受信内网或调试场景 ✓ 正确答案
C h2c 与 h2 在安全性上等价,可任意互换部署
D Netty 无法操作 HTTP/2 帧层,只能使用 HTTP/1.1
#

17. 浏览器缓存分区(cache partition)启用后跨站缓存命中率显著下降,灰度回滚与 A/B 评估方案如何设计?

A 缓存分区只影响第一方资源,不影响第三方脚本
B 缓存分区可以通过配置关闭以恢复共享缓存命中率
C 缓存分区按顶层站点与请求方站点双重维度隔离缓存,导致跨站共享缓存命中率下降 ✓ 正确答案
D 缓存分区提升跨站缓存命中率
#

18. 安全方法与幂等方法如何区分,PUT、PATCH、POST 在重试策略上应如何处理?

A POST 是幂等方法,网络超时后可直接自动重试
B PATCH 无论补丁内容如何都必然幂等
C 安全方法与幂等方法含义完全相同
D PUT 语义为整体替换,重复执行效果一致,属幂等方法 ✓ 正确答案
#

19. HPACK 动态表如何压缩重复首部,敏感字段为何应使用 never-indexed 表示?

A HPACK 动态表只保存首部名,不保存首部值
B Authorization 参与动态表索引能显著提升压缩率,应默认启用
C never-indexed 表示敏感首部以字面量形式传输、不进入动态表,避免值被索引观察 ✓ 正确答案
D HPACK 索引表大小由客户端自行决定,无需协商
#

20. 遇到 421、425、429、503 时,客户端应分别依据哪些语义决定重连、延迟或重试?

A 429 表示服务端要求客户端换连接重发请求
B 503 属于永久性错误,客户端不应重试
C 421 表示连接归属错误,客户端应新建或改用正确连接重发 ✓ 正确答案
D 425 表示请求被永久拒绝,禁止重试
#

21. HPACK 动态表压缩爆破攻击(HPACK bomb)与 Nginx、Envoy 的最大表大小限制策略?

A HPACK bomb 通过压缩放大让接收方解码时消耗远超线网字节的内存 ✓ 正确答案
B 动态表大小上限由接收方解码时临时决定,无法协商
C 限制头部块大小与首部条数无法防御 HPACK bomb
D HPACK bomb 只影响发送方,不消耗接收方内存
#

22. 强 ETag、弱 ETag、Last-Modified 如何用于条件请求,If-Match 与 If-None-Match 分别防止什么问题?

A 弱 ETag 以 W/ 前缀标识,只保证语义等价,不能用于 If-Range 强校验 ✓ 正确答案
B If-Match 在 ETag 不匹配时返回 200,用于通知客户端继续写入
C If-None-Match 匹配时返回 412 Precondition Failed
D Last-Modified 是强验证器,可精确到毫秒
#

23. Transfer-Encoding: chunked 与 Content-Length 为何互斥?两者同时出现时请求走私(request smuggling)如何发生?

A 前后端对消息体长度的解析不一致是请求走私的根本成因 ✓ 正确答案
B Content-Length 与 Transfer-Encoding: chunked 同时出现时以 Content-Length 为准
C chunked 编码的每个块以固定 8 字节长度前缀开始
D 请求走私只影响请求性能,不构成安全风险
#

24. Expect: 100-continue 让客户端在发送请求体前先等服务器确认,它在大文件上传中如何节省带宽?服务器不响应 100 时客户端如何处理?

A 服务器可对带 Expect: 100-continue 的请求直接返回 4xx,此时客户端无需再发送请求体 ✓ 正确答案
B 客户端必须无限期等待 100 Continue 才能发送请求体
C 100-continue 会额外消耗一倍的上传带宽
D 服务器收到 100-continue 后必须先发送请求体再返回 100
#

25. stale-if-error、stale-while-revalidate 与 must-understand 在源站故障时如何影响 CDN 体验,配置不当的副作用是什么?

A stale-if-error 允许源站报错时用过期副本兜底,但会吸收故障告警、可能掩盖真实问题 ✓ 正确答案
B stale-while-revalidate 会阻塞用户请求直到回源刷新完成
C must-understand 要求缓存执行所有指令,未知指令一律视为可缓存
D stale-if-error 在源站返回"错误但 200"的降级响应时也会触发兜底
#

26. CORS 预检(OPTIONS)为何不能被简单请求绕过,Access-Control-Request-Headers 与 Access-Control-Request-Method 如何协商?

A 预检失败时浏览器仍会发送实际跨域请求,只是响应被拦截
B 预检通过 OPTIONS 携带 Access-Control-Request-Method 与 Access-Control-Request-Headers,服务端授权后才允许实际请求发出 ✓ 正确答案
C 简单请求不需要预检,因此服务器可以完全忽略其鉴权
D Access-Control-Max-Age 用于禁止浏览器缓存预检结果
#

27. CORS 预检由哪些请求条件触发,简单请求并不意味着服务器可以忽略鉴权的原因是什么?

A 携带自定义头 Authorization 的 GET 请求属于简单请求,无需预检
B Content-Type 为 application/json 的 POST 会触发 CORS 预检 ✓ 正确答案
C 简单请求不会被服务端处理,因此无需鉴权
D 预检请求由服务器主动发起
#

28. 浏览器跨源隔离(cross-origin isolation)开启 COOP/COEP 后 SharedArrayBuffer 与高精度计时器的可用性影响?

A 开启跨源隔离后 SharedArrayBuffer 仍然不可用
B 跨源隔离只需设置 COOP 一个响应头即可生效
C 跨源隔离会进一步降低 performance.now 的精度
D COEP: require-corp 要求所有跨源子资源显式携带 CORS/CORP 头才能加载 ✓ 正确答案
#

29. 浏览器同源策略下 cookie 的 Lax+POST 行为在跨站表单提交与 top-level GET 导航上的差异?

A SameSite=Lax 的 Cookie 在跨站 POST 表单提交中也会携带
B Chrome 的 Lax+POST 规则允许 Cookie 设置后短时间内跨站 top-level POST 携带,窗口过后恢复标准 Lax 行为 ✓ 正确答案
C SameSite=Strict 与 Lax 在跨站 GET 导航上的行为完全相同
D SameSite=Lax 无法阻断任何形式的跨站请求携带 Cookie
#

30. HTTP/1.1 持久连接(Connection: keep-alive)与 Pipelining 为何被浏览器和服务端弃用,应用层队头阻塞、代理兼容性差与同域并发连接数限制(如 Chrome 的 6 个)之间如何关联?

A HTTP/1.1 同域 6 连接限制是"多连接弥补串行"的折中,连接内请求仍然串行 ✓ 正确答案
B Pipelining 允许乱序返回响应,因此没有队头阻塞问题
C 持久连接在 HTTP/1.1 中已被完全废弃
D Pipelining 被弃用的原因是握手开销过大