ดังนั้น JSONP หรือ CORS? [ปิด]


111

WebAPI ของฉันถูกปรับใช้ในสภาพแวดล้อมอินทราเน็ต นั่นหมายความว่าการรักษาความปลอดภัยก็ไม่ได้กังวลของฉัน

มันดูเหมือนว่า ธ เป็นมิตรมากขึ้นให้กับลูกค้าและง่ายต่อการใช้

มีข้อกังวลอื่นใดที่ฉันอาจพลาดไป?

คำตอบ:


144

นี่เป็นคำถามที่ค่อนข้างกว้างและสามารถรับประกันวิกิตัวเองได้ นอกจากนี้ยังมีค่อนข้างน้อยใน Google เกี่ยวกับทั้งสอง แต่ฉันคิดว่าฉันสามารถเข้าถึงประเด็นสำคัญบางประการได้

  • หากคุณต้องการอินเทอร์เฟซ ajax แบบอ่านอย่างเดียวสำหรับเซิร์ฟเวอร์ของคุณและคุณต้องรองรับ IE <= 9, Opera <12 หรือ Firefox <3.5 หรือเบราว์เซอร์รุ่นเก่าหรือที่คลุมเครืออื่น ๆ CORS ไม่สามารถใช้งานได้ให้ใช้ JSONP IE8 และ IE9 sorta รองรับ CORS แต่มีปัญหาดูลิงค์ในความคิดเห็นแรกด้านล่าง
  • ในทางกลับกันถ้า Web API ของคุณเป็นแบบอ่าน / เขียน (เช่น REST แบบเต็มหรือแค่ POST / GET) แทนที่จะอ่านเฉยๆ (เช่น GET) JSONP จะไม่ทำงาน ใช้ CORS JSONP เป็นแบบอ่านอย่างเดียวโดยเนื้อแท้

หากสิ่งเหล่านี้ไม่ใช่สิ่งที่น่ากังวลฉันจะไปกับสิ่งที่ง่ายที่สุดหรือคุ้นเคยที่สุดสำหรับคุณ หากเป็นแบบ tossup ให้ลองใช้ CORS เนื่องจากเป็นโซลูชันที่ "ทันสมัยกว่า" และ JSONP เป็นแฮ็กมากกว่าโดยเปลี่ยนข้อมูลให้เป็นสคริปต์เพื่อข้ามข้อ จำกัด ข้ามโดเมน อย่างไรก็ตาม CORS ต้องการการกำหนดค่าฝั่งเซิร์ฟเวอร์มากขึ้น

หากคุณใช้ jQuery ฉันไม่แน่ใจว่าคุณคิดว่า CORS นั้น " เป็นมิตรกับลูกค้ามากกว่ามากและง่ายต่อการนำไปใช้ " ดูhttps://gist.github.com/3131951 jQuery สรุปรายละเอียดของ JsonP และ CORS อาจเป็นเรื่องยากที่จะฝังในฝั่งเซิร์ฟเวอร์ของคุณขึ้นอยู่กับเทคโนโลยีที่คุณใช้

ฉันเพิ่งพัฒนาเว็บแอปโดยใช้ jquery และ backbone.js ซึ่งอ่านจากบริการเว็บข้ามโดเมนต่างๆที่เราควบคุมและลงเอยด้วยการใช้ Json-P แทน CORS เพราะเราต้องรองรับ IE7 และมันก็ง่ายกว่าเล็กน้อย ฝั่งเซิร์ฟเวอร์ (เรารัน Django w / DjangoRestFramework) และแทบจะเหมือนกันกับ jquery ในฝั่งไคลเอ็นต์


3
หากคุณรองรับ IE8 และ IE9 ก็ยังสามารถตัด CORS ได้เนื่องจาก Content-Type ถูกบังคับให้เป็น "text / plain" โปรดดูจุด (4) ที่blogs.msdn.com/b/ieinternals/archive/2010/05 / 13 / …
jamiebarrow

สาระสำคัญในคำตอบของคุณมีประโยชน์มากขอบคุณ!
MVCDS

สิ่งที่ฉันเข้าใจคือ JSONP ที่คุณต้องจัดการในฝั่งไคลเอ็นต์และ CORS ที่คุณต้องจัดการในฝั่งเซิร์ฟเวอร์ แก้ไข?
จุ่ม

