具代表性的面試主題

後端面試題:為什麼帶憑據的 HTTP API 不應依賴重新導向到 HTTPS?

後端困難
Offer.cc 編輯團隊發佈 更新

題幹

你的認證 API 同時監聽 HTTP 與 HTTPS,HTTP 請求會 301 到 HTTPS。請說明風險、伺服器與客戶端如何改造,以及如何相容舊客戶端。

題目與適用場景

你的認證 API 同時監聽 HTTP 與 HTTPS,HTTP 請求會 301 到 HTTPS。請說明這個設計的風險、伺服器與客戶端應如何改造,以及如何相容舊客戶端。題目基於 IETF HTTPAPI 工作組 2026 年 5 月更新的 Internet-Draft;該文件仍是 work in progress,不能當作最終 RFC。

面試官考察點

  • 能否指出重新導向發生前憑據已經經過明文網路。
  • 能否組合 HSTS、HTTPS DNS 記錄、連接阻斷與 Secure Cookie 等控制。
  • 能否處理共享主機、舊客戶端、代理與憑據撤銷等現實限制。
  • 能否用可驗證指標證明風險下降,而不是只說「全站 HTTPS」。

回答前需要釐清的問題

  1. HTTP 與 HTTPS 是否使用同一主機名與同一監聽入口?
  2. 憑據是 Bearer token、Cookie、API key,還是請求簽章?
  3. 是否有無法立即升級的舊客戶端、企業代理或內網呼叫?
  4. HTTP 入口是否也承載不需認證的資源?
  5. 是否已有 HSTS、HTTPS DNS 記錄、金鑰輪換與稽核日誌?

30 秒回答框架

重新導向無法挽回已發出的明文憑據;被動監聽者可能複製 Bearer token 或 Cookie。認證 API 應優先讓 HTTP 入口在建立連線前失敗,使用 HTTPS DNS 記錄與 HSTS 降低首次及後續誤配;Cookie 設定 Secure,客戶端預設拒絕不安全連線。無法立即阻斷時,對帶憑據的明文請求統一回傳 403,並按策略撤銷可能洩露的憑據,避免依憑據真假產生不同回應。遷移期間保留明確指標、灰度與回滾窗口。

分步驟深入解答

1. 說明重新導向的洩露時點

客戶端先送出 HTTP 請求,可能已包含 Authorization、Cookie 或 API key;伺服器之後回傳 301,不能擦除網路中已暴露的內容。攻擊者可重放 Bearer token 或 Cookie。即使最終 HTTPS 請求成功,應用也可能讓錯誤配置長期不被發現。

2. 設計伺服器入口

對認證端點,優先關閉公網明文監聽,或讓 80 埠只服務明確的網路來源。不要把 301 當成安全控制。若共享主機必須保留 HTTP,閘道要識別帶憑據的請求並統一回傳 403,不透露憑據是否有效。

http
HTTP/1.1 403 Forbidden
Cache-Control: no-store
Content-Length: 0

回應行為不能因憑據有效或無效而不同,否則攻擊者可藉此測試竊取的憑據。

3. 讓客戶端減少首次誤配

HTTPS DNS 記錄可在連線階段提示客戶端使用安全連線;HSTS 讓成功建立 HTTPS 後的後續連線自動升級。兩者都不是萬能:HSTS 依賴此前成功連線與客戶端實作,DNS 記錄也可能被阻斷。因此應在 SDK、CLI 與設定校驗中預設拒絕 http,並在日誌中提示可操作的修復路徑。

4. 限制憑據的使用範圍

Cookie 應帶 Secure 屬性;令牌應限制在安全上下文,必要時採用綁定到請求或連線的簽章機制。不同憑據不能套用同一撤銷策略:直接可重放的 API key、Bearer token 與 Cookie 通常要立即撤銷,只有不可偽造請求的派生簽章才可能保留。

5. 處理已洩露的憑據

收到帶憑據的明文請求後,應將憑據視為潛在洩露。伺服器可以先統一 403,再在安全連線上的下一次使用回傳「憑據已撤銷」的可診斷錯誤。撤銷動作要寫入稽核日誌,通知持有者輪換,並避免把敏感值寫入日誌、快取或錯誤回應。

6. 相容與遷移

先在 SDK 與測試環境拒絕 HTTP,再對新租戶預設關閉明文入口,最後分批遷移舊租戶。為必須使用舊代理的客戶提供短期專用過渡入口,但不得接收認證憑據;設定截止日期、監控 403 比例與輪換完成率。若共享主機的公開資源仍需 HTTP,應把認證 API 拆到獨立主機名或閘道策略。

7. 驗證安全性

檢查網路抓包中不存在 Authorization、Cookie 或 API key;驗證 HTTP 入口的連線失敗與 403 行為,測試 HSTS 快取、首次存取、代理、重試與回滾。指標包括明文請求數、帶憑據的明文請求數、自動撤銷數量、403 誤報率、舊客戶端占比與遷移完成率。

高品質示範回答

我不會把 301 重新導向當作認證 API 的安全方案,因為憑據在重新導向前已經走過明文網路。被動監聽者可以複製 Bearer token 或 Cookie,成功的 HTTPS 重試反而會掩蓋客戶端設定錯誤。

伺服器先關閉認證端點的公網 HTTP 監聽;如果共享主機暫時不能關閉,閘道對所有帶憑據的 HTTP 請求統一回傳 403,不根據憑據真假改變回應,並把憑據標為潛在洩露。對可重放的 token、API key 與 Cookie 執行撤銷和輪換。客戶端 SDK、CLI 與設定校驗預設拒絕 http,伺服器同時使用 HTTPS DNS 記錄與 HSTS 降低首次及後續誤配,Cookie 設定 Secure

遷移按新租戶、測試環境、舊租戶分批進行,給企業代理一個不接收憑據的短期過渡窗口。驗收看抓包、明文請求數、帶憑據明文請求數、撤銷與輪換完成率、403 誤報率與舊客戶端占比。這樣既解決洩露路徑,也給出可回滾的遷移計畫;IETF 文件仍是草案,具體部署承諾應保持可調整。

常見錯誤

  • 認為 HTTPS 重新導向可以保護已發送的 Authorization 或 Cookie。
  • 只設定 HSTS,卻忽略首次連線、舊客戶端與非瀏覽器 SDK。
  • 對有效和無效憑據回傳不同的明文回應,洩露可測試訊號。
  • 把所有憑據當成同一種,忽略簽章派生值與可重放 token 的差異。
  • 直接刪除 HTTP 入口,卻沒有遷移、監控、撤銷與回滾計畫。

追問及應對

如果 HTTP 入口還服務公開資源怎麼辦?

把認證 API 遷到獨立主機名,或在閘道按路徑與憑據標頭隔離。公開資源可有自己的重新導向策略,認證端點必須拒絕帶憑據的明文請求。

HSTS 能解決首次存取嗎?

不能完全解決。HSTS 需要客戶端先成功建立 HTTPS 並持久化策略;因此 SDK、設定校驗、HTTPS DNS 記錄與部署檢查仍需共同覆蓋首次連線。

什麼時候撤銷憑據?

只要憑據出現在明文請求中,就按潛在洩露處理。可重放 token、API key 與 Cookie 應撤銷並輪換;僅暴露不可偽造的派生簽章時,依威脅模型決定是否撤銷。

如何避免升級造成大面積中斷?

先在測試與新租戶啟用拒絕,觀測舊客戶端與 403 誤報,再分批遷移。保留不接收憑據的短期過渡入口與明確截止日期,完成後刪除過渡路徑。

公開來源

同類題目