初めまして!!標準体重の65kgを目指して、全力で増量中のそうまです!!(現在 57kg)
今回は、同一オリジンポリシーの必要性について調査した事を纏めています!!
同一オリジンポリシーとは?
以下でもチラッと書きましたが、同一オリジンポリシー(Same-Origin Policy)とは、異なるオリジンのリソースにはアクセスできないという、セキュリティ上の制約のことを指します。
疑問に思った事
何も知らない初心者からすると、同一オリジンポリシー(Same-Origin Policy)がなぜ必要なのか、正直ピンときませんでした。
CORSの設定が必要だったり、認証の仕組みでリクエストを制御できるならそれで十分じゃないの?と思っていたからです。
CSRFを防ぐため
アクセス可能範囲を制限し、CSRF(クロスサイトリクエストフォージェリ)のような攻撃を防ぐため。
先ほどの記事でも少しだけ書いてたんですが、正直あまり分かってはいませんでした...。
まずは、CSRFとは何かを見ていきます。
CSRFとは?
攻撃方法
CSRF攻撃では、以下のようなケースが考えられます!
-
ユーザーが銀行サイトにアクセスしてログインする
-
セッション情報が保持されたまま、SNSなどで悪意のあるサイトのリンクをクリックしてしまう
-
悪意のあるサイトが自動でスクリプトを実行し、ブラウザに保存されたCookieを使って、銀行サイトに送金リクエストを送信する
引用 : https://www.ipa.go.jp/security/vuln/websecurity/csrf.html
攻撃対象
- 対象の銀行サイトにログイン済みのユーザー(=有効なセッションを保持している)
- 銀行サーバーが、同一オリジン以外からのリクエストを制限していない(=CORSやCSRFトークンの対策が不十分)
- ブラウザが、SameSite属性などでCookieの送信制限がされていない
つまり?
同一オリジンポリシーによって、JavaScriptなどを通じて外部のオリジンから自分のオリジンのデータへアクセスすることが制限されるため、悪意あるサイトからのレスポンスの読み取りや、セッション情報の不正取得を防ぐことができる。
これにより、CSRFやXSSといった攻撃への対策の一部として機能する。
認証ではダメなのか?
僕は当初、リクエストが通るかどうかの観点だけで物事を見てしまっていて、「同じリクエストを制限する仕組みなら、認証だけでええやん」と思っていました。
しかしそれは大きな間違いでした。…恥ずかしい。
認証は「誰がアクセスしようとしているか」を判断してリクエストを制限する仕組みであり、
一方で同一オリジンポリシーは「どこからアクセスしようとしているか」を確認して制限する仕組みです。
つまり、目的そのものがまったく異なるものでした。
纏め
同一オリジンポリシーはアクセスの場所を, 認証はアクセスする人物を制限する仕組みであり、目的が全く異なるためどちらもよく考えて設定するべきだという事がわかりました!!!