He estado leyendo sobre CORS
y cómo funciona, pero estoy encontrando muchas cosas confusas. Por ejemplo, hay muchos detalles sobre cosas como
Usuario Joe
está usando el navegador BrowserX
para obtener datos de site.com
,
que a su vez envía una solicitud a spot.com
. Para permitir esto, spot
tiene
encabezados especiales ... yada yada yada
Sin mucho conocimiento, no entiendo por qué los sitios web no permiten solicitudes desde algunos lugares. Quiero decir, existen para responder a las solicitudes, ¿no es así? ¿Por qué no se permiten ciertas personas de las solicitudes?
Realmente apreciaría una buena explicación (o un enlace a uno) del problema que CORS
está hecho para resolver
Entonces la pregunta es,
Cuál es el problema CORS
está resolviendo?
El comportamiento predeterminado de los navegadores web que inician solicitudes desde una página a través de JavaScript (AKA AJAX) es que siguen el política del mismo origen. Esto significa que las solicitudes solo se pueden realizar a través de AJAX al mismo dominio (o subdominio). Las solicitudes a un dominio completamente diferente fallarán.
Esta restricción existe porque las solicitudes realizadas en otros dominios por su navegador llevarían su galletas lo que a menudo significa que estarás conectado al otro sitio. Entonces, sin el mismo origen, cualquier sitio podría alojar JavaScript que llamara a logout en stackoverflow.com por ejemplo, y lo desconectaría. Ahora imagine las complicaciones cuando hablamos de redes sociales, sitios bancarios, etc.
Por lo tanto, todos los navegadores simplemente restringen las llamadas de red basadas en secuencias de comandos a su propio dominio para hacerlo simple y seguro.
El Sitio X en www.x.com no puede realizar solicitudes AJAX al sitio Y en www.y.com, solo a * .x.com
Existen algunas alternativas conocidas (como JSONP que no incluye cookies en la solicitud), pero estas no son una solución permanente.
CORS permite que se realicen estas solicitudes entre dominios, pero solo cuando cada lado opta por el soporte CORS.
Primero, hablemos de la misma política de origen. Voy a citar de una respuesta previa mía:
La política del mismo origen se inventó porque evita que el código de un sitio web acceda contenido restringido por credenciales en otro sitio. Las solicitudes de Ajax se envían por defecto con cualquier cookie de autenticación otorgada por el sitio de destino.
Por ejemplo, supongamos que accidentalmente cargo http://evil.com/
, que envía una solicitud de http://mail.google.com/
. Si el SOP no estaba en su lugar, y yo había iniciado sesión en Gmail, el script en evil.com
podría ver mi bandeja de entrada. Si el sitio en evil.com
quiere cargar mail.google.com
sin mis cookies, solo puede usar un servidor proxy; los contenidos públicos de mail.google.com
no son un secreto (pero el contenido de mail.google.com
cuando se accede con mis cookies son un secreto).
(Tenga en cuenta que he dicho "contenido restringido por credenciales", pero también puede ser contenido restringido por topología cuando un sitio web solo es visible para ciertas direcciones IP.)
A veces, sin embargo, no es evil.com
tratando de echar un vistazo a su bandeja de entrada. A veces, es solo un sitio web útil (por ejemplo, http://goodsite.foo
) tratando de usar una API pública de otro origen (por ejemplo, http://api.example.com
) Los programadores que trabajaron duro en api.example.com
querer todos los orígenes para acceder libremente a los contenidos de su sitio. En ese caso, el servidor API en api.example.com
puede usar encabezados CORS para permitir goodsite.foo
(o cualquier otro origen solicitante) para acceder a sus respuestas API.
Entonces, en resumen, asumimos por defecto que el acceso de origen cruzado es algo malo (piense en alguien que intente leer su bandeja de entrada), pero hay casos en que es bueno cosa (piense en un sitio web que intenta acceder a una API pública). CORS permite que el buen caso suceda cuando el sitio solicitado quiere que suceda.
Existen razones de seguridad y privacidad para no permitir solicitudes desde cualquier lugar. Si visitó mi sitio web, no desea que mi código haga solicitudes a Facebook, reddit, su banco, eBay, etc. desde su navegador utilizando sus cookies, ¿verdad? Mi sitio podría hacer publicaciones, leer información, realizar pedidos, etc. en su nombre. O en mi nombre con tus cuentas.