後端面試:如何在多級代理鏈中處理 HTTP 407?
題干與適用場景
一個服務端客戶端存取外部 API,路徑經過多級顯式代理。有些請求回傳 407,另一些回傳 401。請說明兩種狀態的邊界、代理挑戰的逐跳處理、CONNECT 通道、憑證儲存、重試與觀測設計。
這是後端網路與安全題。代理數量和失敗比例是題設,不代表市場事實。
面試官考察點
- 能否區分資源伺服器認證與下一跳代理認證。
- 能否解釋
Proxy-Authenticate與Proxy-Authorization的消費邊界。 - 能否處理多跳代理、CONNECT、連線池與憑證輪換。
- 能否避免把代理憑證轉發給目標服務或寫入日誌。
回答前需要釐清的問題
- 客戶端使用顯式 HTTP 代理還是透明代理?是否有 CONNECT?
- 每一跳代理使用哪種認證方案,是否支援連線重用?
- 401 與 407 的原始回應標頭能否被保留?
- 請求是安全讀取還是帶有建立、扣款等副作用?
- 憑證由誰輪換,失敗時能否選擇備用出口?
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 適用於要求認證的下一個入站代理;多級代理鏈中,第一個期待憑證的代理會消費它。客戶端應按連線或代理身份隔離憑證,禁止把代理標頭轉發給源站。
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 放進跨請求的通用標頭模板,也不要在追蹤系統記錄原值。
5. 控制重試與副作用
收到 407 後,只在客戶端確認沒有傳送不可逆正文或請求可安全重播時重試。對 POST、扣款或建立資源,使用業務冪等鍵並先確認服務端是否已處理。認證挑戰、憑證更新與請求重播應拆成可觀測事件,不能用無限迴圈掩蓋設定錯誤。
6. 建立定位與安全指標
每一跳記錄代理標識、CONNECT 階段、認證方案、憑證版本、407 次數、重試結果與最終狀態;日誌只保留摘要。比較 401、407、TLS 握手失敗、連線重用命中率與備用出口切換,能判斷問題來自目標服務、代理策略還是憑證輪換。以故障注入驗證中間代理不會洩露或重寫目標授權標頭。
高品質示範回答
「我先把鏈路拆成代理層與資源層。407 由下一跳代理挑戰,401 由目標服務挑戰;兩者分別使用 Proxy-Authorization 與 Authorization。多級鏈路按代理身份隔離憑證,第一個期待該標頭的代理消費它,禁止轉發給源站。HTTPS 先在 CONNECT 階段完成代理認證,再讓通道內請求處理目標 401。連線池按代理與憑證版本隔離,輪換時淘汰舊連線。407 後只重播安全請求,副作用請求靠冪等鍵與狀態查詢恢復,並用逐跳指標定位。」
常見錯誤
- 把 407 當 401 → 憑證發錯邊界 → 按代理和資源分別處理挑戰。
- 把代理憑證轉發給源站 → 造成敏感資訊洩露 → 讓下一個入站代理消費並剝離。
- CONNECT 建立前傳送通道請求 → 請求狀態錯位 → 先完成代理認證與 2xx CONNECT。
- 所有連線共用認證狀態 → 憑證串租戶或版本混用 → 按代理、租戶與版本隔離池。
- 407 後無限重試 → 放大故障和副作用 → 限制次數、判斷可重播性並查詢狀態。
追問及應對
多級代理都需要認證時,能否一次傳送多個 Proxy-Authorization?
不能把它當成通用多憑證清單。請求標頭只應滿足目前期待憑證的入站代理;該代理消費後,下一跳若繼續挑戰,客戶端再按其方案處理,並驗證實作是否允許安全轉送。
為什麼不能只看最終回應的 407?
閘道可能改寫或吞掉中間回應,連線重用也可能把挑戰歸因給錯誤請求。需要保留逐跳代理日誌、連線識別與原始挑戰,才能定位實際發起者。
代理認證成功但通道內返回 401 怎麼辦?
保留代理認證狀態,針對目標服務按其 WWW-Authenticate 方案處理 Authorization。不要重新提交代理憑證,也不要把資源憑證寫入代理認證快取。