こんにちは、穂苅と申します。
前回は、SQL インジェクションについて詳しく紹介していきました。かなり怖いセキュリティリスクですので対策必須の内容です。ご興味のある方はぜひご覧ください。
今回は、 CORS(Cross-Origin Resource Sharering)について見ていきます。Web セキュリティについて大事な要素の1 つであるCORS、ご存知でしょうか。
CORS とは
CORS は、日本語では「オリジン間リソース共有」と言われています。Web ブラウザにもともと「同一オリジンポリシー」というものがあります。これは、異なるオリジンに対する JavaScript からのアクセスを制限するというセキュリティの機能です。しかし、それでは不便なところが多くでてきたため成約を緩和して異なるオリジンでもリソースが共有できるようにしたのがCORS です。ブラウザのセキュリティ
機能であると理解するとわかりやすいです。
従来は、同一オリジンの場合のみ通信ができていました。同一オリジンというのは、URL を見てみると分かります。例えば、 https://www.example.com でHTTPS なので443 ポートを使っている場合を見てみます。すると以下のようになります。
・スキーム:https
・ホスト:www.example.com
・ポート:443
この3 つがすべて同一である状態が同一オリジンです。
ですので、Web サーバ側では https://www.example.com として通信をしていたものの中で例えばAPI(https://api.example.com )を呼び出そうとしてAPI サーバに通信をしても、同一オリジンではないため別オリジンのAPI サーバを呼び出せなかったのです。これでは不便です。
しかし、現在は外部のAPI からのデータ取得や、別ドメインへのデータ送信などが一般的ですので、CORS がないと様々な挙動が実現できなくなってしまいます。
技術的には、CORS で実現したいこととしては、 異なるオリジン(① Ex. 別オリジンのAPI サーバなど)にリクエストを送る リクエストにクッキーがつく 返ってきたレスポンスを② ③ JavaScript が受け取るという流れです。
その中で注意しなければいけないのは、脆弱性です。単に同一オリジンポリシーを緩和したルールにするだけではセキュリティリスクが増えるだけです。具体的にはCSRF と情報漏洩です。
そこで、CORS には「オリジンを基準として判断する」というルールに沿っています。オリジンを信頼するかどうかは、サーバがブラウザに、Access-Control-Allow-XXX ヘッダを用いて伝えます。
CORS を実現する際に必要な対策としては、以下があります。
・プリフライトリクエスト:リクエストを送っていいかを事前確認
・Access-Control-Allow-Origin:レスポンスを受け取るオリジンを指定
・Access-Control-Allow-Credentials:クッキー付きリクエストの結果を受け取り
これら具体的にどういうものなのかは、YouTube の「徳丸浩のウェブセキュリティ講座」チャンネルにある「今日こそ理解する CORS 」を見てみるととてもクリアになります。
Web セキュリティ知識を詳しく知りたい場合は、徳丸本と徳丸試験がおすすめ
今回は、CORS について紹介しました。どういうものか、必要性、などがクリアになりましたら嬉しいです。
アプリケーション開発者は正しい知識を持って実装を行わないと、影響の大きな事故になってしまう可能性もあります。こういったWeb セキュリティ関連の知識について、詳しくなりたい場合は、徳丸本を学ぶことをおすすめします。
徳丸本は、Web セキュリティに関する基本知識が網羅されています。セキュリティは正確に体系立てて理解をしていかないと、システムや会社にとって致命的な問題に繋がります。これらの知識を身に着けた
エンジニアとして活躍されていく方にはおすすめです。
そして、学んだあとは理解を確認するために徳丸試験でチェックしてみると理解度が可視化されるため、
ぜひチャレンジしてみてください。
【徳丸本】
体系的に学ぶ 安全な Web アプリケーションの作り方 第 2 版 脆弱性が生まれる原理と対策の実践
徳丸浩の Web セキュリティ教室
【徳丸試験】
ウェブ・セキュリティ基礎試験 ( 徳丸基礎試験)
ウェブ・セキュリティ実務知識試験 ( 徳丸実務試験)