HTTP
Origen cruzado y control de acceso
Buscar..
Observaciones
El intercambio de recursos de origen cruzado está diseñado para permitir solicitudes dinámicas entre dominios, a menudo utilizando técnicas como AJAX . Mientras que las secuencias de comandos realizan la mayor parte del trabajo, el servidor HTTP debe admitir la solicitud utilizando los encabezados correctos.
Cliente: enviar una solicitud de intercambio de recursos de origen cruzado (CORS)
Se debe enviar una solicitud de origen cruzado que incluya el encabezado de Origin
. Esto indica de donde se originó la solicitud. Por ejemplo, una solicitud de origen cruzado de http://example.com
a http://example.org
se vería así:
GET /cors HTTP/1.1
Host: example.org
Origin: example.com
El servidor utilizará este valor para determinar si la solicitud está autorizada.
Servidor: respondiendo a una solicitud CORS
La respuesta a una solicitud CORS debe incluir un encabezado Access-Control-Allow-Origin
, que dicta qué orígenes pueden usar el recurso CORS. Este encabezado puede tomar uno de tres valores:
- Un origen. Hacer esto solo permite solicitudes desde ese origen .
- El personaje
*
. Esto permite solicitudes desde cualquier origen . - La cadena
null
. Esto no permite solicitudes de CORS .
Por ejemplo, al recibir una solicitud CORS del origen http://example.com
, si example.com
es un origen autorizado, el servidor enviaría esta respuesta:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: example.com
Una respuesta de cualquier origen también permitiría esta solicitud, es decir:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Permitir credenciales de usuario o sesión
Al permitir que las credenciales del usuario o la sesión del usuario se envíen con una solicitud CORS, el servidor puede conservar los datos del usuario en todas las solicitudes CORS. Esto es útil si el servidor necesita verificar si el usuario ha iniciado sesión antes de proporcionar datos (por ejemplo, solo realiza una acción si un usuario ha iniciado sesión; esto requeriría que la solicitud CORS se envíe con credenciales).
Esto se puede lograr en el lado del servidor para solicitudes con verificación previa, mediante el envío del encabezado Access-Control-Allow-Credentials
en respuesta a la solicitud de verificación previa de OPTIONS
. Tome el siguiente caso de una solicitud CORS para DELETE
un recurso:
OPTIONS /cors HTTP/1.1
Host: example.com
Origin: example.org
Access-Control-Request-Method: DELETE
HTTP/1.1 200 OK
Access-Control-Allow-Origin: example.org
Access-Control-Allow-Methods: DELETE
Access-Control-Allow-Credentials: true
La línea Access-Control-Allow-Credentials: true
indica que la siguiente solicitud DELETE
CORS puede enviarse con las credenciales del usuario.
Solicitudes de verificación previa
Se permite una solicitud CORS básica para usar uno de solo dos métodos:
- OBTENER
- ENVIAR
y solo unos pocos encabezados selectos. Las solicitudes POST CORS pueden elegir adicionalmente solo entre tres tipos de contenido.
Para evitar este problema, las solicitudes que deseen utilizar otros métodos, encabezados o tipos de contenido deben emitir primero una solicitud de verificación previa, que es una solicitud de OPTIONS
que incluye encabezados de solicitud de control de acceso. Por ejemplo, esta es una solicitud de verificación previa que verifica si el servidor aceptará una solicitud PUT
que incluya un encabezado DNT
:
OPTIONS /cors HTTP/1.1
Host: example.com
Origin: example.org
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: DNT
Servidor: respondiendo a las solicitudes de verificación previa
Cuando un servidor recibe una solicitud de verificación previa, debe verificar si es compatible con el método y los encabezados solicitados, y devolver una respuesta que indique su capacidad para respaldar la solicitud, así como cualquier otro dato permitido (como credenciales).
Estos están indicados en el control de acceso Permitir encabezados. El servidor también puede devolver un encabezado de Max-Age
control de acceso, que indica cuánto tiempo se puede almacenar en caché la respuesta de verificación previa.
Esto es lo que podría parecer un ciclo de solicitud-respuesta para una solicitud de verificación previa:
OPTIONS /cors HHTP/1.1
Host: example.com
Origin: example.org
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: DNT
HTTP/1.1 200 OK
Access-Control-Allow-Origin: example.org
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Headers: DNT