跳至主要內容
Skip to content

檔案上傳系統設計 (12) —— 檔案防盜鏈與全球加速

當你的網站越來越受歡迎,有一件事會讓你頭痛:盜連 (Hotlinking)。別人可能直接在他們的討論區或網頁上引用你的圖片連結 https://your-app.com/uploads/banner.jpg

結果:圖片被別人看,頻寬費卻是你付。如果流量巨大,你的伺服器甚至會因此崩潰。

這一篇,我們來聊聊如何保護你的流量資產,並透過 CDN (Content Delivery Network) 讓造訪體驗達到極致。


一、 防盜鏈初級班:Referer 檢查

最基礎的做法是檢查 HTTP 請求中的 Referer Header。

運作原理:

當瀏覽器請求圖片時,會帶上它是「從哪個頁面發起請求的」。如果 Referer 不是你的網域(或是空的),後端或 Nginx 就可以直接拒絕請求。

nginx
# Nginx 配置範例
location ~* \.(jpg|jpeg|png|gif|webp)$ {
    valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
    if ($invalid_referer) {
        return 403;
    }
}

WARNING

缺點:Referer 可以輕易透過腳本偽造,且有些瀏覽器出於隱私考量會阻擋 Referer 的發送,導致正常使用者也看不到圖。


二、 進階防範:CDN 簽章連結

這是目前專業網站的主流做法。邏輯與我們之前提到的「預簽名 URL」類似。

教學步驟:

  1. 設定 CDN 私有源:禁止所有人直接訪問你的 S3 或後端儲存。
  2. 算出一組 Hash:當你的網頁要顯示圖片時,後端會根據 檔案路徑 + 當前時間 + 金鑰 (Secret Key) 算出一個雜湊值。
  3. 產出連結:生成的連結會長這樣:https://cdn.com/cat.jpg?token=a1b2c3&expires=1672531200
  4. 邊緣驗證:CDN 的邊緣節點會檢查 Token 對不對。如果有人直接複製這個網址,幾分鐘後 token 過期了,連結就失效。

三、 全球加速:CDN 的運作機制

為了讓全世界的使用者都能快速下載檔案,我們需要 CDN。

  • 邊緣節點 (Edge Location):CDN 在全球各地都有伺服器。
  • 快取命中 (Cache Hit):當第一個台灣的使用者請求圖片時,CDN 會從你的伺服器 (Origin) 抓取並存一份在台灣節點。
  • 後續請求:之後所有來自台灣的使用者,都會直接從台灣節點下載,不用再去你的伺服器,速度提升數十倍。

四、 效能優化:提高命中率 (HIT Rate)

CDN 的重點在於「減少回源次數」。

  1. 善用版本號:當你更新了使用者的頭像,不要用同一個檔名覆蓋(如 avatar.jpg),而是使用 avatar_v2.jpg
  2. 設定 TTL:為你的檔案設定合理的 Cache-Control Header,讓 CDN 知道這份檔案可以快取多久。

總結

檔案系統的最後一哩路在於「傳輸品質」:

  1. 防止盜連:Referer 是基礎,Signed URL 是進階。
  2. CDN 加速:讓地理距離不再是效能瓶頸。
  3. 優化快取:提高命中率,既省錢又增快。

下一篇,也是本系列的完結篇:文件預覽解決方案。


️ 進階挑戰

如果你設定了 CDN 簽章連結,但你又希望能讓搜尋引擎(如 Google 圖片搜尋)索引你的圖片,這時你的安全性政策該如何調整?


延伸閱讀與資源

← 上一章:檔案生命週期管理 | 返回專案首頁 | [下一章:文件預覽解決方案 (Series Finale)](./13-文件預覽解決方案 (Series Finale).md)