CORSの落とし穴:あなたのサイトを「誰でも入れる家」にしていませんか?
こんにちは!セキュリティの世界へようこそ。今日は、Web開発の現場で避けては通れない「CORS(Cross-Origin Resource Sharing)」についてお話しします。
「CORSって何だか難しそう…」「とりあえず `Access-Control-Allow-Origin: ` にしておけばエラーが出ないからいいや」なんて思っていませんか?その設定、実は泥棒に「いつでも自由に家に入ってください」と招待状を送っているようなものなんです。
今回は、セキュリティの専門家として、CORSの仕組みを「家の防犯」に例えながら、安全な設定方法を一緒に学んでいきましょう。
—
そもそも「CORS」って何をしているの?
Webブラウザには、もともと「自分以外の場所(他のドメイン)にあるデータには、勝手にアクセスさせない」という強力なガード(同一生成元ポリシー)がかかっています。これは、悪意のあるサイトがあなたの銀行口座の情報を勝手に盗み見ないための「鉄壁の門」です。
しかし、最近のWebアプリは複数のサービスを組み合わせて作りますよね。「どうしてもこの門を開けて、許可した相手だけを通したい」という時に使うのがCORSです。
つまり、CORSは「誰がこのサイトのデータに触れていいか」を定義する「入館許可証(ゲートキーパー)」の役割を果たしているのです。
—
やってはいけない「ワイルドカード()」の恐怖
開発中によく見るこの設定。これが最大の問題児です。
Access-Control-Allow-Origin:
“(アスタリスク)は「誰でもOK」という意味です。これを設定すると、世界中のどんな怪しいサイトからでも、あなたのアプリのデータにアクセスできるようになります。
家の例えで言うなら:
家中の窓やドアに「誰でも自由に入ってきていいですよ」と看板を掲げている状態です。泥棒(攻撃者)は、あなたが隠しておいた秘密のデータや、ログイン中のユーザーになりすました操作をいとも簡単に実行できてしまいます。
「開発中だからいいか…」と本番環境までこれを残すのは、「鍵をかけ忘れたまま旅行に行く」のと同じくらい危険なことだと覚えておいてくださいね。
—
安全な防犯対策:ホワイトリスト方式を採用しよう
では、どうすれば安全なのでしょうか?答えはシンプルです。「信頼できる相手の名前だけをリストに載せる(ホワイトリスト方式)」ことです。
具体的には、サーバー側で「アクセスしてきた相手(オリジン)」をチェックし、それが信頼できるリストに含まれている時だけ許可を返します。
安全な実装のイメージ(Node.js/Expressの例)
const allowedOrigins = [‘https://www.your-app.com’, ‘https://api.trusted-partner.com’];
app.use((req, res, next) => {
const origin = req.headers.origin;
// アクセス元のオリジンがリストにあるかチェック!
if (allowedOrigins.includes(origin)) {
// リストにあれば、そのオリジン専用の許可証を発行する
res.setHeader(‘Access-Control-Allow-Origin’, origin);
}
// 他の必要なヘッダー設定(メソッドの許可など)
res.setHeader(‘Access-Control-Allow-Methods’, ‘GET, POST, OPTIONS’);
res.setHeader(‘Access-Control-Allow-Headers’, ‘Content-Type, Authorization’);
next();
});
このように、「あなたのサイトから来たなら通してあげる。でも、知らない人はお断り!」という姿勢を貫くことが、最強の防犯対策になります。
—
今日からできるチェックポイント
明日から実務で設定を確認する際は、ぜひ以下の3点をチェックしてみてください。
1. `Access-Control-Allow-Origin: ` を探す
- もし見つけたら、それは「火種」です。本当に誰でもアクセスして良い情報なのか、もう一度考え直しましょう。
2. 「信頼できるドメイン」を明確にする
- 「どこからアクセスされる可能性があるか」を書き出してみてください。それがそのままホワイトリストになります。
3. 不要な権限は与えない
- 許可するのは `GET`(データの取得)だけですか?もし `POST`(データの追加・変更)まで許可しているなら、より慎重にチェックする必要があります。
—
最後に:セキュリティは「面倒」を楽しむもの
セキュリティ対策は、一見すると開発の邪魔をしているように感じるかもしれません。しかし、ユーザーが安心して使えるサービスを作ることは、エンジニアにとって最高の誇りです。
「誰が・どこから・何をしに来たのか」に気を配ることは、Webの守り手としての第一歩です。一歩ずつ、着実に堅牢なシステムを作っていきましょう。また分からないことがあれば、いつでも聞きに来てくださいね!

コメント