ここが危ない!Web2.0のセキュリティ

第3回 JSONPでのクロスドメインアクセス

この記事を読むのに必要な時間:およそ 2 分

JSONPの動作原理

前回はAjaxに存在するセキュリティモデルであるSame-Originポリシーを紹介し,そのSame-Originポリシーを迂回する方法とセキュリティについて見てきました。また,回避する方法の1つめとしてリバースProxyを用いた方法を紹介しました。リバースProxyを用いた方法ではセキュリティ的な問題点もありましたが,そもそもProxyサーバを用意しなければならないため,この方法は手軽に使うことはできませんでした。
そこで考え出されたのがJSONP(JavaScript Object Notation with Padding)という方法です。

それではまず簡単にJSONPについて説明します。
Ajaxで使われるXMLHttpRequestオブジェクトには前回説明したとおりSame-Originポリシーがありクロスドメインアクセスはできません。一方,SCRIPTタグを用いると,ドメインの異なるサーバに置いているスクリプトファイルを読み込むことができます。このスクリプトファイルの中にデータを入れておくことで,ドメインの異なるサーバからデータを取得できるという仕組みです。

図1 JSONPの動作原理

図1 JSONPの動作原理

では簡単なプログラムを用いて説明していきます。次のようなファイルを用意し,関数を定義しておきます。この関数は,のちほどSCRIPTタグでJSONPデータを読み込んだ時点で実行されますので,コールバック関数と呼ばれます。

<html>
<body>
<script>
function callback(x){ // コールバック関数を定義
 alert(x["name"]);
}
</script>
<script src="http://mail.example.com/json.dat"></script>
</body>
</html>

JSONPのデータは以下のようになります。このデータをSCRIPTタグで読み込んだ時点でコールバック関数が実行されることになります。SCRIPTタグにはSame-Originポリシーがありませんので,異なるドメインのサーバにJSONPデータを置くこともできます。

json.datの内容

callback( { "name" : "Fukumori" } );

JSONPとは,このようにSCRIPTタグが他のサーバからもデータを取得できる(Same-Originポリシーがない)という特徴を生かし,クロスドメインでのアクセスを実現する方法です。

また,リバースProxyを使った方法ではリバースProxyサーバに認証情報を送信しなければならないという問題がありましたが,JSONPを使う方法ではその問題が解決されます。もしデータ提供サーバが認証を必要とするサービスを提供していた場合,データ提供サーバへCookieなどの認証情報が送られます。これはブラウザが自動的に送信します。つまりJSONPを使った場合には,本来認証情報を受け取るべきサーバであるデータ提供サーバにだけ認証情報を送信することができます。

著者プロフィール

福森大喜(ふくもりだいき)

株式会社セキュアスカイ・テクノロジー CTO。大学の授業で作成したプログラムのセキュリティホールを指摘されたのがきっかけでセキュリティの道に進む。セキュリティベンダーでIDS,IRT等に従事した後,Webアプリケーションのセキュリティ検査サービスを立ち上げる。2006年4月に株式会社セキュアスカイ・テクノロジーを設立。

URLhttp://www.securesky-tech.com/

コメント

コメントの記入