Cálculo 100% en el Navegador • Cero Registros en Servidor • Ejecución Inmediata
Curious TechieCaja de Herramientas
CORS9 min de lectura•Español EditionEjecución 100% en el Navegador

¿Qué es CORS y la Política del Mismo Origen (SOP)?

Aprende sobre Cross-Origin Resource Sharing: peticiones preflight OPTIONS, encabezados de acceso y errores frecuentes.

CT
Curious-Techie Engineering TeamAutor Verificado

Web Protocols & Security Architecture Research

Publicado:
•
Actualizado:
•9 min de lectura
Especificación Oficial:WHATWG Fetch Living Standard(WHATWG)
Revisado por Curious-Techie Architecture Peer Review Group
Pregunta Principal • Respuesta Técnica Inmediata

¿Qué es CORS y la Política del Mismo Origen (SOP)?

TL;DR — Conclusiones Clave de Ingeniería

  • La Política del Mismo Origen (SOP) impide que un script lea respuestas de orígenes distintos (protocolo, dominio o puerto).
  • CORS flexibiliza la SOP permitiendo que el servidor indique qué orígenes externos tienen autorización.
  • Las solicitudes preflight OPTIONS validan métodos y encabezados antes de procesar llamadas complejas.
  • El comodín Access-Control-Allow-Origin: * queda bloqueado si se envían credenciales o cookies.
  • CORS es una protección ejecutada por el navegador web, no por herramientas backend como cURL o Postman.
// FUNDAMENTOS

Conceptos Clave y Arquitectura

Same-Origin Policy (SOP)

Boundary

The baseline security boundary isolating origins from reading each other’s DOM and network response payloads.

Preflight Request

Handshake

An automatic HTTP `OPTIONS` probe dispatched by the browser before the actual request to verify permissions.

Simple Request

Optimization

Requests utilizing standard methods (GET, HEAD, POST) with standard headers (Accept, Content-Type: text/plain, form-urlencoded, multipart) that bypass preflight.

Credentialed Requests

Auth

Requests sending HTTP cookies, TLS client certificates, or Authorization headers across origins.

Exposed Headers

Headers

Custom server headers (`Access-Control-Expose-Headers`) that the browser allows frontend JavaScript to read.

Pregunta Secundaria • Flujo de Ejecución

¿Cómo funciona ¿Qué es CORS y la Política del Mismo Origen (SOP)??

Respuesta Directa:

When JavaScript triggers a fetch request to a different origin, the browser evaluates whether the request is "simple" or "complex". If complex (e.g., custom headers or JSON content-type), the browser automatically dispatches an `OPTIONS` preflight request with `Origin`, `Access-Control-Request-Method`, and `Access-Control-Request-Headers`. If the server responds with matching `Access-Control-Allow-*` headers, the browser fires the actual request. If not, the browser blocks the response from frontend JS.

1

Origin Check

Browser identifies target URL origin differs from window.location origin.

Fetch from https://app.com -> https://api.com:443
2

Preflight OPTIONS Dispatch

Browser sends HTTP OPTIONS probe with requested method and headers.

OPTIONS /api/data HTTP/1.1
Origin: https://app.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type, authorization
3

Server Header Validation

Server inspects Origin, checks authorized list, and returns approval headers.

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
4

Actual Request Execution

Browser verifies preflight response matches, then transmits actual POST request.

POST /api/data HTTP/1.1
Origin: https://app.com
Content-Type: application/json

{"data": "payload"}
5

Payload Delivery

Server returns response; browser checks `Access-Control-Allow-Origin` and delivers data to JS Promise.

const response = await fetch(...); // Promise resolves!
Ejemplos Técnicos • Implementación

¿Cómo se implementa ¿Qué es CORS y la Política del Mismo Origen (SOP)? en la práctica?

Complete Production Express.js CORS Middleware Implementation

javascript
import cors from "cors";
import express from "express";

const app = express();

const allowedOrigins = [
  "https://curious-techie.com",
  "https://staging.curious-techie.com",
];

