Yani, JSONP veya CORS? [kapalı]


111

WebAPI'm Intranet ortamında konuşlandırıldı . Bu, güvenliğin benim endişem olmadığı anlamına geliyor .

Görünüşe göre CORS, müşteri için çok daha kolay ve uygulaması daha kolay .

Kaçırmış olabileceğim başka endişeler var mı?

Yanıtlar:


144

Bu oldukça geniş bir sorudur ve kendi başına bir wiki gerektirebilir. İkisiyle ilgili de google'da epey bir şey var, ancak birkaç önemli noktaya ulaşabileceğimi düşünüyorum.

  • Sunucularınız için salt okunur bir ajax arayüzüne ihtiyacınız varsa ve IE <= 9, Opera <12 veya Firefox <3.5 veya çeşitli diğer eski veya belirsiz tarayıcıları desteklemeniz gerekiyorsa, CORS devre dışı, JSONP kullanın. IE8 ve IE9 sorta CORS'u destekliyor ancak sorunları var, aşağıdaki ilk yorumdaki bağlantıya bakın.
  • Öte yandan, web API'niz sadece okumak (yani GET) yerine okunur / yazılırsa (ör. Tam REST veya yalnızca POST / GET), JSONP devre dışıdır. CORS kullanın. JSONP doğası gereği salt okunurdur.

Bunların hiçbiri endişe verici değilse, size en kolay veya en tanıdık gelen şeyle giderim. Bu bir hata ise, CORS'u deneyin, çünkü daha "modern" bir çözüm ve JSONP daha çok bir hack'tir, alanlar arası kısıtlamaları aşmak için verileri komut dosyalarına dönüştürür. Ancak CORS, tipik olarak daha fazla sunucu tarafı yapılandırması gerektirir.

JQuery kullanıyorsanız, CORS'un " müşteri için çok daha dostça ve uygulaması daha kolay " olduğu fikrini nereden bulduğunuzdan emin değilim . Https://gist.github.com/3131951 adresine bakın . jQuery, JsonP'nin ayrıntılarını özetler ve CORS, hangi teknolojiyi kullandığınıza bağlı olarak sunucu tarafınızda uygulanması biraz zor olabilir.

Yakın zamanda jquery ve backbone.js kullanarak, kontrol ettiğimiz çeşitli etki alanları arası web hizmetlerinden okuyan bir web uygulaması geliştirdim ve IE7'yi desteklememiz gerektiğinden CORS yerine Json-P kullanmaya başladım ve bu biraz daha basitti sunucu tarafında (DjangoRestFramework w / DjangoRestFramework çalıştırıyoruz) ve istemci tarafında jquery ile hemen hemen aynı.


3
IE8 ve IE9'u destekliyorsanız, İçerik Türü "metin / düz" olmaya zorlandığı için CORS'u
jamiebarrow

Cevabınızın özü çok yardımcı oldu, teşekkürler!
MVCDS

Anladığım şey, istemci tarafında halletmeniz gereken JSONP ve sunucu tarafında halletmeniz gereken CORS. doğru?
Dips

Sadece eklemek istiyorum ki jsonp bile GET aracılığıyla çağrılabilir, yazma yapmak için arka ucunuzu kodlayabilirsiniz. Bir GET ve quesystring parametreleriyle gönderi, yerleştirme, yama benzetimi yapabilmek için sorgu dizesine parametre aktarabilirsiniz. (elbette ideal değil)
Gabriel Carignano

45

İyi bir yerdesin. Eski tarayıcıları (6+ yıl önce piyasaya sürülenleri) desteklemeniz gerekmiyorsa, kesinlikle CORS ile giderim.

CORS'un uygulanması daha kolaydır, çünkü API'niz JSONP veya CORS'yi zaten desteklemiyorsa, yanıtların gövdesini değiştirmekten yalnızca birkaç statik başlık eklemek daha kolaydır.

Ayrıca CORS kullanarak istekleri önbelleğe almak daha kolaydır. Her JSONP isteğinin, memcached içeriğiyle bile dinamik olması gerekir.

JSONP hala bir komut dosyası etiketidir, bu nedenle ne olursa olsun bazı eşzamanlı davranışlara neden olur. CORS olmayacak.

JSONP yalnızca bir GET olabilir. Ve CORS ile olduğu gibi herhangi bir yöntemi kullanabilirsiniz.


3
"Eşzamanlı davranış" bilgisini takdir ettim.
Juan Lanus

Eşzamansız bir şekilde bir komut dosyası indirme işlemi yapabileceğinize inanıyorum. JQuery bu parametreyi ajax isteklerinde sağlar. Jsonp için çalışıp çalışmadığından emin değilim. api.jquery.com/jquery.ajax
eran otzap

11

Son fakat en az değil, jQuery v1.x kullanıyorsanız , bunu errorve complete(veya daha iyisi failve always) işleyicilerin bazı yaygın durumlarda (örneğin ağ hataları) JSONP istekleri için hala çağrılmadığını göz önünde bulundurun . Elbette geçici çözümler var (zaman aşımı ayarı, jQuery-JSONP eklentisi), ancak özellikle etki alanları arası istekler yalnızca mobil cihazlardan (yani hibrit uygulamalardan) geldiğinde CORS'u daha az can sıkıcı buluyorum, bu nedenle şanssız tarayıcılar için desteğe ihtiyacınız yok.


1
Geri aramalar hakkında bilgi için +1
Plainjimbo

1

Spring Documentation'a göre JSONP bir hack'tir ve Cross Origin Resource Sharing için uygun bir çözüm değildir. Dolayısıyla, endişeniz güvenlik değilse, sunucunuzdaki etki alanı kaynağınızı kontrol edin ve Access-Control-Allow-Origin Response başlığını ekleyin.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.