Web開発をしていると、CSRFやCORS、セキュリティヘッダーなどの用語を聞いたことがあるかもしれません。
どれもWebセキュリティに関係する用語ですが、何を防ぐ仕組みなのかは混乱しやすいポイントです。
例えば次のような疑問を持ったことはないでしょうか。
- CORSはセキュリティ対策なのか?
- CSRFとCORSは何が違うのか?
- セキュリティヘッダーはCORSの代わりになるのか?
これらはすべて役割が異なる仕組みです。
CSRFとは?
CSRF(Cross-Site Request Forgery)は、ログインしているユーザーの権限を悪用する攻撃です。
イメージしやすい具体例を交えて考えてみます。
銀行サイトにログインしている状態で、悪意のあるサイトを開いたとします。
そのサイトに銀行サイトへ送金するリクエストが仕込まれていた場合です。
ブラウザはログイン状態のCookieを自動で送るため、
銀行サイトは「ユーザー本人の操作」だと判断してしまう可能性があります。
CSRFは、ユーザーのログイン状態を利用して、意図しない操作を実行させる攻撃です。
CSRFの対策として一般的に使われるのが CSRFトークン です。
仕組みはシンプルで以下の通りです。
- サーバーがランダムなトークンを生成する
- フォーム送信時にトークンを一緒に送る
- サーバー側でトークンを検証する
攻撃者はこのトークンを取得できないため、リクエストが拒否されます。
Spring Securityでも、このCSRFトークンの仕組みがデフォルトで有効になっています。
CORSとは?
CORS(Cross-Origin Resource Sharing)は、ブラウザのアクセス制御の仕組みです。
ここで重要になるのが オリジン(Origin) という概念です。
オリジンとは、次の3つの組み合わせを指します。
- プロトコル
- ドメイン
- ポート
例えば次のURLは、すべて別オリジンになります。
https://example.com
https://api.example.com
http://example.com
ブラウザは基本的に、別オリジンへのリクエストを制限しています。
これは Same Origin Policy(同一オリジンポリシー) という仕組みです。
しかし、APIなどでは別オリジンからアクセスしたい場合もあります。
そこで使われるのが CORS です。
サーバー側で次のようなヘッダーを返すことで、アクセスを許可できます。
Access-Control-Allow-Origin
つまりCORSは、どのオリジンからのアクセスを許可するかを決める仕組みです。
重要なのは、CORSは認証や攻撃対策ではないという点です。
あくまで ブラウザの通信制御です。
セキュリティヘッダーとは
セキュリティヘッダーは、ブラウザの挙動を安全に制御する仕組みです。
サーバーがHTTPレスポンスヘッダーを返すことで、ブラウザに安全な動作を指示します。
代表的なセキュリティヘッダーをいくつか紹介します。
X-Frame-Options
クリックジャッキング攻撃を防ぐためのヘッダーです。
サイトが他のページの iframe に埋め込まれることを防ぎます。
X-Content-Type-Options
ブラウザがコンテンツタイプを推測する挙動を防ぎます。
これにより、意図しないスクリプト実行を防ぐことができます。
Content-Security-Policy(CSP)
どのスクリプトやリソースを読み込んでよいかを制御する仕組みです。
XSS対策として非常に重要なヘッダーです。
セキュリティヘッダーは、ブラウザの危険な挙動を制限する設定と考えると理解しやすいです。
まとめ
CSRF、CORS、セキュリティヘッダーは、
すべてWebセキュリティに関係する仕組みですが、役割はそれぞれ異なります。
- CSRF は、ログインユーザーの権限を悪用する攻撃を防ぐ仕組み
- CORS は、どのオリジンからのアクセスを許可するかを制御するブラウザの仕組み
- セキュリティヘッダー は、ブラウザの危険な挙動を制限するための設定
それぞれは別の問題を解決する仕組みであり、どれか1つだけでWebセキュリティを守れるわけではありません。
Webアプリケーションの安全性を高めるためには、
それぞれの役割を理解し、適切に組み合わせて使うことが重要です。


コメント