基于架構合理性和保護數據安全的出發點,我們對如何基于七牛云存儲服務開發提供一些設計和編碼建議。希望開發者能夠盡可能的在使用七牛云存儲服務之前先詳細閱讀這些建議,并盡可能的符合這些原則,以免造成沒必要的時間浪費甚至造成數據安全風險。
## 基本結構
基于七牛云存儲服務構建的應用建議使用如下的基本架構:

從該結構圖,我們可以看到以下這幾個關鍵組件:
1. 七牛云存儲服務
七牛云存儲服務以KV(即Key-Value,參見[鍵值對](http://developer.qiniu.com/docs/v6/api/overview/concepts.html#key-value))方式提供的非結構化資源存儲服務。向業務服務器提供資源管理服務,向客戶端提供資源上傳和下載服務。
2. 業務服務器
開發者需要自行管理和維護的一組業務服務器,負責提供至少這幾個基本功能:
1. 生成各種安全憑證(參見[安全機制](security))。安全憑證的創建不能在分發給最終用戶的客戶端上進行,否則會產生極大的安全風險。
2. 使用關系型數據庫(比如MySQL)管理用戶帳號信息。最終用戶信息的管理并非云存儲服務的功能范疇。云存儲服務只管理企業賬號。
3. 使用數據庫管理資源元數據和資源之間的映射關系。
4. 響應客戶端的業務請求,執行業務流程并返回執行結果。
3. 客戶端
客戶端通常同時是資源的生產方和消費方。客戶端在展示內容時,通常需要先從業務服務器獲取資源的元信息,并得到必要的下載憑證,然后使用下載憑證從七牛云存儲服務獲取待展示的資源內容,從而實現一個完整的內容展示過程。
## 業務流程
關鍵的幾個交互過程:
1. 上傳
客戶端在上傳資源到云存儲之前要先從業務服務器獲取一個有效的上傳憑證,因此需要先后和兩個服務端打交道。

如果有設置回調,則上傳完成時七牛云存儲會自動回調到指定的業務服務器。

2. 下載
公開資源因為不需要對應的下載憑證即可訪問,客戶端可以直接從云存儲下載對應資源。私有資源因為需要對應的下載憑證,因此必須先和業務服務器打交道。
按照實際的使用場景,客戶端對于內容的展示非常類似于一個動態網頁的生成過程,因此無論該頁面內容是公開還是私有,均需要從業務服務器獲取該展示頁面的動態布局信息。所以通常顯示過程也是需要先后和業務服務器及云存儲服務打交道。
3. 資源管理
為了防止安全漏洞,資源管理動作只應在業務服務器端進行。如果允許客戶端進行資源管理,即使將管理憑證的生成動作放到業務服務器端進行,仍然很容易被第三方截獲請求全文,從而導致重放攻擊的風險。
## 關鍵原則
這個模型的關鍵要點如下:
1. 整個架構中需要一個業務服務器的組件;
2. 無論如何,AccessKey/SecretKey均不得包含在客戶端的分發包中,無論是二進制代碼中、配置文件中,還是網頁中;
3. SecretKey不得在任何場景中在公網上傳輸,更不得傳輸到客戶端;
4. 業務服務器端應維持一個數據庫,用于管理資源的元數據;
5. 業務服務器端應維持一個最終用戶的賬號信息數據庫,因為七牛并不負責管理最終用戶信息;
6. 原則上客戶端和云存儲的交互只應是上傳和下載,不應使用任何其他的API;