具代表性的面試主題

前端面試:如何安全灰度 Compression Dictionary Transport?

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

題幹

一個文件站點的 HTML、CSS 和 JavaScript 在多次請求中高度重複。請設計 Compression Dictionary Transport 的灰度方案,並說明字典生命週期、HTTPS、快取鍵、回退和敏感資料隔離。

題幹與適用場景

一個文件站點每次發布都會產生相似的 HTML、CSS 和 JavaScript。團隊希望讓後續回應重用先前回應作為 Brotli 或 Zstandard 字典,降低重複傳輸,但瀏覽器支援仍不完全一致,而且回應可能包含使用者私密資料。請依據 Compression Dictionary Transport 設計灰度、快取和安全方案。

RFC 9842 定義了透過 Use-As-Dictionary 宣告字典、用戶端以 Available-Dictionary 提示可用字典,再協商字典壓縮編碼的機制。規範要求只在 HTTPS 安全情境使用;MDN 目前將這項能力標為 Limited availability,因此不能把它當成所有瀏覽器都支援的必要路徑。

面試官考察點

  • 能否說清字典註冊、匹配、雜湊協商、編碼選擇和普通壓縮回退。
  • 能否處理字典新鮮度、快取鍵、版本發布、CDN 與多節點一致性。
  • 能否辨識共享字典導致的內容推斷或壓縮側信道風險。
  • 能否依瀏覽器能力、HTTPS 與回應可讀性設計漸進增強。
  • 能否用實際指標證明節省位元組,同時沒有增加錯誤率或隱私暴露。

回答前需要釐清的問題

  • 目標瀏覽器、WebView、代理和 CDN 是否支援對應字典編碼?是否允許只對 Chromium 灰度?
  • 哪些回應是公開、同源且高度重複,哪些包含使用者、租戶或權限相關資料?
  • 字典由誰產生、簽署、過期和回滾,發布版本是否與資源雜湊綁定?
  • 快取是否按語言、租戶、授權狀態和內容編碼分隔?
  • 站點是否已有 Brotli、Zstandard、ETag、Early Hints 或 service worker 快取策略?

30 秒回答框架

「我先依瀏覽器能力和回應敏感度篩選公開、同源、重複度高的資源。伺服器只在 HTTPS 下透過 Use-As-Dictionary 宣告版本化字典,用戶端帶 Available-Dictionary 後再選擇 dcbdcz 或普通 Brotli/gzip。字典和內容一起做版本、雜湊、快取隔離,敏感回應不共享。先灰度 Chromium 和少量資源,觀察壓縮後位元組、解碼錯誤、快取命中和隱私告警,任何不支援或驗證失敗都回退普通編碼。」

分步驟深入解答

  1. 選擇適合的資源。 優先靜態、公開、同源且版本穩定的資源;不要把使用者個人化 HTML、帳戶資料、跨租戶回應或包含秘密的內容放進共享字典。先測試重複度和字典收益,再決定是否值得引入複雜度。
  1. 建立協商流程。 資源回應用 Use-As-Dictionary 宣告匹配範圍、類型、識別碼和新鮮度。用戶端有匹配字典時,在請求中送出 Available-Dictionary 雜湊,並在 Accept-Encoding 宣告支援的字典編碼;伺服器只在雙方可用且字典仍新鮮時回傳 dcbdcz,否則使用普通編碼。
http
HTTP/2 200
Content-Type: text/javascript
Cache-Control: public, max-age=3600
Use-As-Dictionary: match="/assets/*", id="docs-v42", type="dictionary"

HTTP/2 200
Content-Encoding: dcb
Vary: Accept-Encoding, Available-Dictionary
  1. 固定一致性邊界。 字典 ID、資源版本和內容雜湊進入發布工件;CDN 節點必須取得相同字典,不能讓一半節點回傳舊字典、一半節點回傳新編碼。Vary 和快取鍵要涵蓋會改變表示的請求標頭,避免把字典壓縮回應發給不支援的用戶端。
  1. 處理新鮮度與回滾。 字典過期、撤回或內容版本切換時,伺服器停止宣告並回退普通壓縮。保留舊字典一段受控時間以吸收快取,但設定明確下線時間;回滾只需撤下宣告、清理 CDN 變體並恢復 Brotli/gzip,不應依賴用戶端清空快取。
  1. 隔離隱私風險。 字典內容應與同源公開資源一樣受到保護。若攻擊者能控制部分輸入並觀察壓縮大小,重複片段可能洩露字典或回應內容;避免把秘密與攻擊者可控文字放在相同壓縮上下文,必要時關閉字典壓縮。HTTPS 保護傳輸,但不能消除壓縮側信道。
  1. 設計漸進增強。 能力探測和伺服器協商失敗時,繼續回傳 Brotli、gzip 或未壓縮回應。先選一組靜態資源和少量瀏覽器,比較 Content-Encoding 分布、傳輸位元組、TTFB、解碼錯誤、快取命中和回退率;沒有穩定收益就撤回。

