「セキュリティってなんだか難しそう…」と身構えていませんか?大丈夫です。今日は、Web開発の現場で時々見かける「JSONP」という仕組みと、そこに潜む落とし穴について、一緒に紐解いていきましょう。
エンジニアとして現場に出ると、教科書では習わないような「古いけれど、まだ現役で動いているシステム」に出くわすことがよくあります。JSONPはその代表格。仕組みを知れば、怖いことはありませんよ。一歩ずつ、防犯のコツを学んでいきましょう!
—
1. JSONPってそもそも何?:家の鍵と「合い鍵」の例え
JSONP(JSON with Padding)は、簡単に言うと「外からデータをこっそり受け取るための裏口」のようなものです。
本来、Webブラウザには「自分と同じドメインのデータしか読み込んではいけない」という厳しい門番(同一オリジンポリシー)がいます。しかし、昔のエンジニアたちは「どうしても別のサーバーからデータを呼び出したい!」と考えました。そこで使われたのが、タグなら制限をすり抜けられるという特性を悪用した、このJSONPという「裏技」です。
あなたの家に例えるなら、「合言葉(コールバック関数名)」を言えば、鍵をかけずに玄関を開けて荷物を置いてくれるサービスのようなものですね。
2. なぜ危ないの?:泥棒が「偽の合言葉」を叫ぶとき
この仕組みの最大の弱点は、「合言葉(コールバック関数名)を、誰でも自由に指定できてしまうこと」にあります。
もし、サーバー側が受け取った合言葉を「はい、これが合言葉ですね!」と無防備にそのままブラウザに返してしまうとどうなるでしょう?
悪い攻撃者は、以下のような悪意あるスクリプトを合言葉に紛れ込ませます。
// 攻撃者の狙い:合言葉の代わりにスクリプトを送り込む
?callback=alert('あなたのクッキーを盗みました!')//
これがそのまま実行されると、ブラウザは「ああ、これはサーバーからの指示だ」と勘違いして、あなたのセッション情報(鍵のようなもの)を攻撃者に送信してしまうのです。これがXSS(クロスサイトスクリプティング)の入り口です。
3. どうやって防げばいいの?:最強の「身元確認」
この攻撃を防ぐための鉄則はシンプルです。「誰からの頼みでも聞かない」こと。以下の3つの対策を組み合わせて、泥棒を追い出しましょう。
① ホワイトリストによる徹底管理
合言葉は、あらかじめ決めたもの以外は一切受け取らないようにします。
// 悪い例:受け取った名前をそのまま使う
const callback = req.query.callback; // 危険!何が入ってくるかわかりません
// 良い例:ホワイトリストで管理する
const allowedCallbacks = ['displayData', 'updateUI', 'renderList'];
const callback = allowedCallbacks.includes(req.query.callback) ? req.query.callback : 'defaultCallback';
② Content-Typeを厳守する
ブラウザに対して「これはただのテキストデータですよ」としっかり伝えることが重要です。application/javascript ではなく、application/json として正しく送ることで、ブラウザが勝手にスクリプトとして実行するのを防ぎます。
③ CSP(Content Security Policy)で防壁を築く
ヘッダーの設定で「スクリプトは信頼できる場所からしか読み込まない!」と宣言します。これを設定しておくだけで、万が一の攻撃を未然にブロックできます。
HTTPレスポンスヘッダーの設定例
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-api.com;
default-src 'self':基本的に自分のサイトのものしか読み込まない。script-src:信頼できる外部サイトだけを許可する。
---
4. 最後に:JSONPはもう「卒業」しませんか?
ここまで対策を解説してきましたが、正直なところ、現代の開発ではJSONPを使う必要はほとんどありません。
今は「CORS(Cross-Origin Resource Sharing)」という、安全にドメインを跨いで通信するための標準的な仕組みがあります。これを使えば、裏口を使うことなく、正面玄関で堂々と鍵を開け閉めして安全にデータをやり取りできます。
もし、今動いている古いシステムがJSONPを使っているなら、「いつか直せればいいや」ではなく、ぜひリプレイスの計画を立ててみてください。それが、あなたの書いたコードを、そしてユーザーのデータを守る一番のセキュリティ対策になります。
セキュリティは、一度学んで終わりではなく、日々の小さな積み重ねです。今日学んだ「合言葉のチェック」から、あなたのプロジェクトの防犯を始めてみませんか?
応援しています!
コメント