CORSって必要なの?

あとで読む

最初に

CORS(Cross-Origin Resource Sharing)という言葉を見かけるたびに、これっているのだろうか?、セキュリティ的に意味あるのかみたいに考え始めて、こいつが何なのかよく分からなくなります。 なので、読み返した時に一発で分かるように書き残しておこうと思う。

※もし解釈に間違いがありましたら、教えて頂けると幸いです。 お恥ずかしいながら、あまり自信がありません。

疑問点

  • セキュリティ的に意味あるの?
  • そもそも必要なのか?

結論

セキュリティ的に意味あるの?

CORS は、バックエンドが特定の Origin の JavaScript に対して、API レスポンスや Cookie を含む通信結果をブラウザ上で扱うことを許可するための仕組みであり、API 自体のセキュリティを強化するものではありません。

API側のセキュリティを強化するものではない。

CORSが設定されていない場合、ブラウザはSame-Origin Policyにより、異なるオリジンからのレスポンスをJavaScriptで読み取ることを制限するため、CORSの仕組み自体はセキュリティに関連している。

CORSの設定で特定のドメインを許可する事自体はセキュリティの強化にはなっていない。 むしろドメインを許可する事でセキュリティを緩和している。 異なるドメイン間、リクエスト制限を許可する仕組みでありセキュリティに関連するものではある。

そのため、CORSを設定していない状態がセキュリティ的には一番安全な状態になっている。

そもそも必要なのか?

必要・不要で言うと、SPAアプリでは必要。 設定しないと異なるドメイン間でfetchで送信したリクエストのレスポンスをJavaScriptで読み取ることができなくなる。 また、Cookieを含むリクエストを送信するには、CORSの設定に加えてcredentials: 'include'などの設定も必要になる。

もしブラウザに Same-Origin Policy が存在しなければ、不正なサイトの JavaScript が正規サイトに対して認証 Cookie を含むリクエストを送信し、本来は認証ユーザーしか見られない情報を読み取れてしまう。

これを防ぐため、ブラウザにはデフォルトでSame-Origin Policy が実装されており、CORS はその制約をサーバが明示的に緩和するための仕組みである。

勘違いしていた事

セキュリティに関連して、設定する事でセキュリティが強化されると思っていた。 だが実際には指定したドメインからのリクエストを許可して緩和をしていた。 そして許可したドメイン間でしかリクエストが投げれず、外部からのリクエストを防ぐ事でセキュリティが上がると思っていた。 それがCSRF, XSSの対策になっていると考えていた。 しかし、実際にはcURLなどで直接リクエストを投げる事が出来ていたので、意味ないのではと疑問に思っていた。

CSRF(Cross-Site Request Forgeries)

こちらはユーザが正規サイトにログイン済みの状態で偽サイトのリンクをクリックさせる事でセッションを含んだcookieを使用して、ログインID, パスワード不要で正規サイトの操作を行う攻撃手法である。 現代はSameSiteというcookieが付与されたサイトからしかcookieを送信する事が出来ない仕様になったため意図的にSameSiteの制約を緩めなければ不可能な攻撃になっている。

XSS(Cross-Site Scripting)

正規サイトの脆弱性を突いて、悪意のあるスクリプトを埋め込んでページに訪れた人のブラウザで実行されて、被害に遭う。 こちらはSameSiteの制約があってもスクリプトが実行されるのは正規サイト上なので、効果がない。 対策としては不要なスクリプトを埋め込めないようユーザが入力・投稿できるページにスクリプトを埋め込めないような対策を取る。

これら上記の2つはCORSとは関係なく、設定した所で対策にならない。

最後に

「 CORSはセキュリティを強化するものではない。 」 これだけ覚えていれば、良さそうです。

これで完璧にCORSを理解しました!(笑)

記事に関するコメント等は

🕊:Twitter 👨🏻‍💻:Github 😥:Stackoverflow

でも受け付けています。どこかにはいます。