高品質示範回答

我會先把範圍限定為公開、同源、版本化且重複度高的靜態資源,排除使用者 HTML、租戶資料和秘密。伺服器在 HTTPS 下用 Use-As-Dictionary 宣告一份帶 ID、匹配範圍和過期時間的字典;用戶端帶 Available-Dictionary 後,伺服器才在 Accept-Encoding 協商成功時回傳 dcbdcz。不支援、字典過期或雜湊不匹配時,普通 Brotli/gzip 是無感回退。

發布系統把字典、資源雜湊和 CDN 快取變體作為同一工件,確保所有節點一致,並用 Vary 隔離編碼和字典請求標頭。安全上,我不會把可控輸入和秘密放進同一壓縮上下文;即使 HTTPS 正常,壓縮大小仍可能產生側信道。灰度從 Chromium 的少量靜態資源開始,監控節省位元組、快取命中、解碼錯誤、回退和隱私告警,收益不足或風險上升就撤下字典宣告。

常見錯誤

  • 錯誤表現: 對所有回應啟用共享字典 → 失敗原因: 個人化或敏感資料可能進入可推斷的壓縮上下文 → 修正方法: 只選擇公開靜態資源,敏感回應保持普通壓縮。
  • 錯誤表現: 只檢查 Accept-Encoding,忽略字典雜湊和新鮮度 → 失敗原因: 用戶端可能使用錯誤字典或解碼失敗 → 修正方法: 綁定 ID、雜湊、版本和過期策略。
  • 錯誤表現: CDN 只按 URL 快取 → 失敗原因: 字典壓縮回應可能發給不支援的用戶端 → 修正方法:Vary 和快取鍵隔離編碼、字典標頭與資源版本。
  • 錯誤表現: 把 HTTPS 當成全部安全保證 → 失敗原因: 壓縮側信道仍可能洩露重複片段 → 修正方法: 隔離攻擊者可控輸入與秘密,必要時關閉字典壓縮。

追問及應對

瀏覽器不支援時會發生什麼?

伺服器只在協商到字典編碼且字典可用時回傳 dcbdcz。其他請求繼續使用 Brotli、gzip 或未壓縮回應;監控回退率,不能要求用戶端升級才能存取頁面。

字典應該多久過期?

依資源發布頻率、重複收益和撤回速度決定,並把過期時間寫入發布策略。靜態版本切換時保留短暫重疊窗口,之後撤下舊字典並清理 CDN,避免無限保留含舊內容的字典。

如何測試解碼和快取正確性?

用支援與不支援的瀏覽器、HTTP/1.1、HTTP/2、不同 CDN 節點和冷暖快取測試。驗證 Vary、內容雜湊、解碼結果、304、回源和普通編碼回退,不能只看壓縮比。

什麼訊號會讓你立即關閉?

出現跨使用者內容混用、字典雜湊不一致、解碼錯誤、快取污染、異常壓縮大小或隱私掃描告警時,立即撤下 Use-As-Dictionary,恢復普通編碼並保留現場指標。

參考資料

  • Compression Dictionary Transport(RFC 9842)
  • MDN Compression Dictionary Transport
  • Chrome for Developers:Improving Google Search with Compression Dictionaries
  • Chromium Compression Dictionary Transport 文件

面試作答要點

先講公開靜態資源篩選和協商標頭,再講字典版本、快取鍵、HTTPS、側信道、漸進增強和回滾。收益必須用位元組、快取與錯誤指標驗證。

一句話總結

共享壓縮字典能減少重複傳輸,但只有在資源隔離、版本雜湊、瀏覽器回退和隱私護欄同時成立時才適合灰度。

公開來源

同類題目