¿Qué hace exactamente el encabezado Access-Control-Allow-Credentials?

167

Estoy tratando de entender cómo usar CORS y estoy confundido acerca de lo que hace el Access-Control-Allow-Credentialsencabezado.

La documentación dice

Indica si la respuesta a la solicitud se puede exponer o no cuando el indicador de credenciales es verdadero.

Pero no entiendo lo que significa la respuesta "estar expuesto".

¿Alguien puede explicar qué hace realmente este encabezado configurado como verdadero (junto con el indicador de credenciales establecido como verdadero)?

Nate
fuente
xhr.with documento de credencial en el lado del cliente developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
Weishi Zeng

Respuestas:

264

Por defecto, CORS no incluye cookies en solicitudes de origen cruzado. Esto es diferente de otras técnicas de origen cruzado como JSON-P. JSON-P siempre incluye cookies con la solicitud, y este comportamiento puede conducir a una clase de vulnerabilidades llamada falsificación de solicitud entre sitios , o CSRF.

Para reducir la posibilidad de vulnerabilidades CSRF en CORS, CORS requiere que tanto el servidor como el cliente reconozcan que está bien incluir cookies en las solicitudes. Hacer esto hace que las cookies sean una decisión activa, en lugar de algo que ocurre pasivamente sin ningún control.

El código de cliente debe establecer la withCredentialspropiedad en la XMLHttpRequestque truecon el fin de dar permiso.

Sin embargo, este encabezado solo no es suficiente. El servidor debe responder con el Access-Control-Allow-Credentialsencabezado. Responder con este encabezado truesignifica que el servidor permite que se incluyan cookies (u otras credenciales de usuario) en las solicitudes de origen cruzado.

También debe asegurarse de que su navegador no esté bloqueando las cookies de terceros si desea que funcionen las solicitudes con credenciales cruzadas.

Tenga en cuenta que independientemente de si realiza solicitudes del mismo origen o de origen cruzado, debe proteger su sitio de CSRF (especialmente si su solicitud incluye cookies).

Monsur
fuente
1
Aclaré la respuesta para cubrir tu pregunta. Básicamente, JSON-P lo hace mal y es menos seguro.
Monsur
28
Solo quiero agregar a esto un poco para comentar sobre el significado de "expuesto". La especificación no requiere un vuelo previo (ida y vuelta adicional para verificar si el servidor permitirá credenciales) para las solicitudes GET. En lugar de la verificación previa, el navegador siempre realizará la solicitud, enviando cookies si withCredentialsestá configurada, pero luego, cuando reciba la respuesta, si se estableció withCredentials, solo entregará / expondrá el resultado al javascript de llamada si la respuesta tiene el Acceso -Control-Allow-Credentials conjunto de encabezados. Si no hay encabezado, no expone la respuesta, de manera efectiva la oculta.
heavi5ide
44
@ heavi5ide, sí, incluso si el navegador no expone la respuesta al código del cliente, la solicitud con cookie aún se envió (para solicitudes sin verificación previa). Entonces CSRF aún estaría terminado.
Pacerier
77
Dado que esta es una respuesta tan popular, voy a agregar una información más importante: además de configurar sus encabezados de solicitud y respuesta correctamente, también debe asegurarse de que su navegador no esté bloqueando las cookies de terceros si desea que funcionen las solicitudes con credenciales de origen cruzado. Ver stackoverflow.com/a/16634887/2970321
alexw
55
Esta es una respuesta tan clara que cualquiera que la lea la primera vez puede comprender y corregir su código que no parece funcionar bien con las cookies. ¡Gracias!
pide