檔案上傳系統設計 (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」類似。
教學步驟:
- 設定 CDN 私有源:禁止所有人直接訪問你的 S3 或後端儲存。
- 算出一組 Hash:當你的網頁要顯示圖片時,後端會根據
檔案路徑 + 當前時間 + 金鑰 (Secret Key)算出一個雜湊值。 - 產出連結:生成的連結會長這樣:
https://cdn.com/cat.jpg?token=a1b2c3&expires=1672531200。 - 邊緣驗證:CDN 的邊緣節點會檢查 Token 對不對。如果有人直接複製這個網址,幾分鐘後 token 過期了,連結就失效。
三、 全球加速:CDN 的運作機制
為了讓全世界的使用者都能快速下載檔案,我們需要 CDN。
- 邊緣節點 (Edge Location):CDN 在全球各地都有伺服器。
- 快取命中 (Cache Hit):當第一個台灣的使用者請求圖片時,CDN 會從你的伺服器 (Origin) 抓取並存一份在台灣節點。
- 後續請求:之後所有來自台灣的使用者,都會直接從台灣節點下載,不用再去你的伺服器,速度提升數十倍。
四、 效能優化:提高命中率 (HIT Rate)
CDN 的重點在於「減少回源次數」。
- 善用版本號:當你更新了使用者的頭像,不要用同一個檔名覆蓋(如
avatar.jpg),而是使用avatar_v2.jpg。 - 設定 TTL:為你的檔案設定合理的 Cache-Control Header,讓 CDN 知道這份檔案可以快取多久。
總結
檔案系統的最後一哩路在於「傳輸品質」:
- 防止盜連:Referer 是基礎,Signed URL 是進階。
- CDN 加速:讓地理距離不再是效能瓶頸。
- 優化快取:提高命中率,既省錢又增快。
下一篇,也是本系列的完結篇:文件預覽解決方案。
️ 進階挑戰
如果你設定了 CDN 簽章連結,但你又希望能讓搜尋引擎(如 Google 圖片搜尋)索引你的圖片,這時你的安全性政策該如何調整?
延伸閱讀與資源
- Cloudflare: What is Hotlinking?
- KeyCDN: CDN Cache Hit Ratio
← 上一章:檔案生命週期管理 | 返回專案首頁 | [下一章:文件預覽解決方案 (Series Finale)](./13-文件預覽解決方案 (Series Finale).md)