ฉันแค่ต้องการเพิ่มว่าแม้แต่ jsonp ก็สามารถเรียกผ่าน GET ได้คุณสามารถโค้ดแบ็กเอนด์ของคุณเพื่อทำการเขียนได้ คุณสามารถส่งผ่านพารามิเตอร์บนสตริงการสืบค้นเพื่อให้คุณสามารถจำลองโพสต์วางแพตช์ด้วยพารามิเตอร์ GET และ quesystring (ไม่ใช่อุดมคติแน่นอน)
Gabriel Carignano

45

คุณเป็นคนสวย หากคุณไม่ต้องรองรับเบราว์เซอร์เดิม (ที่ออกเมื่อ 6 ปีก่อน) ฉันจะไปกับ CORS อย่างแน่นอน

CORS ใช้งานได้ง่ายกว่าหาก API ของคุณยังไม่รองรับ JSONP หรือ CORS การเพิ่มส่วนหัวแบบคงที่เพียงไม่กี่ตัวจะง่ายกว่าการแก้ไขเนื้อหาของการตอบสนอง

นอกจากนี้ยังง่ายกว่าในการแคชคำขอโดยใช้ CORS คำขอ JSONP แต่ละรายการจะต้องเป็นแบบไดนามิกแม้ว่าจะมีเนื้อหาแบบ memcached ก็ตาม

JSONP ยังคงเป็นแท็กสคริปต์ดังนั้นไม่ว่าอะไรจะทำให้เกิดพฤติกรรมซิงโครนัสในระดับหนึ่ง CORS จะไม่

JSONP สามารถเป็น GET เท่านั้น และเช่นเดียวกับ CORS คุณสามารถใช้วิธีใดก็ได้


3
ฉันชอบข้อมูล "พฤติกรรมซิงโครนัส"
Juan Lanus

ฉันเชื่อว่าคุณสามารถดาวน์โหลดสคริปต์แบบไม่ซิงค์ JQuery จัดเตรียมพารามิเตอร์นี้ในคำขอ ajax ฉันไม่แน่ใจว่ามันใช้ได้กับ jsonp หรือเปล่า api.jquery.com/jquery.ajax
eran otzap

11

สุดท้าย แต่ไม่ท้ายสุดหากคุณใช้ jQuery v1.xให้พิจารณาว่าตัวจัดการerrorและcomplete(หรือดีกว่าfailและalways) ยังไม่ถูกเรียกสำหรับคำขอ JSONP ในสถานการณ์ทั่วไปบางอย่าง (เช่นข้อผิดพลาดของเครือข่าย) แน่นอนว่ามีวิธีแก้ปัญหา (การตั้งค่าการหมดเวลาปลั๊กอิน jQuery-JSONP) แต่ฉันพบว่า CORS น่ารำคาญน้อยกว่าโดยเฉพาะอย่างยิ่งเมื่อคำขอข้ามโดเมนมาจากอุปกรณ์มือถือเท่านั้น (เช่นแอปไฮบริด) ดังนั้นคุณจึงไม่ต้องการการสนับสนุนสำหรับเบราว์เซอร์ที่โชคร้าย


1
+1 สำหรับข้อมูลเกี่ยวกับการโทรกลับ
plainjimbo

1

ตาม Spring Documentation JSONP เป็นการแฮ็กและไม่ใช่วิธีแก้ปัญหาที่เหมาะสมของ Cross Origin Resource Sharing ดังนั้นหากคุณไม่กังวลเรื่องความปลอดภัยให้ตรวจสอบที่มาของโดเมนบนเซิร์ฟเวอร์ของคุณและเพิ่มส่วนหัว Access-Control-Allow-Origin Response


-1

Web API ของเราไม่ทำงานบน Safari (iOS 9.1) ที่มี Windows Authentication มันทำงานร่วมกับ Safari + iOS 8.4 เมื่อเราเปลี่ยนเป็น JSONP Safari เริ่มทำงานอีกครั้ง ตรวจสอบลิงค์นี้สำหรับข้อมูลเพิ่มเติม


นี่เป็นบทความที่ดีเช่นกัน - blog.algolia.com/jsonp-still-mandatory
Anoop
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.