Also, JSONP oder CORS? [geschlossen]

111

Meine WebAPI wurde in der Intranetumgebung bereitgestellt . Das heißt, Sicherheit war nicht mein Anliegen.

Es scheint, dass CORS für den Kunden viel freundlicher und einfacher zu implementieren ist .

Irgendwelche anderen Bedenken, die ich möglicherweise übersehen habe?

Rhapsodyn
quelle

Antworten:

144

Dies ist eine ziemlich weit gefasste Frage, die ein Wiki für sich rechtfertigen könnte. Es gibt auch einiges auf Google in Bezug auf die beiden, aber ich denke, ich kann ein paar wichtige Punkte treffen.

  • Wenn Sie eine schreibgeschützte Ajax-Schnittstelle für Ihre Server benötigen und IE <= 9, Opera <12 oder Firefox <3.5 oder verschiedene andere ältere oder undurchsichtige Browser unterstützen müssen, verwenden Sie JSONP. IE8 und IE9 unterstützen CORS, haben aber Probleme, siehe den Link im ersten Kommentar unten.
  • Wenn Ihre Web-API dagegen gelesen / geschrieben wird (z. B. Full REST oder nur POST / GET), anstatt nur zu lesen (dh GET), ist JSONP nicht verfügbar. Verwenden Sie CORS. JSONP ist von Natur aus schreibgeschützt.

Wenn beides nicht von Belang ist, würde ich mich einfach für das entscheiden, was Ihnen am einfachsten oder vertrautesten ist. Wenn es ein Fehler ist, versuchen Sie es mit CORS, da es die "modernere" Lösung ist und JSONP eher ein Hack ist, der Daten in Skripte umwandelt, um domänenübergreifende Einschränkungen zu umgehen. CORS erfordert jedoch normalerweise mehr serverseitige Konfiguration.

Wenn Sie jQuery verwenden, bin ich mir nicht sicher, woher Sie die Idee haben, dass CORS " viel benutzerfreundlicher und einfacher zu implementieren ist ". Siehe https://gist.github.com/3131951 . jQuery abstrahiert die Details von JsonP, und es kann je nach verwendeter Technologie schwierig sein, CORS auf Ihrer Serverseite zu implementieren.

Ich habe kürzlich eine Web-App mit jquery und backbone.js entwickelt, die von verschiedenen domänenübergreifenden Webdiensten liest, die wir steuern, und schließlich Json-P anstelle von CORS verwendet, da wir IE7 unterstützen müssen und dies etwas einfacher war auf der Serverseite (wir führen Django mit DjangoRestFramework aus) und praktisch dasselbe mit jquery auf der Clientseite.

Ben Roberts
quelle
3
Wenn Sie IE8 und IE9 unterstützen, kann CORS auch ausgeschlossen werden, da der Inhaltstyp zu "text / plain" gezwungen wird (siehe Punkt (4) unter blogs.msdn.com/b/ieinternals/archive/2010/05) / 13 /…
Jamiebarrow
Das Wesentliche in Ihrer Antwort ist sehr hilfreich, danke!
MVCDS
Was ich verstanden habe, ist JSONP, das Sie auf der Clientseite und CORS, das Sie auf der Serverseite behandeln müssen. richtig?
Dips
Ich möchte nur hinzufügen, dass sogar jsonp über GET aufgerufen werden kann. Sie können Ihr Backend codieren, um Schreibvorgänge durchzuführen. Sie können Parameter für den Querystring übergeben, um Post-, Put-, Patch- und Quesystring-Parameter zu simulieren. (natürlich nicht das Ideal)
Gabriel Carignano
45

Du bist genau richtig. Wenn Sie keine älteren Browser unterstützen müssen (die vor mehr als 6 Jahren veröffentlicht wurden), würde ich mich definitiv für CORS entscheiden.

CORS ist einfacher zu implementieren, da es einfacher ist, nur ein paar statische Header hinzuzufügen, wenn Ihre API JSONP oder CORS noch nicht unterstützt, als den Antwortkörper zu ändern.

Außerdem ist es einfacher, Anforderungen mit CORS zwischenzuspeichern. Jede JSONP-Anforderung muss auch bei zwischengespeicherten Inhalten dynamisch sein.

JSONP ist immer noch ein Skript-Tag, unabhängig davon, was es zu einem gewissen Grad an synchronem Verhalten führt. CORS wird nicht.

JSONP kann nur ein GET sein. Und wie bei CORS können Sie jede Methode anwenden.

user2175183
quelle
3
Ich habe die Informationen zum "synchronen Verhalten" geschätzt.
Juan Lanus
Ich glaube, Sie können ein Skript asynchron herunterladen. JQuery stellt diesen Parameter für seine Ajax-Anforderungen bereit. Ich bin nicht sicher, ob es für JSONP funktioniert oder nicht. api.jquery.com/jquery.ajax
eran otzap
11

Wenn Sie jQuery v1.x verwenden , sollten Sie berücksichtigen, dass errorund complete(oder besser failund always) Handler in einigen häufigen Situationen (z. B. Netzwerkfehlern) immer noch nicht für JSONP-Anforderungen aufgerufen werden. Sicher, es gibt Problemumgehungen (Timeout-Einstellung, jQuery-JSONP-Plugin), aber ich finde CORS weniger ärgerlich, insbesondere wenn domänenübergreifende Anfragen nur von mobilen Geräten (dh Hybrid-Apps) kommen, sodass Sie keine Unterstützung für unglückliche Browser benötigen.

Matpop
quelle
1
+1 für die Informationen über Rückrufe
plainjimbo
1

Laut Spring Documentation ist JSONP ein Hack und keine richtige Lösung für die gemeinsame Nutzung von Cross Origin-Ressourcen. Wenn die Sicherheit nicht Ihr Anliegen ist, überprüfen Sie einfach Ihren Domänenursprung auf Ihrem Server und fügen Sie den Header Access-Control-Allow-Origin Response hinzu.

MDaniyal
quelle
-1

Unsere Web-API funktionierte unter Safari (iOS 9.1) mit Windows-Authentifizierung nicht. Es funktionierte mit Safari + iOS 8.4. Als wir zu JSONP wechselten, begann Safari wieder zu arbeiten. Überprüfen Sie diesen Link für weitere Informationen.

Anoop
quelle
Dies ist auch ein guter Artikel - blog.algolia.com/jsonp-still-mandatory
Anoop