CORSの作業

Cross-Origin Resource Sharing (CORS)は、JavaScriptがかわりにリクエストを行って別のドメイン内のリソースにアクセスできるようにするヘッダーベースのプロトコルです。CORSを有効にし、アプリケーション・ゲートウェイまたはIAMアイデンティティ・ドメインで実行されているCloud GateのCORS設定を強制するようにCloud Gateを構成します。

CORSは、不正なJavaScript (広告などを使用して攻撃者がサイトに配置)がユーザーのかわりにAJAXリクエストを行わないようにするのに役立ちます。不正なAJAXリクエストは、銀行からお金を引き出すか、オンラインショッピングサイトであなたの名前で購入することができます。これらのサイトとのアクティブなセッションが現在ある場合、これらのリクエストは成功する可能性があります。CORSは、サーバーが正しいレスポンス・ヘッダー・セットで応答しない場合、ブラウザはJavaScriptがレスポンスを表示(またはアクセス)できないことを規定しています。

JavaScriptが別のHTTPリクエストを試行すると、CORSリクエストがトリガーされます。
  • ドメイン- たとえば、site1.oraclecloud.comoracle.comをコールします
  • サブドメイン- たとえば、site1.oraclecloud.comsite7.oraclecloud.comをコールします
  • ポート- たとえば、site1.oraclecloud.comsite1.oraclecloud.com:3030をコールします
  • プロトコル- たとえば、https://site1.oraclecloud.comhttp://site1.oraclecloud.comをコールします

CORS要求には、Simple CORS要求またはPreflight CORS要求の2つの形式があります。

簡易CORS要求

別のドメイン内のリソースに対するJavaScriptリクエストに次の特性がある場合、単純なCORSリクエストが実行されます。
  • 方法は次のとおりです。
    • GET
    • POST
    • HEAD
  • Simple CORSリクエストに手動で追加できるHTTPヘッダーは次のとおりです。
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type
    • DPR
    • Downlink
    • Save-Data
    • Viewport-Width
    • Width
  • Content-Typeが設定されている場合は、次のようにする必要があります。
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

プリフライトCORS要求

JavaScriptリクエストがSimple CORSリクエストの特性を満たしていない場合、Preflight CORSリクエストはもう一方のドメインにあるリソースに送信されます。

Preflight CORS Requestは、プリフライト・リクエスト・フローがトリガーされるデータを含むリクエストに特定のHTTPヘッダーを含めることで、実際のリクエストをそのリソースに送信できるかどうかをテストします。つまり、JavaScript HTTPリクエストで、Preflight CORSリクエストを必要とするいくつかのメソッド/ヘッダーを指定した場合、Preflight CORSリクエストは、リソースにこれらのメソッド/ヘッダーを問い合せて、リソースがそのようなクロスドメイン・リクエストを受け入れるかどうかを確認します。

Cloud Gate CORS構成プロパティおよび属性

次の表に、Cloud Gate CORS構成のプロパティおよび属性を示します。
CORSプロパティ 説明
cloudGateCorsEnabled

テナンシのCloud Gate CORSサポートをオンにするブール・プロパティ。この設定は、trueに構成する必要があります。

cloudGateCorsSettingscloudGateCorsEnabledフラグを有効にすると、テナントおよびアイデンティティ・ドメインの機能がアクティブ化され、cloudGateCorsAllowedOriginsで定義された許可されたオリジン・リストおよび許可されたオリジンのグローバル・リストが強制されます。

デフォルトはfalseです。

ベスト・プラクティスcloudGateCorsAllowedOriginsを同時に構成します。プロパティが空のままの場合、すべてのCORSリクエストは失敗します。

cloudGateCorsAllowedOrigins

プロパティは、許可されるCORSオリジン・リストを含む文字列配列です。

デフォルトは空の配列です。

各CORSリクエストは、オリジン・リクエスト・ヘッダーにソースまたはオリジンを指定します。オリジン・ヘッダーの値がこのリストと一致します。

オリジンが一致した場合、Cloud Gateは適切なCORSヘッダーをそのレスポンスに追加します。

オリジンが一致しない場合、Cloud GateはCORSレスポンス・ヘッダーを返さず、ブラウザによってレスポンスが拒否されます。

入力テンプレートで許可されるCORS値:
  • エントリ: * | <PROTOCOL>"://"<HOST><PORT>
  • <PROTOCOL>: * | http | https
  • <HOST>: [<DOMAIN>.]<DOMAIN>
  • <DOMAIN>: < any alphanumerical character, * and - >
    • <DOMAIN>は'-'で開始または終了できません。
    • <DOMAIN>にはワイルドカードを使用できます。ワイルドカードにはドメイン全体を含める必要があります。たとえば、www.*.comは有効ですが、www.*racle.comは有効ではありません。
    • 参照としてhttps://tools.ietf.org/html/rfc1123を使用します。
  • <PORT>: <EMPTY> | ":" <PORT_VALUE>
  • <PORT_VALUE>: * | <numerical characters><PORT_VALUE>は1から65535の範囲内である必要があります。
