JSONPかCORSか?[閉まっている]


111

私のWebAPIはイントラネット環境にデプロイされました。つまり、セキュリティは私の関心事ではありませんでした。

CORSはクライアントにとってより親しみやすく、実装しやすいようです。

私が見逃したかもしれない他の懸念はありますか?

回答:


144

これはかなり広範な質問であり、wiki自体を正当化する可能性があります。グーグルにはこの2つに関してかなりの部分もありますが、いくつかの重要な点にぶつかると思います。

  • サーバーへの読み取り専用のajaxインターフェースが必要で、IE <= 9、Opera <12、Firefox <3.5、またはその他のさまざまな古いブラウザーやあいまいなブラウザーをサポートする必要がある場合、CORSはリリースされています。JSONPを使用してください。IE8とIE9はCORSをサポートしていますが、問題があります。以下の最初のコメントのリンクを参照してください。
  • 一方、Web APIが読み取り(つまりGET)ではなく読み取り/書き込み(たとえば、完全なRESTまたは単にPOST / GET)である場合、JSONPはアウトです。CORSを使用します。JSONPは本質的に読み取り専用です。

これらのどちらも問題ではない場合、私はあなたにとって最も簡単で、なじみのあるものを使います。それが問題である場合は、CORSを試してください。CORSはより「モダンな」ソリューションであり、JSONPはハックのようなものであり、データをスクリプトに変換して、クロスドメインの制限をバイパスします。ただし、CORSは通常、より多くのサーバー側の構成を必要とします。

jQueryを使用している場合、CORSが「クライアントにとってはるかに使いやすく、実装が容易である」という考えをどこで思いついているかわかりません。https://gist.github.com/3131951を参照してください。jQueryはJsonPの詳細を抽象化します。CORSは実際には、使用しているテクノロジーによっては、サーバー側で実装するのが多少難しい場合があります。

私は最近、jqueryとbackbone.jsを使用してWebアプリを開発しました。これは、私たちが制御するさまざまなクロスドメインWebサービスから読み取り、IE7をサポートする必要があるため、CORSではなくJson-Pを使用することになりました。サーバー側(Django w / DjangoRestFrameworkを実行)、およびクライアント側のjqueryと実質的に同じです。


3
IE8とIE9をサポートしている場合は、Content-Typeが「text / plain」に強制されるため、CORSを除外することもできます。blogs.msdn.com/ b / ieinternals / archive / 2010/05の
jamiebarrow 2014年

あなたの答えの要点はとても役に立ちます、ありがとう!
MVCDS

私が理解したのは、クライアント側で処理する必要があるJSONPとサーバー側で処理する必要があるCORSです。正しい?
ディップ

jsonpでもGETから呼び出せることを追加したいだけです。書き込みを実行するようにバックエンドをコーディングできます。クエリ文字列にパラメータを渡すことができるため、GETおよびクエリ文字列パラメータを使用して、ポスト、プット、パッチをシミュレートできます。(もちろん理想ではありません)
ガブリエルカリニャーノ

45

あなたはかなり満足しています。レガシーブラウザ(6年以上前にリリースされたもの)をサポートする必要がない場合は、必ずCORSを使用します。

CORSは実装が簡単です。APIがJSONPまたはCORSをまだサポートしていない場合は、応答の本文を変更するよりも、いくつかの静的ヘッダーを追加する方が簡単です。

また、CORSを使用してリクエストをキャッシュする方が簡単です。各JSONPリクエストは、memcachedコンテンツでも動的である必要があります。

JSONPは依然としてスクリプトタグであるため、それが何らかのレベルの同期動作を引き起こすかどうかは関係ありません。CORSはしません。

JSONPはGETのみにすることができます。CORSと同様に、任意の方法を使用できます。


3
「同期動作」の情報を高く評価しました。
Juan Lanus 2013年

スクリプトを非同期でダウンロードできると思います。jQueryは、このパラメーターをajaxリクエストに提供します。jsonpで動作するかどうかはわかりません。 api.jquery.com/jquery.ajax
eran otzap

11

最後に重要なことですが、jQuery v1.xを使用している場合、errorおよびcomplete(またはそれ以上のfailand always)ハンドラーは、いくつかの一般的な状況(ネットワークエラーなど)ではJSONPリクエストに対してまだ呼び出されないことを考慮してください。確かに回避策はありますが(タイムアウト設定、jQuery-JSONPプラグイン)、クロスドメインリクエストがモバイルデバイス(ハイブリッドアプリなど)からのみ送信される場合は特にCORSの煩わしさが感じられないので、不幸なブラウザーのサポートは必要ありません。


1
コールバックに関する情報の+1
plainjimbo 2014年

1

Springドキュメントによると、JSONPはハックであり、クロスオリジンリソースシェアリングの適切なソリューションではありません。したがって、セキュリティが問題ではない場合は、サーバーのドメインオリジンを確認し、Access-Control-Allow-Origin Responseヘッダーを追加します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.