Respostas:
Esta é uma questão bastante ampla e poderia justificar um wiki por si só. Também há bastante no google sobre os dois, mas acho que posso acertar alguns pontos-chave.
Se nada disso for uma preocupação, eu simplesmente escolheria o que for mais fácil ou mais familiar para você. Se for um problema, tente o CORS, já que é a solução mais "moderna" e o JSONP é mais um hack, transformando dados em scripts para contornar as restrições entre domínios. O CORS, entretanto, normalmente requer mais configuração do lado do servidor.
Se você estiver usando jQuery, não tenho certeza de onde surgiu a ideia de que o CORS é " muito mais amigável para o cliente e mais fácil de implementar ". Consulte https://gist.github.com/3131951 . O jQuery abstrai os detalhes do JsonP, e o CORS pode ser um pouco complicado de implementar no lado do servidor, dependendo de qual tecnologia você está usando.
Recentemente, desenvolvi um aplicativo da web, usando jquery e backbone.js, que lê de vários serviços da web de domínio cruzado que controlamos, e acabei usando Json-P em vez de CORS porque precisamos oferecer suporte ao IE7 e era um pouco mais simples no do lado do servidor (rodamos Django c / DjangoRestFramework), e virtualmente o mesmo com jquery no lado do cliente.
Você está muito certo. Se você não tiver que oferecer suporte a navegadores legados (os lançados há mais de 6 anos), eu definitivamente escolheria o CORS.
O CORS é mais fácil de implementar, pois se sua API ainda não oferece suporte a JSONP ou CORS, é mais fácil apenas adicionar alguns cabeçalhos estáticos do que modificar o corpo das respostas.
Também é mais fácil armazenar solicitações em cache usando CORS. Cada solicitação JSONP precisa ser dinâmica, mesmo com conteúdo memcached.
JSONP ainda é uma tag de script, portanto, não importa o que cause algum nível de comportamento síncrono. CORS não.
JSONP só pode ser um GET. E, como no CORS, você pode usar qualquer método.
Por último, mas não menos importante, se você estiver usando jQuery v1.x , considere que os manipuladores error
and complete
(ou melhor fail
e always
) ainda não são chamados para solicitações JSONP em algumas situações comuns (por exemplo, erros de rede). Claro que existem soluções alternativas (configuração de tempo limite, plugin jQuery-JSONP), mas acho CORS menos irritante, especialmente quando as solicitações entre domínios vêm apenas de dispositivos móveis (ou seja, aplicativos híbridos), então você não precisa de suporte para navegadores azarados.
De acordo com a documentação do Spring, JSONP é um hack e não uma solução adequada de compartilhamento de recursos de origem cruzada. Portanto, se a segurança não é sua preocupação, basta verificar a origem do domínio no servidor e adicionar o cabeçalho Access-Control-Allow-Origin Response.
Nossa API Web não estava funcionando no Safari (iOS 9.1) com autenticação do Windows. Estava funcionando com Safari + iOS 8.4. Quando mudamos para JSONP, o Safari voltou a funcionar. Verifique este link para mais informações.