Respuestas:
Esta es una pregunta bastante amplia y podría justificar una wiki en sí misma. También hay bastante en Google con respecto a los dos, pero creo que puedo alcanzar algunos puntos clave.
Si ninguno de estos es una preocupación, simplemente elegiría lo que le resulte más fácil o familiar. Si es un problema, pruebe CORS, ya que es la solución más "moderna" y JSONP es más un truco, convirtiendo los datos en scripts para evitar las restricciones entre dominios. Sin embargo, CORS normalmente requiere más configuración del lado del servidor.
Si está utilizando jQuery, no estoy seguro de dónde se le ocurrió la idea de que CORS es " mucho más amigable para el cliente y más fácil de implementar ". Consulte https://gist.github.com/3131951 . jQuery abstrae los detalles de JsonP, y CORS puede ser algo complicado de implementar en el lado del servidor dependiendo de la tecnología que esté utilizando.
Recientemente desarrollé una aplicación web, usando jquery y backbone.js, que lee de varios servicios web entre dominios que controlamos, y terminé usando Json-P en lugar de CORS porque necesitamos admitir IE7 y era un poco más simple en del lado del servidor (ejecutamos Django con DjangoRestFramework), y prácticamente lo mismo con jquery en el lado del cliente.
Estás muy acertado. Si no tiene que admitir navegadores heredados (los lanzados hace más de 6 años) definitivamente iría con CORS.
CORS es más fácil de implementar, ya que si su API no es compatible con JSONP o CORS, es más fácil agregar algunos encabezados estáticos que modificar el cuerpo de las respuestas.
También es más fácil almacenar en caché las solicitudes usando CORS. Cada solicitud JSONP debe ser dinámica incluso con contenido en memcached.
JSONP sigue siendo una etiqueta de secuencia de comandos, por lo que no importa lo que cause algún nivel de comportamiento sincrónico. CORS no lo hará.
JSONP solo puede ser un GET. Y al igual que con CORS, puede usar cualquier método.
Por último, pero no menos importante, si usted está usando jQuery v1.x , tenga en cuenta que error
y complete
(o mejor fail
y always
) manipuladores todavía no están llamados a JSONP solicitudes en algunas situaciones comunes (por ejemplo, errores de red). Claro que hay soluciones alternativas (configuración de tiempo de espera, complemento jQuery-JSONP), pero CORS me resulta menos molesto, especialmente cuando las solicitudes entre dominios solo provienen de dispositivos móviles (es decir, aplicaciones híbridas), por lo que no necesita soporte para navegadores desafortunados.
Según Spring Documentation, JSONP es un truco y no una solución adecuada para compartir recursos de origen cruzado. Entonces, si la seguridad no es su preocupación, simplemente verifique el origen de su dominio en su servidor y agregue el encabezado Access-Control-Allow-Origin Response.
Nuestra API web no funcionaba en Safari (iOS 9.1) con autenticación de Windows. Funcionaba con Safari + iOS 8.4. Cuando cambiamos a JSONP, Safari comenzó a funcionar nuevamente. Consulte este enlace para obtener más información.