- JSONPを安全に扱うことは「外部サイトからの“任意コード実行”を制御するための重要な防御技術」です
- JSONPの基本的な動き方を理解する(まずはイメージから)
- JSONPが危険になりうるポイントを整理する
- ステップ1:JSONPを使う前に「本当に必要か」を考える
- ステップ2:JSONPを使う場合は「信頼できるドメインだけ」に限定する
- ステップ3:JSONP呼び出し用のユーティリティを作る(基本形)
- ステップ4:コールバック名を「固定」または「安全に生成」する
- ステップ5:JSONPレスポンスを「そのままHTMLに流し込まない」
- ステップ6:業務で使える「安全なJSONPユーティリティ」(まとめ版)
- ステップ7:JSONPを安全に扱うための「設計上の心得」
- まとめ:JSONPを安全に扱うことは「古い仕組みを現代のセキュリティ感覚で運用するための知恵」
JSONPを安全に扱うことは「外部サイトからの“任意コード実行”を制御するための重要な防御技術」です
JSONP(JSON with Padding)は、古いブラウザやCORSが使えない環境で 別ドメインのAPIからデータを取得するための仕組みとしてよく使われてきました。
仕組みはシンプルです。
<script>タグは、別ドメインのJavaScriptを読み込める- そのJavaScriptの中で
callback({...})のようにJSONを渡す - 自分のページ側で
callback関数を定義しておけば、データを受け取れる
しかし、ここで重要なのは、 「JSONPは“データ”ではなく“コード”として読み込まれる」 という点です。
つまり、JSONPを扱うということは、 外部サイトのJavaScriptコードをそのまま実行する ということでもあり、セキュリティ的には非常に慎重な設計が求められます。
ここから、初心者向けにステップバイステップで解説していきます。
JSONPの基本的な動き方を理解する(まずはイメージから)
典型的なJSONPの呼び出し例
外部APIが次のようなレスポンスを返すとします。
callback({
user: "Alice",
age: 20
});
JavaScriptクライアント側では、次のようにしてデータを受け取ります。
<script>
function callback(data) {
console.log("受け取ったデータ:", data);
}
</script>
<script src="https://api.example.com/user?callback=callback"></script>
<script src="..."> で読み込まれた外部コードが callback({...}) を実行し、 自分のページ側の callback 関数が呼ばれる、という流れです。
ここで重要なのは、 「外部APIのレスポンスは、JSONではなくJavaScriptコード」 だということです。
JSONPが危険になりうるポイントを整理する
JSONPが危険になる理由は、次のような点にあります。
- 外部サイトのコードがそのまま実行される
- データだけでなく、任意のJavaScriptが実行可能
- レスポンス内容を完全には制御できない
- API側が攻撃者に乗っ取られた場合、悪意あるコードが返される
<script>タグはCSPやXSSの観点で強力な権限を持つ- DOM操作、Cookieアクセス、ネットワーク通信など何でもできる
つまり、JSONPは 「外部サイトに自分のページのJavaScript権限を渡す」 くらいの危険度を持つ仕組みだと理解しておく必要があります。
