クロスドメインはダメだダメだとよく聞くものの、腑に落ちなかったのでまとめてみました。
same-origin policy(SOP)とは
同一のドメイン(正確にはオリジン)でしか通信できませんというルール。
世の中のほぼすべてのブラウザはSOPに従っているため、クロスドメインは防がれている。
SOPって本当に必要??
Webサイト作成者とブラウザの利用者の視点で考えてみる。
SOPがない世界
サイト作成者
- どこでもアクセスできるので、例えばtwitterとgmail両方を1画面に埋め込んだサイトとか作れて便利!
- 悪意があればgmailの情報を勝手に抜くとかできちゃうけどね。
ブラウザの利用者
- 危険なサイトにはアクセスしないよう注意する
- 変なサイト踏んだら自己責任
世の中すべてのWebサイト作成者が善人なら便利な世界
SOPがある世界
サイト作成者
- 自分で作ったサイト内でしか情報は読めない
- 他サイトと勝手に連携できなくて不便
ブラウザの利用者
- 何も考えずにサイトにアクセスしても安全
若干不便だけど、ブラウザの利用者は安心できる世界
どちらの世界を望むのか
というわけで普通のブラウザは利用者を守るためにSOPをつけている。
(デフォルトではSOPはONだが、利用者が自己責任を負うのであれば設定でOFFにもできる。)
とはいえ、自分のサイト内だけで完結する世界って不便だよね?
なんとかならんのか?
で、考えられた回避策がJSONPという仕組み。
JSONP
サイト作成者
- 他サイトのscriptを自分のページに埋め込むことで他サイトと通信できる。
- ただし、他サイトのscriptに悪意があれば自分のサイトの情報を抜かれる。
ブラウザの利用者
- 何も考えずにサイトにアクセスしても安全
**Webサイト作成者なら危険な通信先の判断はできるでしょ?だからドメイン跨っても問題ないよね、**という考えかた。
便利だけどリスクある感じ...
いやいやそんな判断したくないし!
ということでCORSが登場する。
CORS
サイト作成者
- 他サイトにうちのサイトと通信を許可してくれとお願いして
- 許可してもらえばそのサイトと通信できるようになる。
他サイト
- 通信を許可していいサイトを判断して登録する。
ブラウザの利用者
- 何も考えずにサイトにアクセスしても安全
サイト間でお互いに通信していい相手か判断する健全な世界。
ただ、許可するサイトを登録したりめんどくさい。
まとめ
クロスドメインがダメなイメージばかり先行していたけれど、
・実際はいろいろな方法でドメインを跨った通信は行われている。
・誰がリスクを負うのか?と考えると、それぞれの方式が理解しやすい。