Jadi, JSONP atau CORS? [Tutup]

111

WebAPI saya diterapkan di lingkungan Intranet . Itu berarti keamanan bukanlah urusan saya.

Tampaknya CORS jauh lebih bersahabat dengan klien dan lebih mudah diimplementasikan .

Ada kekhawatiran lain yang mungkin saya lewatkan?

rhapsodyn
sumber

Jawaban:

144

Ini adalah pertanyaan yang cukup luas, dan bisa menjamin wiki itu sendiri. Ada juga sedikit di google mengenai keduanya, tapi saya pikir saya bisa mencapai beberapa poin penting.

  • Jika Anda memerlukan antarmuka ajax hanya-baca ke server Anda dan Anda perlu mendukung IE <= 9, Opera <12, atau Firefox <3.5 atau berbagai browser lama atau tidak jelas lainnya, CORS sudah keluar, gunakan JSONP. IE8 dan IE9 agak mendukung CORS tetapi mengalami masalah, lihat tautan di komentar pertama di bawah.
  • Di sisi lain, jika API web Anda adalah baca / tulis (mis. REST penuh atau hanya POST / GET) daripada hanya membaca (mis. GET), JSONP tidak aktif. Gunakan CORS. JSONP pada dasarnya hanya-baca.

Jika tidak satu pun dari ini yang menjadi perhatian, saya akan memilih apa pun yang paling mudah atau paling Anda kenal. Jika ini adalah lemparan, coba CORS, karena ini adalah solusi yang lebih "modern" dan JSONP lebih merupakan peretasan, mengubah data menjadi skrip untuk melewati batasan lintas domain. Namun, CORS biasanya memerlukan lebih banyak konfigurasi sisi server.

Jika Anda menggunakan jQuery, saya tidak yakin dari mana Anda mendapatkan gagasan bahwa CORS " jauh lebih bersahabat dengan klien dan lebih mudah diimplementasikan ." Lihat https://gist.github.com/3131951 . jQuery mengabstraksi detail JsonP, dan CORS sebenarnya bisa agak rumit untuk diterapkan di sisi server Anda tergantung pada teknologi apa yang Anda gunakan.

Saya baru-baru ini mengembangkan aplikasi web, menggunakan jquery dan backbone.js, yang membaca dari berbagai layanan web lintas-domain yang kami kontrol, dan akhirnya menggunakan Json-P daripada CORS karena kami perlu mendukung IE7 dan itu sedikit lebih sederhana. sisi server (kami menjalankan Django w / DjangoRestFramework), dan hampir sama dengan jquery pada sisi klien.

Ben Roberts
sumber
3
Jika Anda mendukung IE8 dan IE9, itu juga dapat mengesampingkan CORS karena Jenis Konten dipaksa menjadi "teks / biasa", lihat poin (4) di blogs.msdn.com/b/ieinternals/archive/2010/05 / 13 /…
jamiebarrow
Inti jawaban Anda sangat membantu, terima kasih!
MVCDS
Apa yang saya pahami adalah JSONP yang harus Anda tangani di sisi klien dan CORS yang harus Anda tangani di sisi server. benar?
Turun
Saya hanya ingin menambahkan bahwa bahkan jsonp dapat dipanggil melalui GET, Anda dapat mengkodekan backend Anda untuk melakukan penulisan. Anda bisa meneruskan parameter pada querystring, sehingga Anda bisa mensimulasikan post, put, patch dengan GET dan quesystring params. (bukan yang ideal tentu saja)
Gabriel Carignano
45

Anda sangat tepat. Jika Anda tidak harus mendukung browser lama (yang dirilis 6+ tahun yang lalu) saya pasti akan menggunakan CORS.

CORS lebih mudah diimplementasikan, karena jika API Anda belum mendukung JSONP atau CORS, lebih mudah untuk menambahkan beberapa header statis daripada memodifikasi isi respons.

Juga lebih mudah untuk menyimpan permintaan dalam cache menggunakan CORS. Setiap permintaan JSONP harus dinamis bahkan dengan konten memcache.

JSONP masih merupakan tag skrip, jadi apa pun yang terjadi itu akan menyebabkan beberapa tingkat perilaku sinkron. CORS tidak akan.

JSONP hanya bisa menjadi GET. Dan seperti CORS, Anda dapat menggunakan metode apa pun.

pengguna2175183
sumber
3
Saya menghargai informasi "perilaku sinkronis".
Juan Lanus
Saya yakin Anda dapat mengunduh skrip dengan cara asinkron. JQuery menyediakan parameter ini pada permintaan ajax itu. Saya tidak yakin apakah ini berfungsi untuk jsonp atau tidak. api.jquery.com/jquery.ajax
eran otzap
11

Last but not least, jika Anda menggunakan jQuery v1.x , pertimbangkan bahwa errordan complete(atau lebih baik faildan always) penangan masih tidak dipanggil untuk permintaan JSONP dalam beberapa situasi umum (misalnya kesalahan jaringan). Tentu ada solusi (pengaturan waktu tunggu, plugin jQuery-JSONP), tetapi saya menemukan CORS tidak terlalu mengganggu, terutama ketika permintaan lintas domain hanya datang dari perangkat seluler (yaitu aplikasi hybrid) sehingga Anda tidak memerlukan dukungan untuk browser yang tidak beruntung.

matpop
sumber
1
1 untuk info tentang panggilan balik
plainjimbo
1

Menurut Dokumentasi Musim Semi, JSONP adalah peretasan dan bukan solusi yang tepat untuk Berbagi Sumber Daya Lintas Asal. Jadi jika keamanan bukan urusan Anda, cukup periksa asal domain di server Anda dan tambahkan header Access-Control-Allow-Origin Response.

MDaniyal
sumber
-1

API Web kami tidak berfungsi di Safari (iOS 9.1) dengan Autentikasi Windows. Itu bekerja dengan Safari + iOS 8.4. Ketika kami mengubah ke JSONP Safari mulai bekerja kembali. Cek link ini untuk informasi lebih lanjut.

Anoop
sumber
Ini adalah artikel yang bagus juga - blog.algolia.com/jsonp-still-mandatory
Anoop