題幹與適用場景
這道系統設計題考察臨時憑證的生命週期與權限邊界。重點不是把物件儲存的簽名 API 包一層,而是讓連結只擁有必要能力,在洩露、撤銷、金鑰輪換和跨區域存取時仍可控可追蹤。
面試官考察什麼
- 能否把簽名 URL 綁定到租戶、物件、HTTP 方法、版本、範圍和過期時間。
- 能否區分簽名驗證、即時授權、撤銷和物件儲存實際權限。
- 能否設計金鑰輪換、短期快取、CDN 分發、限流和稽核資料流。
- 能否解釋 URL 洩露、重放、時鐘偏差、區域故障和撤銷延遲的取捨。
回答前需要澄清的問題
先確認下載還是上傳、單一物件還是批量、是否支援 Range 和分片、連結最長有效期、撤銷是否要求秒級生效,以及存取是否經過 CDN。也要確認租戶隔離、稽核保留期、金鑰管理服務、跨區域容災和物件版本語意。
30 秒回答框架
我會讓授權服務先驗證呼叫者,再簽發綁定租戶、物件版本、操作、條件和短過期時間的 URL。簽名使用金鑰版本和正規化請求,儲存端或邊緣驗證簽名;高風險撤銷透過短 TTL、deny-list 或版本撤銷標記實現。URL 只授予最小權限,存取事件進入不可變稽核流,並透過限流、重放檢測和金鑰輪換控制風險。
分步驟深入解答
1. 定義憑證模型與權限
令牌至少包含租戶、物件鍵或不可猜的物件 id、版本、允許的方法、位元組範圍、內容類型約束、簽發者、過期時間和金鑰版本。上傳 URL 還應限制大小、校驗和和目標前綴。伺服器先做即時物件授權,再把最終允許的條件寫入簽名,避免客戶端修改參數擴大權限。
2. 選擇簽名與驗證路徑
可使用雲端儲存相容的 HMAC 或非對稱簽名,簽名覆蓋 HTTP 方法、路徑、查詢參數、關鍵標頭和過期時間,並對空白、編碼和參數排序做正規化。驗證方檢查時間窗口、金鑰版本、簽名和條件;關鍵操作仍需伺服器即時檢查,而不是把所有授權都快取到 URL。
3. 設計撤銷、輪換與重放防護
短過期時間限制洩露影響;撤銷高價值連結時,可在 Redis 或邊緣規則中記錄令牌 id、物件版本或租戶 deny-list。金鑰輪換保留舊版本到最長 URL 生命週期結束,再刪除舊金鑰。一次性上傳可要求 nonce、物件狀態和完成標記,重複下載則按業務允許多次還是綁定裝置決定。
4. 擴展儲存、CDN 與故障處理
簽發服務保持無狀態,元資料和撤銷記錄由高可用儲存承載;物件內容直接走儲存或 CDN,避免應用伺服器中轉大檔。CDN 快取必須把簽名和權限邊界納入策略,不能把一個租戶的私密回應快取給另一個租戶。金鑰管理或撤銷儲存暫時不可用時,對新簽發和高風險存取採取 fail-closed,已簽發低風險連結按明確 TTL 處理。
5. 觀測、限流和安全驗證
稽核事件記錄簽發者、租戶、物件、方法、結果、區域、客戶端指紋摘要和撤銷原因,不記錄完整 URL 查詢串。按租戶、使用者、物件和 IP 限制簽發頻率、總位元組和並行,檢測同一令牌異常重放。測試參數竄改、過期、時鐘偏差、金鑰輪換、撤銷延遲、跨租戶存取、CDN 命中和區域故障。
高品質示範回答
授權服務驗證呼叫者後,簽發綁定租戶、物件不可變版本、方法、必要條件和短過期時間的 URL,簽名覆蓋正規化路徑、查詢參數和關鍵標頭。物件儲存或 CDN 驗證簽名,應用不轉發大檔;高風險連結用短 TTL、deny-list 或版本撤銷支援撤銷。舊金鑰保留到最長連結過期後刪除。稽核流記錄簽發與存取結果但不記錄完整 URL,限流覆蓋租戶和物件。測試參數竄改、重放、時鐘偏差、跨租戶、輪換、撤銷和 CDN 快取隔離。
常見錯誤
- 只簽名物件路徑,沒有綁定租戶、方法、版本或上傳條件。
- 把永久 URL 當成撤銷憑證,洩露後無法快速止損。
- 輪換金鑰時立刻刪除舊金鑰,導致合法連結全部失效。
- 讓 CDN 只按路徑快取私密內容,忽略簽名和租戶邊界。
- 把完整簽名 URL 寫入日誌、分析系統或錯誤訊息。
- 只測簽名正確性,不測參數竄改、重放、時鐘偏差和撤銷延遲。
追問及應對
為什麼不把所有授權都放進 JWT?
簽名 URL 可以把條件綁定到資源請求並由儲存驗證,應用不必代理大檔;但它仍不是即時撤銷系統。高風險權限需要短 TTL、版本撤銷或即時檢查,不能只依賴自包含令牌。
如何實作秒級撤銷?
讓邊緣或驗證層檢查高優先級 deny-list、物件版本撤銷標記或租戶狀態,並設定極短快取 TTL。代價是每次存取增加儲存讀取和一致性壓力,需要按風險分層。
上傳 URL 如何避免覆蓋別人的物件?
簽名綁定不可變物件鍵或一次性上傳 id、If-None-Match、大小和校驗和;完成時伺服器再次確認租戶和物件狀態,拒絕路徑替換和重複完成。
CDN 應該快取簽名 URL 嗎?
可以快取內容,但快取鍵、回應標頭和 TTL 必須保證不同權限不會共享私密回應。對高風險或短時資源可繞過共享快取,犧牲命中率換取隔離和撤銷可控性。