CORSについてのまとめ
公開: 2023/11/06
ブラウザのセキュリティ機能として同一オリジンポリシー(Same Origin Policy)が用意されているが、その制限を超えてサイト間でデータをやり取りしたい際に使われる仕様がCORS(Cross-Origin Resource Sharing)
!
そもそも同一オリジンポリシーってなんぞ?
JSなどを使用してサイト間のアクセスを禁止するセキュリティ上の制限のこと。
なんで同一オリジンポリシーは必要なん?
- XSSを防ぐため
- 悪意あるスクリプトが別オリジンのサイトにアクセスしたり操作したりするのを防ぐ
- CSRFを防ぐため
- ユーザがログインしているサービスに対して、ユーザの意図しない行動(SNSでの投稿、送金など)を実行するリクエストの送信を防ぐ
CORSによるアクセス制御シナリオの例で以下を紹介する
- 単純リクエスト
- プリフライトリクエスト
単純リクエスト
単純リクエストは相手側の許なしにリクエストを送信することができる。
以下の条件を満たすリクエストが単純リクエストとなる。
- 許可されているメソッドのうちいずれかであること
GET
HEAD
POST
- ユーザエージェントにより自動的に付与されるヘッダーを除いて、手動で設定できるリクエストヘッダが以下のいずれかであること
Accept
Accept-Language
Content-Language
Content-Type
Range
Content-Type
ヘッダは以下のいずれかであることapplication/x-www-form-urlencoded
multipart/form-data
text/plain
レスポンスにAccess-Control-Allow-Origin
ヘッダを追加するとそのリソースがどのオリジンからアクセスできるか制御できる。*
にすることで全てのドメインからアクセスできる状態となる。
プリフライトリクエスト
単純なリクエストの条件を満たさない場合は、ブラウザはOPTION
メソッドによるリクエストを送信して、実際のリクエストを送信しても安全かどうかを確かめる。
プリフライトリクエストでやり取りするヘッダは以下のようになっている。
リクエスト | レスポンス |
---|---|
Access-Control-Request | Access-Control-Allow-Methods |
Access-Control-Request-Headers | Access-Control-Allow-Headers |
Origin | Access-Control-Allow-Origin |