同源政策是針對用戶端網路應用程式 (例如網路瀏覽器) 強制執行的安全性政策,可防止不同來源的資源產生互動。這項安全措施雖能有效防止惡意行為,卻也阻止已知來源之間進行合法的互動。舉例來說,在 example.appspot.com
代管網頁的指令碼可能需要使用儲存在 example.storage.googleapis.com
的 Cloud Storage bucket 中的資源。然而,由於瀏覽器將兩者視為來源不同的資源,因此不會允許來自 example.appspot.com
的指令碼擷取來自 example.storage.googleapis.com
的資源。
全球資訊網協會 (W3C) 為克服這項限制,開發跨源資源共享 (CORS) 規格。Cloud Storage 可讓您將值區設為支援 CORS 這個規格。延續上一個範例,您可以設定 example.storage.googleapis.com
值區,讓瀏覽器能夠與來自 example.appspot.com
的指令碼共用其資源。
如要進一步瞭解 CORS 設定元件,請參閱「設定值區 CORS」。
CORS 的運作方式
CORS 要求有兩種類型:簡易和預檢。系統可直接啟動簡易要求,預檢要求必須向伺服器傳送初步的「預檢」要求來取得權限,接著系統才會繼續處理主要要求。如果出現以下任何一個情況,則該要求為預檢要求:
- 要求使用
GET
、HEAD
或POST
以外的方法。 - 要求使用
POST
方法,但Content-Type
不是text/plain
、application/x-www-form-urlencoded
或multipart/form-data
。 - 要求設定自訂標頭。例如
X-PINGOTHER
。
瀏覽器向 Cloud Storage 發出簡易要求時,流程會如下進行:
瀏覽器會將
Origin
標頭新增至要求。Origin
標頭包含尋求共用 Cloud Storage 值區資源的資源來源,例如Origin:https://www.example.appspot.com
。Cloud Storage 會將要求的 HTTP 方法和
Origin
標頭值與目標值區 CORS 設定中的方法和來源資訊進行比較,以查看其是否相符。如果相符,Cloud Storage 就會在回應中加入Access-Control-Allow-Origin
標頭。Access-Control-Allow-Origin
標頭包含來自初始要求的Origin
標頭值。瀏覽器收到回應並檢查
Access-Control-Allow-Origin
值是否符合原始要求中指定的網域。如果相符,要求就會成功。如果不相符,或是回應中沒有Access-Control-Allow-Origin
標頭,則要求失敗。
預檢要求會先執行下列步驟。如果成功,則會按照與簡易步驟相同的程序繼續執行:
瀏覽器傳送
OPTIONS
要求,其中包含主要要求的Requested Method
和Requested Headers
。Cloud Storage 會以目標資源允許的 HTTP 方法和標頭值回應。如果預檢要求的任何方法或標頭值並非目標資源允許的方法和標頭,則要求會失敗,系統也不會傳送主要要求。
以上為 CORS 的簡要說明。如需更加完整的說明資訊,請參閱 Fetch 規格。
Cloud Storage CORS 支援
Cloud Storage 僅允許您設定 bucket 層級的 CORS 設定。您可以使用各種工具為 bucket 設定 CORS 設定,但不同的 Cloud Storage 端點處理 CORS 要求的方式不同:
無論值區設定為何,JSON API 端點一律允許 CORS 要求,並在 CORS 回應標頭中傳回預設值。
XML API 端點只會根據值區設定允許 CORS 要求,並在回應中傳回該設定的特定 CORS 標頭值。
經過身分驗證的瀏覽器下載端點
storage.cloud.google.com
不允許 CORS 要求。請注意,控制台會為每個物件的公開網址連結提供這個端點。 Google Cloud
您可以透過下列任一個 XML API 要求網址,從 Cloud Storage 取得包含 CORS 標頭的回應:
storage.googleapis.com/BUCKET_NAME
BUCKET_NAME.storage.googleapis.com
如需瞭解 XML API 要求網址,請參閱要求端點。
CORS 設定的元件
使用 XML API 時,您在值區的 CORS 設定中設定的值,會決定 Cloud Storage 在 HTTP 回應中傳回的 CORS 標頭。使用 JSON API 時,Cloud Storage 不會評估值區的設定,而是傳回預設標頭值。
下表說明 CORS 設定中的欄位,以及 XML 和 JSON API 的回應行為。如要瞭解如何使用這些欄位,請參閱 CORS 設定範例。
欄位1 | 說明 | XML API 回應行為 | JSON API 回應行為 |
---|---|---|---|
origin |
指定要允許與這個 Cloud Storage 值區進行跨源資源共享的來源。例如 https://origin1.example.com 。 |
如果瀏覽器要求中的來源與 CORS 設定中的來源相符,Cloud Storage 會向瀏覽器傳回 Access-Control-Allow-Origin 。如果沒有相符的來源,Cloud Storage 就不會在回應中加入 Access-Control-Allow-Origin 。您可以提供萬用字元值,授予所有來源的存取權:<Origin>*</Origin> 。 |
Cloud Storage 會傳回設為要求來源的 Access-Control-Allow-Origin 標頭。 |
method |
指定要允許跨源資源共享的 HTTP 方法,以存取這個 Cloud Storage 值區。如果預檢要求成功,系統會在回應的 由於 |
Cloud Storage 支援下列方法: Cloud Storage 會根據值區的 CORS 設定,檢查瀏覽器在 |
Cloud Storage 會針對下列方法傳回設為 Access-Control-Allow-Methods 的標頭:DELETE 、GET 、HEAD 、PATCH 、POST 、PUT 。 |
responseHeader |
指定要允許哪些標頭,以便與這個 Cloud Storage 值區進行跨源資源共享。如果預檢要求成功,系統會在回應的 Access-Control-Allow-Headers 標頭中傳回值。 |
對於預檢要求,Cloud Storage 會根據值區的 CORS 設定,檢查瀏覽器在 Access-Control-Request-Headers 標頭中傳送的標頭。如果沒有相符項目,Cloud Storage 就不會傳回 CORS 回應標頭。 |
Cloud Storage 會傳回 Access-Control-Allow-Headers 標頭,並將其設為等於 Access-Control-Request-Headers 標頭指定的值。 |
maxAgeSeconds (選填) |
指定瀏覽器可發出要求的時間長度 (以秒為單位),超過這個時間就必須重複預檢要求。這也稱為快取到期時間。這個值會在預檢要求的回應中,以 Access-Control-Max-Age 標頭的形式傳回。例如,3600 會將快取到期時間設為 1 小時。 |
Cloud Storage 會傳回 Access-Control-Max-Age 標頭,其中包含指定的快取到期時間。如果省略這個欄位,Cloud Storage 會傳回預設值 3600 。 |
Cloud Storage 會傳回 Access-Control-Max-Age 標頭,預設值為 3600 。 |
1「欄位」欄中記錄的名稱專屬於 JSON API。使用 XML API 設定 CORS 配置時,請採用XML 專屬格式。
指定多個來源、方法或標頭
如要瞭解如何在 CORS 設定中設定多個來源、方法或標頭,請參閱下列清單:
使用 JSON API 時,您可以透過以半形逗號分隔的陣列,指定多個來源、方法或標頭。例如
"method": ["GET", "PUT"]
。使用 XML API 時,您可以透過個別元素指定多個來源、方法或標頭。例如:
<Methods> <Method>PUT</Method> <Method>GET</Method> </Methods>
如要允許從任何來源提出要求,請將來源設為
*
。 例如,JSON API 中的"origin": ["*"]
或 XML API 中的<Origin>*</Origin>
。雖然這個來源有助於測試設定,但在大多數情況下,您會想限制要求來源,避免資源遭到濫用。
其他事項
下表說明使用憑證或存取控制標頭提出要求時的注意事項:
屬性或標題 | 說明 | XML API 回應行為 | JSON API 回應行為 |
---|---|---|---|
憑證 | Cookie、授權標頭或 TLS 用戶端憑證。 | Cloud Storage 絕不會傳回 Access-Control-Allow-Credentials 標頭。XML API 不支援 CORS 憑證。 |
如果是簡單要求,CORS 要求獲准後, 如果是預檢要求,如果 |
公開標頭 | 對於預檢要求,Access-Control-Request-Headers 要求標頭會指出未來的 CORS 要求可能包含哪些標頭。伺服器的回應中會包含 Access-Control-Expose-Headers 回應標頭,向用戶端指出可公開哪些標頭。 |
如果是簡易要求,Access-Control-Expose-Headers 會列出 CORS 設定中的回應標頭值。 |
如果是簡易要求,如果 Access-Control-Request-Headers 中指定的值屬於常見 HTTP 標頭清單,Access-Control-Expose-Headers 就會傳回這些值。 |
允許儲存空間存取外部資源
有時您可能會想允許託管在 Cloud Storage 的指令碼,存取由 Cloud Storage 以外的網站所代管的靜態資源。在這種情況下,網站會提供 CORS 標頭,以允許存取 storage.googleapis.com
上的內容。
最佳做法是為這類資料存取提供專屬的特定值區。以防您的網站在無意中將靜態資源過度公開給所有的 storage.googleapis.com
。舉例來說,如果您想將名為 mybucket
的值區專用於資料存取,網站應提供 CORS 標頭 Access-Control-Allow-Origin: https://mybucket.storage.googleapis.com
,而不是 Access-Control-Allow-Origin: https://storage.googleapis.com
。
用戶端 CORS 支援
大多數瀏覽器都是使用 XMLHttpRequest
物件來提出跨網域要求。XMLHttpRequest
會負責插入正確的標頭,並處理 CORS 和伺服器之間的互動。您不需要新增任何程式碼,即可利用 Cloud Storage 值區提供的 CORS 支援服務。
後續步驟
- 瞭解如何為 bucket 啟用 CORS。
- 請參閱 CORS 設定範例,包括移除值區 CORS 設定的範例。