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.html
Diferente 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
script
injection) - Con CORS hay un mejor manejo de errores que con JSONP
- Tanto CORS como JSONP requieren que el servidor esté preparado para ellos