Under+Ground

CORS完全に理解した

Sat Apr 26 2025

CORSって

CORSとはCross-Origin Resource Sharingの略で異なるドメインからのリクエストを制御する仕組みである。

多くのサーバーにこの仕組みが利用されており、非公開APIを叩いたりするときなどにこのCORS制限があるためにブラウザから直接リクエストを送れないなど、利用する側からしてみると大変不便な思いを感じていました。

が、よくよく考えてみると何故このCORSという仕組みが必要なのかいまいちわかっていなかったので、ChatGPTと対話して教えてもらうことにしました。

CORSの必要性

そもそも、何故別ドメインからのリクエストをブロックする必要があるのかということですが、これはつまり別ドメインのJavaScriptからのリクエストを制限する必要があるから、ということに尽きます。

なんでそんな必要があるのかと思っていたのですが、もし仮にあるサービスがCookieのトークンを利用してユーザー認証をし、ユーザーの個人情報を返すウェブAPIにアクセスできるとしましょう。

これをこのドメイン上で利用する分には何も問題がないのですが、悪意のあるドメインのJavaScriptでそのウェブAPIに対してリクエストを送る仕組みがあった場合、ユーザーの意図に反して悪意のあるドメインがユーザー情報を取得できてしまいます。

そのため、信頼されたドメインからしかリクエストを受け付けない、というのがCORSなわけです。

Cookieのセキュリティ

でもCookieってセキュリティもしっかりしていて「指定したドメインでしか利用しない」「JavaScriptからは読み込めないようにする」とかいろいろあります。

例えばSecure属性をつければHTTPSでしかCookieを送らなくなりますし、HttpOnlyをつければJavaScriptからはアクセスできなくなりますし、SameSiteをつければ他のドメインからのCookieを拒否できます。

HttpOnlyをつければ悪意のあるスクリプト自体からCookieは読み込めなくなりますが、リクエスト自体は送られてしまうので意味がありません。

SameSiteを設定すればCRSF対策としては一応これで十分らしいのですが、それに加えてCORSもつけておくとより良いらしいです。

まとめ

  • CORS(サーバーに対して管理外ドメインからリクエストが送られるのを防ぐ)
  • SameSite(管理外ドメインからのリクエストに対してCookieを付与するのを防ぐ)

という役割の違いがあるみたいです。

これで多分完全にCORSを理解しました、多分。