¿Qué es el uso compartido de recursos entre orígenes?
El uso compartido de recursos entre orígenes (CORS) es un mecanismo para integrar aplicaciones. CORS define una forma con la que las aplicaciones web clientes cargadas en un dominio pueden interactuar con los recursos de un dominio distinto. Esto resulta útil porque las aplicaciones complejas suelen hacer referencia a API y recursos de terceros en el código del cliente. Por ejemplo, la aplicación puede utilizar su navegador para extraer videos de la API de una plataforma de video, utilizar fuentes de una biblioteca pública de fuentes o mostrar datos meteorológicos de una base de datos meteorológica nacional. CORS permite que el navegador del cliente compruebe con los servidores de terceros si la solicitud está autorizada antes de realizar cualquier transferencia de datos.
¿Por qué es importante el uso compartido de recursos entre orígenes?
En el pasado, cuando las tecnologías de Internet aún eran nuevas, se producían problemas de falsificación de solicitudes entre sitios (CSRF). Estos problemas enviaban solicitudes de cliente falsas desde el navegador de la víctima a otra aplicación.
Por ejemplo, la víctima iniciaba sesión en la aplicación de su banco. Después, le engañaban para que cargara un sitio web externo en una nueva pestaña del navegador. A continuación, el sitio web externo utilizaba las credenciales de las cookies de la víctima y retransmitía los datos a la aplicación bancaria mientras se hacía pasar por esta. De este modo, usuarios no autorizados accedían de manera no deseada a la aplicación bancaria.
En la actualidad, para evitar estos ataques de CSRF, todos los navegadores implementan la política del mismo origen.
Política del mismo origen
Hoy en día, los navegadores exigen que los clientes solo puedan enviar solicitudes a un recurso con el mismo origen que la URL del cliente. El protocolo, el puerto y el nombre de host de la URL del cliente deben coincidir con el servidor que solicita.
Por ejemplo, considere la comparación del origen de las siguientes URL con la URL del cliente http://store.aws.com/dir/page.html.
URL |
Resultado |
Motivo |
http://store.aws.com/dir2/new.html |
Mismo origen |
Solo la ruta es diferente |
http://store.aws.com/dir/inner/other.html |
Mismo origen |
Solo la ruta es diferente |
https://store.aws.com/page.html |
Origen diferente |
Protocolo diferente |
http://store.aws.com:81/dir/page.html |
Origen diferente |
Puerto diferente (http:// es el puerto 80 por defecto) |
http://news.aws.com/dir/page.html |
Origen diferente |
Host diferente |
Por lo tanto, la política del mismo origen es altamente segura, pero es inflexible para los casos de uso auténticos.
El uso compartido de recursos entre orígenes (CORS) es una ampliación de la política del mismo origen. Lo necesita para compartir recursos autorizados con terceros externos. Por ejemplo, necesita CORS cuando quiera extraer datos de API externas que sean públicas o autorizadas. También necesita CORS si quiere permitir el acceso autorizado de terceros a los recursos de su propio servidor.
¿Cómo funciona el uso compartido de recursos entre orígenes?
En la comunicación estándar por Internet, el navegador envía una solicitud HTTP al servidor de aplicaciones, recibe datos como respuesta HTTP y los muestra. En la terminología de los navegadores, la URL actual del navegador se denomina origen actual y la URL de terceros crea el escenario entre orígenes.
Cuando realiza una solicitud entre orígenes, este es el proceso de solicitud-respuesta:
- El navegador agrega un encabezado de origen a la solicitud con información sobre el protocolo, el host y el puerto actuales del origen.
- El servidor comprueba el encabezado actual de origen y responde con los datos solicitados y un encabezado Access-Control-Allow-Origin.
- El navegador detecta los encabezados de solicitud de control de acceso y comparte los datos devueltos con la aplicación cliente.
Como alternativa, si el servidor no quiere permitir el acceso entre orígenes, responde con un mensaje de error.
Ejemplo de uso compartido de recursos entre orígenes
Por ejemplo, considere un sitio llamado https://noticias.ejemplo.com. Este sitio quiere acceder a los recursos de una API en api-socio.com.
Los desarrolladores de https://api-socioi.com configuran primero los encabezados de uso compartido de recursos entre orígenes (CORS) de su servidor agregando noticias.ejemplo.com a la lista de orígenes permitidos. Para ello, agregan la siguiente línea al archivo de configuración de su servidor.
Access-Control-Allow-Origin: https://noticias.ejemplo.com
Una vez configurado el acceso CORS, https://noticias.ejemplo.com puede solicitar recursos de api-socio.com. Para cada solicitud, api-socio.com responderá con Access-Control-Allow-Credentials : "true". El navegador sabe entonces que la comunicación está autorizada y permite el acceso entre orígenes.
Si desea conceder acceso a varios orígenes, utilice una lista separada por comas o caracteres comodín como “*” para conceder el acceso a todos.
¿Qué es una solicitud de verificación previa CORS?
En HTTP, los métodos de solicitud son las operaciones de datos que el cliente desea que realice el servidor. Los métodos HTTP más comunes son GET, POST, PUT y DELETE.
En una interacción habitual de uso compartido de recursos entre orígenes (CORS), el navegador envía los encabezados de solicitud y de control de acceso al mismo tiempo. Por lo general, se trata de solicitudes de datos GET y se consideran de bajo riesgo.
Sin embargo, algunas solicitudes HTTP se consideran complejas y requieren la confirmación del servidor antes de enviar la solicitud real. El proceso de aprobación previa se denomina solicitud preparatoria.
Solicitudes entre orígenes complejas
Las solicitudes entre orígenes son complejas si utilizan alguna de las siguientes opciones:
- Métodos que no sean GET, POST o HEAD
- Encabezados que no sean Accept-Language, Accept o Content-Language
- Encabezados Content-Type que no sean multipart/form-data, application/x-www-form-urlencoded o text/plain
Así, por ejemplo, las solicitudes para eliminar o modificar datos existentes se consideran complejas.
¿Cómo funcionan las solicitudes preparatorias?
Los navegadores crean solicitudes preparatorias si son necesarias. Es una solicitud OPTIONS como la siguiente.
OPTIONS/data HTTP/1.1 Origen: https://ejemplo.com Access-Control-Request-Method: DELETE |
El navegador envía la solicitud preparatoria antes del mensaje de solicitud real. El servidor debe responder a la solicitud preparatoria con información sobre las solicitudes entre orígenes que el servidor está dispuesto a aceptar desde la URL del cliente. Los encabezados de respuesta del servidor deben incluir lo siguiente:
- Access-Control-Allow-Methods
- Access-Control-Allow-Headers
- Access-Control-Allow-Origin
A continuación se muestra un ejemplo de respuesta del servidor.
HTTP/1.1 200 OK Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Origin: https://noticias.ejemplo.com Access-Control-Allow-Methods: GET, DELETE, HEAD, OPTIONS |
La respuesta de verificación previa a veces incluye un encabezado adicional Access-Control-Max-Age. Esta métrica especifica la duración (en segundos) para que el navegador almacene en caché los resultados de la verificación previa en el navegador. El almacenamiento en caché permite al navegador enviar varias solicitudes complejas entre las solicitudes de verificación previa. No tiene que enviar otra solicitud de verificación previa hasta que transcurra el tiempo especificado por max-age.
¿Cuál es la diferencia entre CORS y JSONP?
JSON con relleno (JSONP) es una técnica histórica que permite la comunicación entre aplicaciones web que se ejecutan en dominios diferentes.
Con JSONP, se utilizan etiquetas script de HTML en la página del cliente. La etiqueta script carga archivos JavaScript externos o incrusta código JavaScript directamente en una página HTML. Dado que los scripts no están sujetos a la política del mismo origen, se pueden recuperar datos de origen cruzado a través del código JavaScript.
Sin embargo, los datos deben estar en formato JSON. Además, JSONP es menos seguro que el uso compartido de recursos entre orígenes (CORS) porque depende de la fiabilidad del dominio externo para proporcionar datos seguros.
Los navegadores modernos han agregado algunas características de seguridad, por lo que el código antiguo que contenga JSONP ya no funcionará en ellos. CORS es el actual estándar web global para el control de acceso entre orígenes.
¿Cuáles son las prácticas recomendadas para CORS?
Debe tener en cuenta lo siguiente cuando configure la opción de compartir recursos entre orígenes (CORS) en su servidor.
Definición de listas de acceso adecuadas
Siempre es mejor conceder acceso a dominios individuales utilizando listas separadas por comas. Hay que evitar el uso de caracteres comodín a menos que se quiera hacer pública la API. De lo contrario, el uso de caracteres comodín y expresiones comunes puede crear vulnerabilidades.
Por ejemplo, supongamos que escribe una expresión común que concede acceso a todos los sitios con el sufijo sitioweb-permitido.com. Con una expresión, está concediendo acceso a api.sitioweb-permitido.com y news.sitioweb-permitido.com. Pero también está concediendo inadvertidamente acceso a sitios no autorizados que pueden utilizar dominios como sitioweb-contenidomalintencionadopermitido.com.
Evite utilizar un origen null en su lista
Algunos navegadores envían el valor null en la cabecera de la petición en determinados casos, como en las peticiones de archivos o las peticiones desde el host local.
Sin embargo, no debe incluir el valor null en su lista de acceso. También implica riesgos de seguridad, ya que las solicitudes no autorizadas que contengan cabeceras con valor null pueden obtener acceso.
¿Cómo puede AWS Support satisfacer sus necesidades de CORS?
Muchos de nuestros servicios son compatibles con el uso compartido de recursos entre orígenes (CORS). De este modo, puede controlar el acceso entre orígenes a sus API y recursos alojados en Amazon Web Services (AWS).
Estos son algunos servicios de AWS compatibles con CORS:
- Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos con clases de almacenamiento económicas para todos los casos de uso de almacenamiento de datos. Amazon S3 le permite crear un documento de configuración de CORS con reglas que identifican los orígenes a los que permitirá el acceso a sus datos de S3, las operaciones (métodos HTTP) que admitirá para cada origen y otra información específica de la operación. Puede agregar hasta 100 reglas a la configuración.
- Amazon API Gateway es un servicio totalmente administrado que le facilita la creación, la publicación, el mantenimiento, el monitoreo y la protección de las API a cualquier escala. Puede habilitar CORS para sus API de REST con un solo clic directamente en la consola de Amazon API Gateway.
Para comenzar a utilizar las API en AWS, cree una cuenta hoy mismo.
Siguientes pasos en AWS
Obtenga acceso instantáneo al nivel Gratuito de AWS.
Comience a crear en la consola de administración de AWS.