const corsOptions = {
  origin: (origin, callback) => {
    // Allow requests with no origin (e.g. mobile apps or server-to-server)
    if (!origin || allowedOrigins.includes(origin)) {
      callback(null, true);
    } else {
      callback(new Error("Blocked by CORS policy"));
    }
  },
  methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
  allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
  exposedHeaders: ["X-Total-Count", "Content-Disposition"],
  credentials: true,
  maxAge: 86400, // Cache preflight for 24 hours
};

app.use(cors(corsOptions));

Detalles de Ingeniería: Dynamic origin validation allowing credentialed requests without unsafe wildcards, with preflight caching for 24 hours.

Configuring Native Nginx CORS Response Headers

nginx
location /api/ {
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '$http_origin' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
        add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, Accept' always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Access-Control-Max-Age' 86400 always;
        add_header 'Content-Length' 0;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        return 204;
    }

    add_header 'Access-Control-Allow-Origin' '$http_origin' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;
    proxy_pass http://backend_upstream;
}

Detalles de Ingeniería: Handles OPTIONS preflight calls directly at Nginx edge layer with HTTP 204 No Content, reducing backend load.

Arquitectura en Producción • Casos Reales

¿Dónde y por qué se utiliza ¿Qué es CORS y la Política del Mismo Origen (SOP)? en producción?

Decoupled JAMstack Frontend with Independent API Gateway

Next.js frontend hosted on Vercel (`app.curious-techie.com`) calling a Go backend on AWS (`api.curious-techie.com`).

Subdomain crossing constitutes a cross-origin call; the Go backend returns explicit CORS headers allowing the frontend origin.

Third-Party SaaS Embeddable Widgets

Chat widget or analytics SDK installed on thousands of customer websites.

API server must return `Access-Control-Allow-Origin: *` since requests originate from arbitrary customer hostnames.

Errores Comunes y Antipatrones

¿Cuáles son los errores y malentendidos comunes con ¿Qué es CORS y la Política del Mismo Origen (SOP)??

Antipatrón: Returning `Access-Control-Allow-Origin: *` alongside `Access-Control-Allow-Credentials: true`

Impacto: Browsers strictly reject this combination for security; cross-origin call fails with fatal console error.

Corrección Recomendada: Dynamically reflect the verified client `Origin` header value instead of the `*` wildcard when credentials are required.

Antipatrón: Thinking CORS is a backend security firewall preventing scraping or hacking

Impacto: Attackers bypass CORS completely using cURL, Python scripts, or mobile apps since non-browser clients ignore CORS.

Corrección Recomendada: Enforce real backend authentication (JWTs, session tokens, rate limiting) rather than relying on CORS for security.

Antipatrón: Failing to handle the HTTP `OPTIONS` method on the server routing table

Impacto: Server returns 404 or 405 to the preflight probe; actual POST/PUT request is never allowed to fire.

Corrección Recomendada: Ensure your server framework or API gateway explicitly responds to `OPTIONS` with status 200 or 204.

Modelado de Amenazas • Vectores de Ataque

¿Cuáles son las implicaciones de seguridad y riesgos de ¿Qué es CORS y la Política del Mismo Origen (SOP)??

Overly Permissive Cross-Origin Data Exfiltration

CWE-942 Permissive Cross-Domain Policy with Untrusted Domains

Vulnerabilidad: Server blindly reflects any incoming `Origin` header back into `Access-Control-Allow-Origin` with `credentials: true`.

Estrategia de Mitigación: Validate incoming Origin headers against an explicit, strict allowlist of authorized company domains.

Internal Network Pivot via CORS

CWE-346 Origin Validation Error

Vulnerabilidad: Intranet server (e.g. `http://192.168.1.1`) responds with permissive CORS; malicious internet site uses visitor browser to read internal data.

Estrategia de Mitigación: Implement Private Network Access (PNA) checks; restrict intranet APIs to local authentication tokens.
Diagnóstico • Resolución de Causa Raíz

¿Cómo solucionar y depurar errores con ¿Qué es CORS y la Política del Mismo Origen (SOP)??

Síntomas e Indicaciones Clínicas: Console Error: "No 'Access-Control-Allow-Origin' header is present on the requested resource"

Análisis de Causa Raíz Subyacente:
  • Server threw an unhandled 500 exception before CORS middleware ran
  • CORS middleware placed after route handlers
