數據安全性是云存儲服務的重中之重。云存儲的安全機制需要考慮主要以下幾個因素:
1. 如何判斷該請求方合法,且對目標空間有相應的訪問權限?
2. 因為服務的訪問協議同時支持HTTP和HTTPS,服務端需要判斷收到的請求是否經過篡改。
3. 相比上傳新資源,覆蓋文件或刪除已有資源擁有更高的風險。因此對上傳或修改動作,需要確認請求方是否擁有修改或刪除的權限。
在使用七牛云存儲服務的過程中,需要考慮安全機制的場景主要有如下幾種:
1. 上傳資源;
2. 訪問資源;
3. 管理和修改資源;
這三個場景需要考慮不同的安全因素,因此七牛針對性的提供了三種安全機制:上傳憑證、下載憑證和管理憑證。
因為憑證的生成需要用到[SecretKey](http://developer.qiniu.com/docs/v6/api/overview/security.html#aksk),因此該生成動作不應在不受信任的環境中進行。需要注意的是,開發者絕不能將密鑰包含在分發給最終用戶的程序中,無論是包含在配置文件中還是二進制文件中都會帶來非常大的密鑰泄漏風險。
推薦的模型如下所示:

## 密鑰(AccessKey/SecretKey)
密鑰用于以上幾種憑證的生成。以SecretKey為參數,配合適當的簽名算法,可以得到原始信息的數字簽名,防止內容在傳遞過程中被偽造或篡改。
密鑰通常為成對創建和使用,包含一個AccessKey和一個SecretKey。其中AccessKey會在傳輸中包含,而用戶必須保管好SecretKey不在網絡上傳輸以防止被竊取。若SecretKey被惡意第三方竊取,可能導致非常嚴重的數據泄漏風險。因此,如發現SecretKey被非法使用,管理員應第一時間在[管理平臺](https://portal.qiniu.com/)上更換密鑰。
在具體描述各種憑證的詳細生成過程中我們會看到AccessKey和SecretKey是如何被使用的。
## 上傳憑證(UploadToken)
客戶端上傳前需要先獲取從服務端頒發的上傳憑證,并在上傳資源時將上傳憑證包含為請求內容的一部分。不帶憑證或帶非法憑證的請求將返回HTTP錯誤碼401,代表認證失敗。
生成上傳憑證時需要指定以下要素:
1. 權限,指定上傳的目標空間或允許覆蓋的指定資源;
2. 憑證有效期。是一個符合[UNIX Epoch時間戳](http://en.wikipedia.org/wiki/Unix_Time)規范的數值,單位為**秒**;
> 因為時間戳的創建和驗證在不同的服務端進行(在業務服務器創建,在云存儲服務器驗證),因此開發者的業務服務器需要盡可能校準時間,否則可能出現憑證剛創建就過期等各種奇怪的問題。
3. 可選擇設置的最終用戶標識ID。這是為了讓業務服務器在收到結果回調時能夠識別產生該請求的最終用戶信息;
4. 可選擇設置的[結果返回方式](http://developer.qiniu.com/docs/v6/api/overview/up/response/index.html)和[數據預處理指令](http://developer.qiniu.com/docs/v6/api/overview/up/response/persistent-op.html);
我們使用一個[上傳策略(PutPolicy)結構](http://developer.qiniu.com/docs/v6/api/reference/security/put-policy.html)來保存和傳遞這些設置。關于上傳策略和上傳憑證的生成細節,請查看[上傳憑證規格](http://developer.qiniu.com/docs/v6/api/reference/security/upload-token.html)。關于上傳憑證的具體使用方法,請參見[資源上傳](http://developer.qiniu.com/docs/v6/api/overview/up/index.html)。
## 下載憑證(DownloadToken)
下載私有資源的請求需要帶一個合法的下載憑證。不帶憑證或帶非法憑證的請求將返回HTTP錯誤碼401,代表認證失敗。
與上傳憑證相比,下載憑證的作用比較簡單:
1. 保證請求發起者擁有對目標空間的訪問權限;
2. 保證服務端收到的下載請求內容未經中途篡改,具體包括目標資源的URI和該訪問請求的有效期信息均應未受到篡改;
關于下載憑證的生成細節,請查看[下載憑證規格](http://developer.qiniu.com/docs/v6/api/reference/security/download-token.html)。關于下載憑證的具體使用方法,請參見[私有資源下載](http://developer.qiniu.com/docs/v6/api/overview/dn/security.html#download-private-resource)。
## 防盜鏈
下載還有一種常見的場景,即公開資源的防盜鏈,比如禁止特定來源域名的訪問,禁止非瀏覽器發起的訪問等。
我們可以通過HTTP協議支持的Referer機制(參見[HTTP Referer](http://en.wikipedia.org/wiki/Referrer))來進行相應的來源識別和管理。
防盜鏈是一個系統設置,不影響開發工作。如發現有盜鏈情況,開發者可在[開發者平臺](https://portal.qiniu.com/)的空間設置頁面進行相應的設置。
## 管理憑證(AccessToken)
在管理現有資源時(如查看資源元數據、刪除或移動資源等)通常需要帶一個合法的管理憑證。不帶憑證或帶非法憑證的管理請求將返回HTTP錯誤碼401,代表認證失敗。
管理憑證的作用與下載憑證比較類似:
1. 保證請求發起者擁有對目標空間的管理權限;
2. 保證服務端收到的管理請求內容未經中途篡改,具體包括代表管理動作的URI和該管理動作的參數信息均應未受到篡改;
關于管理憑證的生成細節,請查看[管理憑證規格](http://developer.qiniu.com/docs/v6/api/reference/security/access-token.html)。關于管理憑證的具體使用方法,請參見[資源管理](http://developer.qiniu.com/docs/v6/api/overview/rs/security.html)。
## 跨域訪問
出于安全的考慮,Web 瀏覽器從很早之前就定下“同域安全策略”的標準,默認情況下同一域名下的頁面只能向同域(包括 CNAME 域名、端口)下的 URL 發送所有類型的 HTTP 請求。而向不同域的地址發送非 GET 請求時,默認情況下只能返回同域安全策略錯誤。
對此,在發起上傳或下載請求的時候,七牛的服務會返回相應的支持跨域的 Header:
### 上傳(`upload.qiniu.com`)
~~~
Access-Control-Allow-Headers: X-File-Name, X-File-Type, X-File-Size
Access-Control-Allow-Methods: OPTIONS, HEAD, POST
Access-Control-Allow-Origin: *
~~~
### 下載(`<bucket>.qiniudn.com`)
~~~
Access-Control-Allow-Origin: *
~~~