JSONPはもう「古い家の鍵」?XSSリスクから身を守るクロスオリジンの考え方
こんにちは。現場で泥臭くインシデントと戦い続けているセキュリティエンジニアです。
今日は、Web開発の現場でたまに耳にする「JSONP(ジェイソンピー)」という技術と、それが抱える「XSS(クロスサイトスクリプティング)」という深刻なリスク、そして現代の標準である「CORS」への移行についてお話しします。
専門用語が並ぶと難しく感じるかもしれませんが、まずは「家のセキュリティ」に例えて、リラックスして紐解いていきましょう。
—
1. JSONPは「信頼できない隣人に合鍵を渡すようなもの」
かつて、Webブラウザには「異なるドメイン間では自由にデータをやり取りしてはいけない(同一オリジンポリシー)」という厳しいルールがありました。そこで、その制限をすり抜けるための「裏口」として使われていたのがJSONPです。
なぜ危険なのか?
JSONPの仕組みを例えるなら、「隣の家の人(外部サーバー)に、自分の家の合鍵を渡して、好きなタイミングで勝手に鍵を開けてもらう」ようなものです。
具体的には、タグを使って外部のスクリプトを読み込み、その結果を自分のプログラム内で実行します。もし、読み込み先のサーバーが悪意ある攻撃者に乗っ取られていたらどうなるでしょう?攻撃者はスクリプトの中に「勝手に鍵を開けて、大切な宝物(Cookieや個人情報)を外に持ち出せ!」という命令を紛れ込ませます。これがXSS(クロスサイトスクリプティング)の入り口です。
---
2. XSSの3つの顔:泥棒の侵入経路
WebアプリケーションにおけるXSSは、大きく分けて3つのパターンがあります。
- 反射型(Reflected XSS): 攻撃者がURLに仕掛けた罠を、ユーザーがクリックすることで発動します。「偽の懸賞サイト」へ誘導するようなものですね。
- 格納型(Stored XSS): 掲示板のコメント欄などに悪意あるコードを書き込みます。見ているだけで被害に遭うので、最もタチが悪いです。
- DOM型(DOM-based XSS): サーバー側ではなく、ブラウザ上で動くプログラムの不備を突きます。目に見えないところでこっそり実行されるのが特徴です。
JSONPを使っていると、これらすべての攻撃に対して「どうぞ入ってください」と扉を開けているのと同じ状態になってしまうのです。
---
3. CORSという「現代のセキュリティガードマン」への移行
今のWeb開発では、JSONPのような「裏口」を使う必要はありません。CORS(Cross-Origin Resource Sharing)という、正式で安全な仕組みがあるからです。
CORSは、家の入り口に「ガードマン」を立たせるようなものです。誰が来てもいいわけではなく、「このリストに載っている人(特定のドメイン)だけ通していいよ」と許可を与えます。
サーバー側でやるべきこと(設定例)
サーバー側で「どのドメインからのアクセスなら許可するのか」をレスポンスヘッダーで伝えるだけです。
誰でも許可する場合は (アスタリスク) ですが、本番環境では絞りましょう
Access-Control-Allow-Origin: https://your-trusted-site.com
許可するHTTPメソッドを指定します
Access-Control-Allow-Methods: GET, POST, OPTIONS
認証情報(Cookieなど)を送る必要がある場合はこれが必要
Access-Control-Allow-Credentials: true
このように設定することで、ブラウザは「お、このサイトは許可されているな」と判断し、安全にデータをやり取りできます。
---
4. 一歩ずつ対策を学んでいきましょう!
明日からできる、あなたのアプリを守るためのチェックリストです。
1. JSONPを全廃する: 今すぐコードを検索して、JSONPの呼び出し箇所をCORSを使ったAPI通信(fetch APIなど)に書き換えましょう。
2. ヘッダーを厳格に管理する: Access-Control-Allow-Origin に `` を指定するのは避け、信頼できるドメインだけをホワイトリスト化しましょう。
3. Content Security Policy (CSP) を導入する: 「許可されていない外部スクリプトは絶対に実行しない」という強力な盾(CSPヘッダー)をWebサイトに追加してください。
まとめ
JSONPはかつてのWebを支えた偉大な技術ですが、現代のセキュリティ環境では「古い鍵」です。CORSという現代的なガードマンを雇い、堅牢な家を建てることで、ユーザーの大切な情報を泥棒から守りましょう。
最初は難しく感じるかもしれませんが、一つずつ理解していけば必ず防げるようになります。あなたの開発が、ユーザーにとって安全で心地よい場所になりますように。応援しています!
コメント