Solución Verificada en Producción: Mount CORS middleware at the very top of server middleware stack before routes; check server exception logs for 500 errors.

Síntomas e Indicaciones Clínicas: Custom response headers cannot be read via `response.headers.get()` in JavaScript

Análisis de Causa Raíz Subyacente:
  • Server omitted `Access-Control-Expose-Headers` for custom headers
Solución Verificada en Producción: Include `Access-Control-Expose-Headers: X-Custom-Header, X-Total-Count` in the server response headers.
Base de Conocimiento • Respuestas Técnicas Directas

Preguntas Frecuentes sobre ¿Qué es CORS y la Política del Mismo Origen (SOP)?

Q:Why does CORS only happen in browsers and not in Postman or cURL?

Respuesta Directa:CORS is a browser-enforced security mechanism designed to protect users from malicious websites using their browser session credentials. CLI tools like cURL do not execute untrusted foreign code, so they ignore CORS.

In a browser, you might visit `evil.com` while logged into `yourbank.com`. Without SOP and CORS, JavaScript on `evil.com` could fetch data from `yourbank.com` using your browser session cookies. Postman doesn’t have this security hazard.

Q:What is a Preflight request and when is it triggered?

Respuesta Directa:A preflight request is an automated HTTP OPTIONS request sent by the browser before the real request. It is triggered whenever a request uses methods other than GET/HEAD/POST, sets custom headers (like Authorization), or uses non-standard Content-Types (like application/json).

The preflight allows the server to verify that it understands the method and headers before any payload data is processed on the backend.

Sección 12 • Utilidades Interactivas

Herramientas Relacionadas

Ejecución 100% en el Navegador

Companion Interactive Tool100% Client-Side Execution

Test & Verify with CORS Checker & Builder

Validate and generate secure Cross-Origin Resource Sharing (CORS) headers.

Companion Interactive Tool100% Client-Side Execution

Test & Verify with HTTP Header Analyzer

Analyze raw or live HTTP response headers for caching and architecture.

Companion Interactive Tool100% Client-Side Execution

Test & Verify with Security Headers Checker

Audit HSTS, CSP, X-Frame-Options, and OWASP recommended web headers.

Glosario

Origin
The unique combination of protocol, hostname, and port number.
Preflight
An HTTP OPTIONS request sent before the actual request to verify that the server permits it.
SOP
Same-Origin Policy: Browser security rule preventing scripts on one origin from accessing data on another.
Authoritative Sourcing & Verification

References & Primary Sources

Every source below directly substantiates technical statements and protocol behaviors explained in ¿Qué es CORS y la Política del Mismo Origen (SOP)?. Curious-Techie prioritizes official Internet standards (IETF RFCs, W3C Recommendations, WHATWG specifications) and established security bodies (OWASP, NIST). Zero sponsored or secondary links.

  1. [1]WHATWGPrimary SpecificationWHATWG Fetch • § 3.2 HTTP-network-fetch
    Verified Primary Source
    Technical Claim Supported:

    Defines the normative browser CORS protocol, preflight cache validation (Access-Control-Max-Age), and the prohibition of wildcard Access-Control-Allow-Origin: * when Access-Control-Allow-Credentials is true.

    “For a CORS request with credentials, the server cannot specify a wildcard for Access-Control-Allow-Origin. It must specify an explicit origin.”
  2. [2]IETFPrimary SpecificationRFC 9110 • § 9.2.1
    Verified Primary Source
    Technical Claim Supported:

    Specifies that the Origin request header indicates the scheme, host, and port of the originating context and must not be altered by user-agent JavaScript.

  3. [3]OWASPAuthoritative Security StandardOWASP Cheat Sheet Series • Origin Validation & Credentials
    Verified Primary Source
    Technical Claim Supported:

    Documents the security risks of dynamic origin reflection without strict server-side allowlist verification (CORS misconfiguration vulnerabilities).

  4. [4]MDNDeveloper Authority (MDN)MDN Web Docs • CORS Preflight & Simple Requests
    Verified Primary Source
    Technical Claim Supported:

    Provides developer reference for simple requests vs. preflighted requests and safelisted headers (Accept, Accept-Language, Content-Language, Content-Type).