CORS設定をcurlで動作確認する方法とハマったコト
CORSを実装するライブラリにアップデートがあったため、curl
コマンドでCORS設定の動作確認を行いました。
curl
で動作確認する方法
CORS設定を開発環境のURLは以下とします。
- リクエスト元(フロント): http://localhost:1111
- リクエスト先(API): http://localhost:8888
curl
を叩き、
curl --dump-header - 'http://localhost:8888/' -H 'Origin: http://localhost:1111'
結果のレスポンスヘッダーにAccess-Control-Allow-Origin
があるかを確認します。
HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
+ Access-Control-Allow-Origin: http://localhost:1111
+ Access-Control-Allow-Methods: {GETやPOSTなど許可したメソッド一覧}
Access-Control-Allow-Origin
がある場合はCORSが正常に動作します。
※API側で既にCORSの許可設定(OriginやMethodなど)がされている前提です。
CORSエラーになるコマンド
Origin
のスキームやホスト、ポート番号が違うためエラーになります。
curl --dump-header - 'http://localhost:8888/' -H 'Origin: https://test:123'
結果にAccess-Control-Allow-Origin
などが見当たりません。
HTTP/1.1 401 Unauthorized
Content-Type: application/json; charset=utf-8
ハマったコト
大まかに2つです:
- レスポンスヘッダーではなくレスポンスデータを見ていた
- オプションに
--dump-header
を指定していない
1. レスポンスヘッダーではなくレスポンスデータを見ていた
「CORSエラー = データが返ってこない」という大きな勘違いをしていました。
CORSエラーはブラウザ上で行われる判定であり、curl
を叩いているターミナル上ではCORSエラーが存在しないのでAPIからJSON(レスポンスデータ)が普通に返ってきます。
「curl
でデータが返ってくるからCORSエラーが発生しない = 動作が正常ではない」と勘違いしてハマりました。
レスポンスデータを見るのではなくレスポンスヘッダーを見るのでした。
--dump-header
を指定していない
2. オプションに1と繋がる話ですが、レスポンスヘッダーを見るために--dump-header
オプションを指定しました。
これを付けることでレスポンスヘッダーが表示され、Access-Control-Allow-Origin
の有無を確認できます。
もしくは-X OPTIONS
を使い以下の形でも確認できます:
curl -H "Origin: http://localhost:1111" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS \
-v "http://localhost:8888"
ちなみにCORSは「コース(コゥス、コーズ)」と読むらしいです。
参考
株式会社InnoScouterのTech Blogです。 組織から「できない」をなくすをミッションに、大企業とスタートアップ企業の連携をサポートするSaaS「InnoScouter」を提供しています。 採用情報はこちら herp.careers/v1/innoscouter/inPUbSL4Bofu
Discussion