最近 JSONP について知ったのですが、いくつかの点を結びつけるのに苦労しています。私の理解は次のとおりです。
- 同一オリジンポリシーにより、あらゆるコンテンツ (JSON を含む) に対するクロスドメイン XmlHttpRequests は禁止されています。これにより、XSRF から保護されます。
- JSONP を返す src を持つスクリプト タグを使用できます。これは、Javascript 関数 (たとえば 'Foo') の呼び出し内に埋め込まれた JSON です。
- JSONPデータが返されたときに呼び出されるページ上に「foo」の実装をいくつか用意し、関数に渡されたJSONデータを使って操作を行うことができます。
クロスドメイン データが JSONP 経由で受信された場合は問題なく受信できるのに、JSON 経由で受信された場合は受信できないのはなぜですか?
JSON は XSRF を許可する傾向があるが、JSONP はそうではないという仮定はありますか? もしそうなら、JSONP が XSRF を有効にするデータを決して提供しない事実上のデータ形式であるという以外に、その理由はありますか? なぜ JSONP であり、代わりに XML 上の任意のルート タグではないのですか?
ご回答をよろしくお願いいたします。この問題を理解できなかったので、もう一度頭を働かせてください。
ベストアンサー1
この質問は、ブラウザが JSONP を安全と見なす理由に関するものであり、JSONP が安全かどうか (実際は安全ではありません) に関するものではないと理解しています。この質問に段階的に回答します。
通常のAJAX
通常のAJAXリクエストを実行するために、ブラウザはXHR オブジェクトは、URL を指定してデータを取得します。XHR オブジェクトは同じドメインのデータのみを信頼します。これは厳しい制限です。現在のブラウザでは回避できません (編集 - CORS を使用できるようになりました)。
解決策 - XHR を使用しない
XHRは同じドメインポリシーの対象となるため、XHRを使用してクロスドメインAJAXを行うことはできません幸いなことに、リモート サーバーにアクセスする方法は他にもあります。たとえば、ページにイメージ タグを追加できます。また、スクリプト タグを追加して、リモート サーバーを指す src 属性を指定することもできます。たとえば、CDN から JQuery を取得して、それが機能することを期待できます。
JSONP の仕組み。
JSONPリクエストを行うと、コードはページにスクリプトタグを動的に追加しますスクリプト タグには、CDN からスクリプトを挿入する場合と同じように、リモート JSONP API URL を指すソース属性があります。
サーバーから返されるJSONPスクリプトは関数呼び出しでラップされるスクリプトがダウンロードされると、関数が自動的に実行されます。
このため、スクリプトをラップするコールバック関数の名前を JSONP に伝える必要があります。その関数は、スクリプトがダウンロードされると呼び出されます。
セキュリティ上の懸念
ここでは、かなり大きなセキュリティ上の懸念があります。ダウンロードするスクリプトがページを制御し、ユーザーを危険にさらす可能性があります。JSONP はユーザーにとって安全ではなく、Web ブラウザーによってブロックされないだけです。JSONPは実際に私たちが利用しているブラウザのエクスプロイトです注意してご使用ください。
ただし、賢く使用すれば、JSONP は非常に優れたものになります。