例:
  • すべてに一致: *
  • 完全一致: https://www.acme.com, https://www.acme.com:4443
  • 正確なホスト/プロトコル、任意のポート: https://www.google.com:*
  • 正確なホスト/ポート、任意のプロトコル(HTTPまたはHTTPS): *://www.acme.com, *://www.acme.com:8080
  • サブドメイン、正確なプロトコル、ポートなし: https://*.oraclecloud.com
  • 任意のドメイン、正確なプロトコル、ポートなし: https://*
cloudGateCorsAllowNullOrigin

ブラウザがnullのオリジンを送信するシナリオをサポートするブール・プロパティ。この設定は、trueに構成する必要があります。

デフォルトはfalseです。

CORSリクエストがユーザーのコンピュータ上のファイルからのものである場合、またはCORSリクエストに応答してサーバーが別のサーバーにリダイレクトされる場合、nullのオリジンが送信されます。ブラウザは、オリジンが「終了済」とみなされると、「null」のオリジンを渡します。セキュリティを強化するために、デフォルトでは「null」のオリジンは許可されません。

nullの起点は有効です。アイデンティティ・ドメインのOpenID Connect (OIDC)ブラウザ・フロー・ログインを利用するアプリケーションでは、Cloud Gateノードに送信される「null」のオリジンが表示されます。Cloud Gateがアイデンティティ・ドメインにリダイレクトすると、OIDCブラウザ・ログインを開始するエンドポイントが認可され、アイデンティティ・ドメインがリクエストをCloud Gateにリダイレクトすると、オリジンがnullになります。

cloudGateCorsMaxAge

クライアント(ブラウザ)がPreflight CORSレスポンスをキャッシュできる秒数を指定する整数。

cloudGateCorsExposedHeaders

このプロパティは、Access-Control-Expose-Headersレスポンス・ヘッダーに追加できるレスポンス・ヘッダーをリストする文字列配列です。

デフォルトは空の配列です。

アイデンティティ・ドメインでのCloud Gate CORS設定の構成

Cloud Gateでは、Cross-Origin Resource Sharing (CORS)サポート用にアイデンティティ・ドメインで次の設定を構成する必要があります。

構成を開始する前に、Cloud Gateの正しいバージョンがあることを確認してください。以前のバージョンのCloud Gateモジュールでは、CORSはサポートされませんでした。CORSをサポートするために、Protected Applicationsに残されました。Web層ポリシー・ドキュメントのisCorsAllowed設定がtrueに構成されている場合、Cloud Gateでは保護アプリケーションへのCORSリクエストのプリフライトが許可されます。
ノート

必要なCloud Gateの最小バージョンは21.1.2です。

/admin/v1/Settings/Settingsエンドポイントを使用して、CORS設定を構成します。リクエストはpatch操作です。詳細は、「設定の更新」を参照してください。

  1. このサンプル・ペイロードをテンプレートとして使用して、リクエスト本文を作成します。ペイロードをファイル(/tmp/cors-settings.jsonなど)に保存します。デプロイメントの詳細を使用してファイルを編集します。
    サンプル・ペイロード
       {
       "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
       "Operations": [{
        "op": "replace",
        "path": "cloudGateCorsSettings",
        "value": {
        "cloudGateCorsEnabled": true,
        "cloudGateCorsAllowNullOrigin": true,
        "cloudGateCorsAllowedOrigins": [ "https://app.my-server.com:8080", "https://*:*" ],
        "cloudGateCorsMaxAge: 60,
        "cloudGateCorsExposedHeaders": [ "x-custom-header", "x-my-app-header" ]
        }
        }]
       }
    cURLリクエストの例。
       # $AT is a previously generated Admin Access Token.
       # https://<IdentityDomainID>.identity.oraclecloud.com is an example URL 
       $ curl -X PATCH -H "Content-Type: application/scim+json" -H "Accept: application/json" -H "Authorization: Bearer $AT" "https://<domainURL>/admin/v1/Settings/Settings" --data @"/tmp/cors-settings.json"
  2. CORSサポートを有効にするには、次のいずれかを実行します。
    • NGINXサーバーを手動で再起動またはリロードします。
    • Cloud Gate CORS設定キャッシュが期限切れになるまで待機します。デフォルトでは、これには最大1時間かかることがあります。
  3. 次に、CORSリクエストに応じてCloud Gateが返すCORSレスポンス・ヘッダーを示します。
    • Access-Control-Allow-Origin
    • Access-Control-Allow-Methods
    • Access-Control-Allow-Headers
    • Access-Control-Allow-Credentials
    • Access-Control-Max-Age
    • Access-Control-Expose-Headers

簡易およびプリフライトCORS要求ワークフロー

Cross-Origin Resource Sharing (CORS)リクエスト・ワークフローの概要。

