Same-origin policy
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy
La "Same-Origin policy" (politica del mismo origen) controla que sólo que los scripts que provengan del mismo origen (mismo esquema, hostname y puerto)) y que son ejecutados en diferentes paginas (ventanas, tabs) puedan acceder sin restricciones a sus respectivos DOM
Mismo Origen:
http://site.com http://site.com/ http://site.com/my/page.htmlDiferente Origen:
http://www.site.com (another domain) http://site.org (another domain) https://site.com (another protocol) http://site.com:8080 (another port)Esta politica se aplica tambien a las peticiones AJAX (XMLHttpRequest) lo que significa que sólo podremos hacer peticiones AJAX al host que sirve la pagina web donde se ejecuta el código
Los WebSockets no estan sujeto a esta politica (con ellos podras comunicar partes en diferentes dominios)
Esta politica viene implementada en TODOS los navegadores (antiguos y modernos)
De forma nativa, sólo podremos incluir recursos de otros dominios con los siguientes elementos:
- Archivos Javascript con
<script src="..."></script> - Archivos CSS con
<link rel="stylesheet" href="..."> - Imágenes con
<img> - Archivos Multimedia con
<video>y<audio> - Plug-ins con
<object>,<embed>y<applet> - Fuentes con
@font-face - Cualquier otra pagina con
<frame>and<iframe>
- Archivos Javascript con
Sin embargo existen maneras de "saltarse" esta politica: JSONP y CORS
JSONP vs CORS
http://www.formandome.es/javascript/cors-vs-jsonp-solicitudes-ajax-entre-dominios/
http://blog.koalite.com/2012/03/sopa-de-siglas-ajax-json-jsonp-y-cors/
http://stackoverflow.com/questions/12296910/so-jsonp-or-cors
La recomendación general es usar CORS siempre que se pueda, pero hay que tener en cuenta lo siguiente:
- CORS soporta mas metodos HTTP (
GET,PUT,POST,DELETE) que JSONP (sóloGET) - Puedes utilizar JSONP en cualquier navegador (antiguo y moderno). Sin embargo CORS solo funcionará en algunos navegadores (los que soporten xhr2)
- Hay mas API's publicas que ofrecen acceso a datos via JSONP que via CORS
- CORS (el servidor decide a quien da acceso y cómo) es mas seguro que JSONP (cross-origin via
scriptinjection) - Con CORS hay un mejor manejo de errores que con JSONP
- Tanto CORS como JSONP requieren que el servidor esté preparado para ellos