コールバックは、独自のコードで定義した関数です。jsonpサーバーは、指定されたコールバック関数と同じ名前の関数呼び出しで応答をラップします。
これはどうなりますか:
1)コードはJSONPリクエストを作成します。これにより、<script>
次のような新しいブロックが作成されます。
<script src="http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"></script>
2)その新しいスクリプトタグがブラウザによって実行され、JSONPサーバーにリクエストが送信されます。で応答します
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
3)このリクエストはスクリプトタグからのものであるため、文字通り配置した場合とほとんど同じです。
<script>
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
</script>
あなたのページに。
4)この新しいスクリプトがリモートサーバーから読み込まれたので、実行されます。実行されるのはparseResponse()
、関数呼び出しの唯一のパラメーターとしてJSONデータを渡す関数呼び出しです。
したがって、コードの他の場所では、次のようになります。
function parseResponse(data) {
alert(data.Name); // outputs 'Foo'
}
基本的に、JSONPは、サードパーティのサーバーに関数呼び出しをページに直接挿入させることにより、ブラウザーの同一生成元スクリプトのセキュリティポリシーをバイパスする方法です。これは設計上非常に安全ではないことに注意してください。あなたは、リモートサービスが立派であり、悪意を持っていないことに依存しています。悪いサービスがあなたの銀行/Facebook/その他の資格情報を盗むJSコードを返すのを止めるものは何もありません。例...JSONPの応答は
internalUseOnlyFunction('deleteHarddrive');
parseReponse(...)ではなく。リモートサイトがコードの構造を知っている場合、そのサイトが望むことを何でもできるように正面玄関を全開にしたので、リモートサイトはそのコードで任意の操作を実行できます。