簡易CORS要求ワークフロー

  1. リクエストは、オリジン・リクエスト・ヘッダーの存在によってCORSリクエストとして識別されます。
  2. 必要に応じて(キャッシュ失効など)、Cloud Gate CORS設定がIAMのアイデンティティ・ドメインからダウンロードされます。
  3. Cloud Gateはリクエストを処理します。リクエストを拒否するか、アップストリーム・アプリケーション・サーバーまでリクエストを許可します。
  4. レスポンスが返される前に、Cloud Gateは、Cloud Gate CORS設定で定義されたCORSを強制します。
    1. Cloud Gateでは、常に、変更レスポンス・ヘッダーがレスポンスの一部であり、「元の」ヘッダーが含まれていることが保証されます。これは、CORS以外のリクエストでも発生します。
    2. cloudGateCorsEnabledfalseの場合、処理はここで終了します。レスポンスはそのまま返されます。
    3. Cloud Gateは、「許可されたオリジン」の構成済リストを使用して、オリジンが許可されていることを確認します。

      オリジンが許可されていない場合、サポートされているすべてのCORSレスポンス・ヘッダーがレスポンスから取り除かれ、処理が終了します。

    4. Access-Control-Allow-Originレスポンス・ヘッダーが追加され、オリジン・リクエスト・ヘッダーの値に構成されます。
    5. Access-Control-Allow-Credentialsレスポンス・ヘッダーが追加され、trueに構成されます。
    6. Access-Control-Expose-Headersは、cloudGateCorsExposedHeaders値と、レスポンスで返されるヘッダーのリストとの交差で構成されます。
    7. Access-Control-Allow-MethodsAccess-Control-Allow-HeadersおよびAccess-Control-Max-Age Response Headersがレスポンスから削除されます。
  5. Cloud Gateはレスポンスを返します。
ノート

Cloud Gateは、アップストリーム・アプリケーション・サーバーによって設定されている場合、Access-Control-Allow-OriginおよびAccess-Control-Allow-Credentials Responseヘッダーを上書きします。

CORS要求ワークフローのプリフライト

  1. リクエストは、オリジン・リクエスト・ヘッダーの存在によってCORSリクエストとして識別されます。
  2. 必要に応じて(キャッシュ失効など)、Cloud Gate CORS設定がIAMのアイデンティティ・ドメインからダウンロードされます。
  3. リクエストは、オリジン・リクエスト・ヘッダーに加えて、OPTIONSメソッドおよびAccess-Control-Request-Methodリクエスト・ヘッダーによってPreflight CORSリクエストとして識別されます。
  4. cloudGateCorsEnabledtrueの場合、アプリケーションはCORSを実装できるように、リクエストはアップストリーム・アプリケーション・サーバーを通過できます。

    cloudGateCorsEnabledfalseの場合、古いisCorsAllowed Web層ポリシー設定は引き続き適用されます(リクエスト処理の後半)。

  5. Cloud Gateからレスポンスが返される前に、CORSはCloud Gate CORS設定で定義されたとおりに強制されます。
    1. Cloud Gateでは、常に、変更レスポンス・ヘッダーがレスポンスの一部であり、「元の」ヘッダーが含まれていることが保証されます。これは、nonCORSリクエストでも発生します。
    2. cloudGateCorsEnabledfalseの場合、処理はここで終了します。レスポンスはそのまま返されます。
    3. Cloud Gateは、「許可されたオリジン」の構成済リストを使用して、オリジンが許可されていることを確認します。

      オリジンが許可されていない場合、サポートされているすべてのCORSレスポンス・ヘッダーがレスポンスから取り除かれ、処理が終了します。

    4. Access-Control-Allow-Originレスポンス・ヘッダーが追加され、オリジン・リクエスト・ヘッダーの値に構成されます。
    5. Access-Control-Allow-Credentialsレスポンス・ヘッダーが追加され、trueに構成されます。
    6. アップストリーム・アプリケーション・サーバーがAccess-Control-Allow-Methodsレスポンス・ヘッダーを追加しなかった場合、Cloud Gateは値を次のように構成します。
      • 「レスポンスの許可」ヘッダーがレスポンスに含まれている場合、Cloud Gateはその値を使用します。
      • Access-Control-Request-Methodリクエスト・ヘッダーがリクエストで見つかった場合、Cloud Gateはその値を使用します。
    7. アップストリーム・アプリケーション・サーバーがAccess-Control-Allow-Headersレスポンス・ヘッダーを追加しなかった場合、Cloud GateはリクエストにAccess-Control-Request-Headersリクエスト・ヘッダーの値(存在する場合)を使用します。
    8. cloudGateCorsMaxAgeがゼロより大きい値に構成されている場合、Access-Control-Max-Ageレスポンス・ヘッダーが追加され、最大経過時間値に構成されます。cloudGateCorsMaxAge値が0以下の場合、Access-Control-Max-Ageレスポンス・ヘッダーに対するアクションは実行されません。
    9. Access-Control-Expose-Headersレスポンス・ヘッダーが削除されます。Preflight Responsesには適用されません。
  6. Cloud Gateはレスポンスを返します。