Vậy, JSONP hay CORS? [đóng cửa]


111

WebAPI của tôi đã được triển khai trong môi trường Intranet . Điều đó có nghĩa là an ninh không phải là mối quan tâm của tôi.

Có vẻ như CORS thân thiện hơn với khách hàng và dễ thực hiện hơn .

Bất kỳ mối quan tâm nào khác mà tôi có thể đã bỏ qua?

Câu trả lời:


144

Đây là một câu hỏi khá rộng, và có thể đảm bảo cho chính wiki. Cũng có khá nhiều thông tin trên google về cả hai, nhưng tôi nghĩ tôi có thể nhấn mạnh một vài điểm chính.

  • Nếu bạn cần giao diện ajax chỉ đọc cho máy chủ của mình và bạn cần hỗ trợ IE <= 9, Opera <12, hoặc Firefox <3.5 hoặc nhiều trình duyệt cũ hơn hoặc ít người biết khác, CORS không có sẵn, hãy sử dụng JSONP. IE8 và IE9 sorta hỗ trợ CORS nhưng có vấn đề, hãy xem liên kết trong nhận xét đầu tiên bên dưới.
  • Mặt khác, nếu API web của bạn được đọc / ghi (ví dụ: REST đầy đủ hoặc chỉ POST / GET) thay vì chỉ đọc (tức là GET), JSONP sẽ bị loại bỏ. Sử dụng CORS. JSONP vốn là chỉ đọc.

Nếu cả hai đều không phải là mối quan tâm, tôi sẽ chỉ đi với bất cứ điều gì dễ dàng nhất hoặc quen thuộc nhất với bạn. Nếu nó là một sự cố, hãy thử CORS, vì nó là giải pháp "hiện đại" hơn và JSONP thiên về hack, biến dữ liệu thành các tập lệnh để vượt qua các hạn chế miền chéo. Tuy nhiên, CORS thường yêu cầu nhiều cấu hình phía máy chủ hơn.

Nếu bạn đang sử dụng jQuery, tôi không chắc bạn đang nảy ra ý tưởng từ đâu rằng CORS " thân thiện hơn nhiều với khách hàng và dễ triển khai hơn ." Xem https://gist.github.com/3131951 . jQuery tóm tắt các chi tiết của JsonP và CORS thực sự có thể hơi phức tạp khi cấy vào phía máy chủ của bạn tùy thuộc vào công nghệ bạn đang sử dụng.

Gần đây tôi đã phát triển một ứng dụng web, sử dụng jquery và backbone.js, ứng dụng này đọc từ các dịch vụ web đa miền khác nhau mà chúng tôi kiểm soát và cuối cùng sử dụng Json-P thay vì CORS vì chúng tôi cần hỗ trợ IE7 và nó đơn giản hơn một chút. phía máy chủ (chúng tôi chạy Django w / DjangoRestFramework) và hầu như tương tự với jquery ở phía máy khách.


3
Nếu bạn đang hỗ trợ IE8 và IE9, nó cũng có thể loại trừ CORS do Loại nội dung bị buộc phải "văn bản / thuần túy", hãy xem điểm (4) tại blog.msdn.com/b/ieinternals/archive/2010/05 / 13 / ...
jamiebarrow

Ý chính trong câu trả lời của bạn rất hữu ích, cảm ơn!
MVCDS

Những gì tôi hiểu là JSONP bạn phải xử lý ở phía máy khách và CORS bạn phải xử lý ở phía máy chủ. chính xác?
Dips

Tôi chỉ muốn nói thêm rằng ngay cả jsonp cũng có thể được gọi thông qua GET, bạn có thể viết mã chương trình phụ trợ của mình để thực hiện ghi. Bạn có thể truyền tham số trên chuỗi truy vấn, vì vậy bạn có thể mô phỏng đăng, đặt, vá với tham số GET và quesystring. (tất nhiên không phải là lý tưởng)
Gabriel Carignano

45

Bạn đang ở vị trí đẹp. Nếu bạn không phải hỗ trợ các trình duyệt cũ (những trình duyệt được phát hành hơn 6 năm trước), tôi chắc chắn sẽ sử dụng CORS.

CORS dễ triển khai hơn, trong đó nếu API của bạn chưa hỗ trợ JSONP hoặc CORS, thì việc thêm một vài tiêu đề tĩnh sẽ dễ dàng hơn là sửa đổi nội dung phản hồi.

Ngoài ra, việc lưu vào bộ nhớ cache các yêu cầu bằng CORS cũng dễ dàng hơn. Mỗi yêu cầu JSONP cần phải động ngay cả với nội dung memcached.

JSONP vẫn là một thẻ script, vì vậy bất kể điều gì, nó sẽ gây ra một số mức độ hành vi đồng bộ. CORS sẽ không.

JSONP chỉ có thể là GET. Và như với CORS, bạn có thể sử dụng bất kỳ phương pháp nào.


3
Tôi đánh giá cao thông tin "hành vi đồng bộ".
Juan Lanus

Tôi tin rằng bạn có thể thực hiện tải xuống tập lệnh theo kiểu không đồng bộ. JQuery cung cấp tham số này trên các yêu cầu ajax của nó. Tôi không chắc liệu nó có hoạt động với jsonp hay không. api.jquery.com/jquery.ajax
eran otzap

11

Cuối cùng nhưng không kém phần quan trọng, nếu bạn đang sử dụng jQuery v1.x , hãy cân nhắc rằng errorcomplete(hoặc tốt hơn failalways) các trình xử lý vẫn không được gọi cho các yêu cầu JSONP trong một số trường hợp phổ biến (ví dụ: lỗi mạng). Chắc chắn có những cách giải quyết (cài đặt thời gian chờ, plugin jQuery-JSONP), nhưng tôi thấy CORS ít gây phiền nhiễu hơn, đặc biệt khi các yêu cầu tên miền chéo chỉ đến từ thiết bị di động (tức là ứng dụng kết hợp), vì vậy bạn không cần hỗ trợ cho các trình duyệt kém may mắn.


1
+1 để biết thông tin về các cuộc gọi lại
flatjimbo

1

Theo Spring Documentation, JSONP là một cuộc tấn công và không phải là giải pháp thích hợp của Chia sẻ tài nguyên nguồn gốc chéo. Vì vậy, nếu vấn đề bảo mật không phải là mối quan tâm của bạn thì bạn chỉ cần kiểm tra nguồn gốc miền trên máy chủ của mình và thêm tiêu đề Access-Control-Allow-Origin Response.


-1

API Web của chúng tôi không hoạt động trên Safari (iOS 9.1) với Xác thực Windows. Nó đã hoạt động với Safari + iOS 8.4. Khi chúng tôi đổi sang JSONP, Safari bắt đầu hoạt động trở lại. Kiểm tra liên kết này để biết thêm thông tin.


Đây cũng là một bài báo hay - blog.algolia.com/jsonp-still-mandatory
Anoop.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.