跨源資源共享 (CORS)

設定 設定範例

同源政策是針對用戶端網路應用程式 (例如網路瀏覽器) 強制執行的安全性政策,可防止不同來源的資源產生互動。這項安全措施雖能有效防止惡意行為,卻也阻止已知來源之間進行合法的互動。舉例來說,在 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 要求有兩種類型:簡易和預檢。系統可直接啟動簡易要求預檢要求必須向伺服器傳送初步的「預檢」要求來取得權限,接著系統才會繼續處理主要要求。如果出現以下任何一個情況,則該要求為預檢要求:

  • 要求使用 GETHEADPOST 以外的方法。
  • 要求使用 POST 方法,但 Content-Type 不是 text/plainapplication/x-www-form-urlencodedmultipart/form-data
  • 要求設定自訂標頭。例如 X-PINGOTHER

瀏覽器向 Cloud Storage 發出簡易要求時,流程會如下進行:

  1. 瀏覽器會將 Origin 標頭新增至要求。Origin 標頭包含尋求共用 Cloud Storage 值區資源的資源來源,例如 Origin:https://www.example.appspot.com

  2. Cloud Storage 會將要求的 HTTP 方法和 Origin 標頭值與目標值區 CORS 設定中的方法來源資訊進行比較,以查看其是否相符。如果相符,Cloud Storage 就會在回應中加入 Access-Control-Allow-Origin 標頭。Access-Control-Allow-Origin 標頭包含來自初始要求的 Origin 標頭值。

  3. 瀏覽器收到回應並檢查 Access-Control-Allow-Origin 值是否符合原始要求中指定的網域。如果相符,要求就會成功。如果不相符,或是回應中沒有 Access-Control-Allow-Origin 標頭,則要求失敗。

預檢要求會先執行下列步驟。如果成功,則會按照與簡易步驟相同的程序繼續執行:

  1. 瀏覽器傳送 OPTIONS 要求,其中包含主要要求的 Requested MethodRequested Headers

  2. 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 值區。如果預檢要求成功,系統會在回應的 Access-Control-Allow-Methods 標頭中傳回這個值。

由於 OPTIONS 是瀏覽器用來啟動預檢要求的標準方法,因此您不應在 CORS 設定中指定 OPTIONS

Cloud Storage 支援下列方法:DELETE, GETHEADPOST, PUT

Cloud Storage 會根據值區的 CORS 設定,檢查瀏覽器在 Access-Control-Request-Methods 標頭中傳送的方法。如果沒有相符的來源,Cloud Storage 會傳回 200 回應碼,且不含 CORS 回應標頭。

Cloud Storage 會針對下列方法傳回設為 Access-Control-Allow-Methods 的標頭:DELETEGETHEADPATCHPOSTPUT
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-Allow-Credentials 標頭會設為 true。

如果是預檢要求,如果 Access-Control-Request-Method 為空,Cloud Storage 會將 Access-Control-Allow-Credentials 設為 true,並以 404 - Not Found 拒絕要求。

公開標頭 對於預檢要求,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 支援服務。

後續步驟