Por defecto una página solo puede leer respuestas de su propio origin. Para que lea una respuesta de otro origin, el servidor debe habilitarlo con cabeceras Access-Control-Allow-*. El navegador lo hace cumplir: si las cabeceras no permiten tu origin, bloquea la lectura aunque el servidor haya respondido.
Las peticiones no simples (cabeceras propias, cuerpo JSON o métodos distintos de GET/HEAD/POST) envían primero un preflight OPTIONS; el servidor debe permitir el método y las cabeceras antes de que salga la petición real. Cuando la petición lleva credentials, los comodines dejan de funcionar: Access-Control-Allow-Origin debe ser el origin exacto (no *) y Access-Control-Allow-Credentials debe ser true. Esa combinación exacta es el error de CORS más común.
Preguntas y respuestas frecuentes sobre este tema.
El servidor respondió, pero el navegador se niega a exponer la respuesta a tu página porque las cabeceras Access-Control-Allow-* no permiten tu origin (o método, o cabeceras). Esta herramienta muestra exactamente qué cabecera falta.
Para peticiones no simples, el navegador envía primero una petición OPTIONS para preguntar al servidor si el método y las cabeceras están permitidos. Solo si ese preflight pasa se envía la petición real.
Por seguridad, el navegador prohíbe el comodín cuando una petición envía cookies o auth. Debes devolver el origin exacto y añadir Access-Control-Allow-Credentials: true.
No. Es un motor de reglas puro que se ejecuta por completo en tu navegador; nunca envía una petición de red y nada de lo que escribes sale de tu dispositivo.