同源政策是針對用戶端網路應用程式 (例如網路瀏覽器) 強制執行的安全性政策,可防止不同來源的資源產生互動。這項安全措施雖能有效防止惡意行為,卻也阻止已知來源之間進行合法的互動。舉例來說,在 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 設定的範例。