1.7. CORS
通常、HTTP クライアントは、異なるドメイン間でリクエストを発行することはできません。
たとえば、Kafka クラスターとともにデプロイした Kafka Bridge が、http://my-bridge.io
ドメインを使用してアクセスできるとします。HTTP クライアントは URL を使用して Kafka Bridge と対話し、Kafka クラスターを介してメッセージを交換できます。ただし、クライアントは http://my-web-application.io
ドメインで Web アプリケーションとして実行しています。クライアント (ソース) ドメインは Kafka Bridge (ターゲット) ドメインとは異なります。クライアントからのリクエストは、same-origin ポリシーの制限が原因で失敗します。Cross-Origin Resource Sharing (CORS) を使用すると、この状況を回避できます。
CORS では、異なるドメイン上のオリジンソース間での シンプルな リクエストおよび プリフライト リクエストが可能です。
シンプルなリクエストは、メソッド GET
、HEAD
、POST
を使用した標準的なリクエストに適しています。
プリフライトリクエストは、実際のリクエストが安全に送信できることを確認する最初のチェックとして HTTP OPTIONS リクエストを送信します。確認時に、実際のリクエストが送信されます。プリフライトリクエストは、PUT
や DELETE
など、より高い安全性が求められるメソッドや、非標準のヘッダーを使用するメソッドに適しています。
すべてのリクエストには、HTTP リクエストのソースであるヘッダーの origins 値が必要です。
CORS を使用すると、Kafka Bridge HTTP の設定で Kafka クラスターへのアクセスに使用可能なメソッドおよび元の URL を指定できます。
Kafka Bridge の CORS 設定例
# ... http.cors.enabled=true http.cors.allowedOrigins=http://my-web-application.io http.cors.allowedMethods=GET,POST,PUT,DELETE,OPTIONS,PATCH
1.7.1. シンプルなリクエスト
たとえば、この単純なリクエストヘッダーは、元の URL を http://my-web-application.io
と指定します。
Origin: http://my-web-application.io
ヘッダー情報は、レコード消費のリクエストに追加されます。
curl -v -X GET HTTP-BRIDGE-ADDRESS/consumers/my-group/instances/my-consumer/records \
-H 'Origin: http://my-web-application.io'\
-H 'content-type: application/vnd.kafka.v2+json'
Kafka Bridge からのレスポンスでは、Access-Control-Allow-Origin
ヘッダーが返されます。これには、HTTP リクエストをブリッジに発行できるドメインのリストが含まれています。
HTTP/1.1 200 OK
Access-Control-Allow-Origin: * 1
- 1
- アスタリスク (
*
) が返されると、どのドメインからでもリソースにアクセスできるという意味です。
1.7.2. プリフライトリクエスト
最初のプリフライトリクエストは、OPTIONS
メソッドを使用して Kafka Bridge に送信されます。HTTP OPTIONS リクエストはヘッダー情報を送信し、Kafka Bridge が実際のリクエストを許可することを確認します。
ここで、プリフライトリクエストは、http://my-web-application.io
からの POST
リクエストが有効であることを確認します。
OPTIONS /my-group/instances/my-consumer/subscription HTTP/1.1 Origin: http://my-web-application.io Access-Control-Request-Method: POST 1 Access-Control-Request-Headers: Content-Type 2
OPTIONS
は、プリフライトリクエストのヘッダー情報に追加されます。
curl -v -X OPTIONS -H 'Origin: http://my-web-application.io' \ -H 'Access-Control-Request-Method: POST' \ -H 'content-type: application/vnd.kafka.v2+json'
Kafka Bridge は最初のリクエストにレスポンスし、リクエストが受け入れられることを確認します。レスポンスヘッダーは、許可されるオリジン、メソッド、およびヘッダーを返します。
HTTP/1.1 200 OK Access-Control-Allow-Origin: http://my-web-application.io Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS,PATCH Access-Control-Allow-Headers: content-type
オリジンまたはメソッドが拒否されると、エラーメッセージが返されます。
プリフライトリクエストで確認されたため、実際のリクエストには Access-Control-Request-Method
ヘッダーは必要ありませんが、元のヘッダーが必要です。
curl -v -X POST HTTP-BRIDGE-ADDRESS/topics/bridge-topic \
-H 'Origin: http://my-web-application.io' \
-H 'content-type: application/vnd.kafka.v2+json'
このレスポンスは、送信元 URL が許可されることを示します。
HTTP/1.1 200 OK Access-Control-Allow-Origin: http://my-web-application.io
関連情報