代表性面试主题

后端面试:如何在多级代理链中处理 HTTP 407?

后端困难
Offer.cc 编辑团队发布 更新

题干

服务请求经过企业代理、区域网关和出口代理,偶发收到 407。你如何定位挑战来自哪一跳,并安全地重试而不泄露凭证或重复副作用?

题干与适用场景

一个服务端客户端访问外部 API,路径经过多级显式代理。某些请求返回 407,另一些请求返回 401。请说明两种状态的边界、代理挑战的逐跳处理、CONNECT 隧道、凭证存储、重试和观测设计。

这是后端网络与安全题。代理数量和失败比例是题设,不代表市场事实。

面试官考察点

  • 能否区分资源服务器认证和下一跳代理认证。
  • 能否解释 Proxy-AuthenticateProxy-Authorization 的消费边界。
  • 能否处理多跳代理、CONNECT、连接池和凭证轮换。
  • 能否避免把代理凭证转发给目标服务或写入日志。

回答前需要澄清的问题

  1. 客户端使用显式 HTTP 代理还是透明代理?是否有 CONNECT?
  2. 每一跳代理使用哪种认证方案,是否支持连接级复用?
  3. 401 与 407 的原始响应头能否被客户端和网关保留?
  4. 请求是安全读取还是带有创建、扣款等副作用?
  5. 凭证由谁轮换,失败时能否选择备用出口?

30 秒回答框架

“407 表示下一跳代理要求认证,401 表示目标资源要求认证。我会记录每一跳的连接和请求 ID,读取 Proxy-Authenticate,只把对应凭证放在发往该代理的 Proxy-Authorization 中;该字段由下一入站代理消费,不能转发到目标服务。对 CONNECT 先完成代理认证再建立隧道,隧道内的 401 由目标服务处理。重试只针对可安全重放的请求,并监控 407 按代理、方案和凭证版本的分布。”

分步骤深入解答

1. 分清 401 与 407

401 的 WWW-Authenticate 描述目标资源的挑战,凭证通常放在 Authorization。407 的 Proxy-Authenticate 描述客户端到下一跳代理的挑战,客户端应使用 Proxy-Authorization。两者不能因为状态码相似而共享凭证缓存或错误处理器。

2. 设计逐跳认证

每个代理只接收自己要求的凭证。RFC 9110 规定,Proxy-Authorization 适用于要求认证的下一入站代理;多级代理链中,第一 个期待凭证的代理会消费它。客户端应按连接或代理身份隔离凭证,禁止把代理头转发给源站。

http
GET https://api.example/report HTTP/1.1
Host: api.example
Proxy-Authorization: Basic <proxy-credential>

3. 处理 CONNECT 隧道

对 HTTPS 目标,客户端先向代理发送 CONNECT。代理认证成功后返回 2xx,客户端才建立 TLS 隧道;隧道内的 HTTP 请求由目标服务处理,目标返回 401 时使用 Authorization,不再把它误判成代理 407。代理认证失败时,挑战仍属于 CONNECT 这一跳。

4. 管理连接池和凭证

连接池必须把代理地址、认证方案、租户和凭证版本作为隔离键。凭证轮换时停止复用旧连接或按代理要求重新认证,避免新请求带着错误的连接状态。不要把 Proxy-Authorization 放进跨请求的通用 header 模板,也不要在追踪系统中记录原值。

5. 控制重试与副作用

收到 407 后,仅在客户端确认没有发送不可逆正文或请求可安全重放时重试。对 POST、扣款或创建资源,使用业务幂等键并先确认服务端是否已处理。认证挑战、凭证更新和请求重放应拆成可观测事件,不能用无限循环掩盖配置错误。

6. 建立定位与安全指标

每一跳记录代理标识、CONNECT 阶段、认证方案、凭证版本、407 次数、重试结果和最终状态;日志只保留摘要。对比 401、407、TLS 握手失败、连接复用命中率和备用出口切换,能判断问题来自目标服务、代理策略还是凭证轮换。用故障注入验证中间代理不会泄露或重写目标授权头。

高质量示范回答

“我先把链路拆成代理层和资源层。407 由下一跳代理挑战,401 由目标服务挑战;两者分别使用 Proxy-AuthorizationAuthorization。多级链路按代理身份隔离凭证,第一 个期待该头的代理消费它,禁止转发到源站。HTTPS 先在 CONNECT 阶段完成代理认证,再让隧道内请求处理目标 401。连接池按代理和凭证版本隔离,轮换时淘汰旧连接。407 后只重放安全请求,副作用请求靠幂等键和状态查询恢复,并用逐跳指标定位。”

常见错误

  • 把 407 当 401 → 凭证发错边界 → 按代理和资源分别处理挑战。
  • 把代理凭证转发给源站 → 造成敏感信息泄露 → 让下一入站代理消费并剥离。
  • CONNECT 建立前发送隧道请求 → 请求状态错位 → 先完成代理认证和 2xx CONNECT。
  • 所有连接共享认证状态 → 凭证串租户或版本混用 → 按代理、租户和版本隔离池。
  • 407 后无限重试 → 放大故障和副作用 → 限制次数、判断可重放性并查询状态。

追问及应对

多级代理都需要认证时,能否一次发送多个 Proxy-Authorization?

不能把它当成通用的多凭证列表。请求头只应满足当前期待凭证的入站代理;该代理消费后,下一跳若继续挑战,客户端再按其方案处理,并验证实现是否允许安全转发。

为什么不能只看最终响应的 407?

网关可能改写或吞掉中间响应,连接复用也可能把挑战归因到错误请求。需要保留逐跳代理日志、连接标识和原始挑战,才能定位实际发起者。

代理认证成功但隧道内返回 401 怎么办?

保留代理认证状态,针对目标服务按其 WWW-Authenticate 方案处理 Authorization。不要重新提交代理凭证,也不要把资源凭证写入代理认证缓存。

公开来源

同类题目