 reads. Two independent jobs. Most articles tangle them, which is why CORS feels mystical and bank attacks feel hand-wavy."
---

You're building a feature that calls a payment API. You write a fetch call in your component:

```tsx
const response = await fetch('https://api.payments.com/charge', {
  headers: { 'Authorization': 'Bearer sk_live_abc123def456' },
  body: JSON.stringify({ amount, customer }),
  method: 'POST',
})
```

You ship it. Then you open DevTools → Network tab and see `sk_live_abc123def456` sitting in plain text on every request. Anyone who opens DevTools can see it. Anyone running your app on a hostile network can see it. Anyone running a malicious browser extension can see it.

The key is yours. The customers are theirs.

---

## The first job: hide secrets from the client

The fix is not to obscure the key. Obfuscation does not work for client-side secrets. The fix is to make sure the client code never sees the key in the first place. The request that carries the key must originate from a server you control, where the key lives in an environment variable that never crosses the wire to the browser.

Next.js (and Remix, SvelteKit, Nuxt, RSC frameworks in general) gives you three ways to do this:

- **Server Actions**: a function marked `"use server"` that the client invokes by name. The function body executes on the server. Arguments are serialized client → server, return value is serialized server → client. The implementation never ships to the browser.
- **Route Handlers** (`app/api/.../route.ts`): a traditional HTTP endpoint that runs on your server. The client `fetch`es it, your handler does the real work upstream.
- **Server Components** (RSC): components rendered on the server. Their `fetch` calls happen during render, the result is serialized into the HTML / RSC payload. No client-side network call at all.

The browser DevTools Network tab sees:

- Before: `browser → api.payments.com` with your API key visible
- After: `browser → your-server/checkout` with no key, then on the server `your-server → api.payments.com` invisible to the user

Your server still has the key. The browser does not. The user can see what they call, but cannot see what your server calls.

```
Before:
  browser ─── Authorization: Bearer sk_live_... ────→ api.payments.com
                       ↑ visible in DevTools

After:
  browser ─── POST /checkout ────→ your Next.js server
                                          │
                                          ├── Authorization: Bearer sk_live_...
                                          ↓
                                       api.payments.com
                                          ↑ invisible to user
```

This first job has nothing to do with CORS. CORS is a browser mechanism. Server-side calls do not involve the browser sending the upstream request, so CORS has no role here.

Which is exactly why a familiar pattern shows up:

> Backend says it works. Frontend devs say it works in Postman. Browser still gets CORS errors.

The backend, Postman, your Next.js server, curl, mobile apps. None of these are browsers. None of them enforce CORS. CORS is a constraint the browser self-imposes on JavaScript running in pages. Everywhere else, it does not exist.

---

## The second job: control who can read your responses

Now a different scenario. Your frontend at `app.example.com` needs to call your own API at `api.example.com` directly from the browser. The browser sees two different origins. Same-Origin Policy kicks in.

**Same-Origin Policy (SOP)** is the default block. The browser refuses to let JavaScript read responses from a different origin (scheme + host + port). This is a security default, not a security mechanism you set up. You get it for free.

**CORS** is the opt-in relaxation of SOP. The server that owns the response tells the browser "I permit this specific origin to read me", and the browser then lets the JS through.

Note the direction: **CORS is the server unlocking a door**, not the server blocking traffic. Without CORS headers, SOP blocks by default. With CORS headers, SOP lets the listed origins through.

This is the reframe most articles miss. "CORS protects you" reads backwards. CORS relaxes a default that already protects you.

---

## How CORS actually flows

Two paths depending on the request shape: simple vs non-simple.

**Simple request** (no preflight). All three conditions must hold:

- Method is `GET`, `HEAD`, or `POST`
- Headers are only the standard ones (`Accept`, `Accept-Language`, `Content-Language`, basic `Content-Type`)
- `Content-Type` is one of: `application/x-www-form-urlencoded`, `multipart/form-data`, `text/plain`

This is essentially "what an HTML form can do". The request goes out, the server processes it, returns response. Browser then checks the response's `Access-Control-Allow-Origin` header. If the calling origin is allowed, JS can read the response. If not, browser blocks JS from reading, but the request already happened server-side.

**Non-simple request** (preflight). Anything outside the above conditions. Examples:

- `PUT`, `DELETE`, `PATCH`
- Custom headers like `Authorization`, `X-CSRF-Token`
- `Content-Type: application/json`

Browser sends `OPTIONS` first to ask permission. If the server's CORS policy approves (matching `Access-Control-Allow-*` headers), the real request follows. If not, the real request **never goes out**.

This split matters for the attack scenarios below. **Simple cross-origin requests reach the server even when CORS would block reading the response. Non-simple cross-origin requests can be blocked entirely before the server sees them.**

---

## CORS headers reference

Client sends these. Browser fills them automatically, you do not write them in your fetch.

| Header | What it carries |
|---|---|
| `Origin` | The calling page's scheme + host + port |
| `Access-Control-Request-Method` | Preflight only. Lists the actual method that will be used. |
| `Access-Control-Request-Headers` | Preflight only. Lists the non-simple headers that will be used. |

Server sends these. You write them in your CORS middleware.

| Header | What it controls |
|---|---|
| `Access-Control-Allow-Origin` | Origin whitelist. Either a single origin matching the `Origin` header, or `*` for any origin. |
| `Access-Control-Allow-Methods` | Methods the server accepts cross-origin. |
| `Access-Control-Allow-Headers` | Non-simple headers the server accepts. |
| `Access-Control-Allow-Credentials` | If `true`, browser will attach cookies and the response is readable across origins. **Forbidden to combine with `*` in `Allow-Origin`**. |
| `Access-Control-Max-Age` | Seconds the browser can cache the preflight response. Per endpoint, not global. |

Client-side fetch with credentials:

```js
fetch('https://api.example.com/me', { credentials: 'include' })
```

The older XHR equivalent was `xhr.withCredentials = true`. Both opt the browser into attaching cookies on the cross-origin request.

---

## Attack story 1: classic CSRF (CORS does not help)

You are logged into `bank.com`. You visit `evil.com`. The page contains:

```html
<form action="https://bank.com/transfer" method="POST">
  <input name="to" value="evil-account">
  <input name="amount" value="1000">
</form>
<script>document.forms[0].submit()</script>
```

This is a **simple request**. Method POST, `Content-Type: application/x-www-form-urlencoded` (the form default), no custom headers. **No preflight. The request flies straight to `bank.com/transfer`**, browser attaches your `bank.com` cookies automatically.

`bank.com` sees a logged-in user requesting a transfer. Without other defenses, it processes it. Money moves.

What does CORS do here? **Nothing for the request itself.** The bank's CORS policy could say "only `bank.com` allowed". Browser would still send the request, bank would still process it. CORS only restricts whether `evil.com`'s JavaScript can read the response.

So even with CORS configured perfectly, the classic CSRF goes through. The defenses are:

- **`SameSite=Lax` cookie**: browser default since Chrome 80 (2020). Cross-site sub-resource and form submissions don't carry the cookie. Kills this attack.
- **CSRF token**: server requires a per-session token in the form body. `evil.com` can't read it from `bank.com`'s pages (SOP).
- **`Origin` header check**: server inspects `Origin` and rejects unexpected values.

CORS is not on this list because CORS does not address request-level CSRF on simple requests. This is the most common misconception about CORS. The full breakdown of these defenses lives in [Stopping XSS and CSRF: who's responsible for what](/v2/xss-and-csrf-defense-stack).

---

## Attack story 2: blind CSRF (CORS partially helps)

Same setup, but instead of a form, `evil.com` uses `fetch` with credentials:

```js
fetch('https://bank.com/transfer', {
  method: 'POST',
  credentials: 'include',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ to: 'evil-account', amount: 1000 }),
})
```

This is a **non-simple request**. `Content-Type: application/json` is outside the simple set. **Preflight fires first**. Browser sends `OPTIONS https://bank.com/transfer` with `Access-Control-Request-Method: POST` and `Access-Control-Request-Headers: content-type`.

If `bank.com` does not allow `evil.com` in its CORS policy, the preflight fails. **The real POST never goes out.** The transfer doesn't happen.

If `bank.com` does allow `evil.com` (misconfiguration), preflight passes, request goes through, transfer happens. CORS allowing `*` plus `Access-Control-Allow-Credentials: true` is a known footgun. Browsers block this exact combination by spec.

A third case: preflight passes for the OPTIONS but the response is missing CORS headers on the actual POST. The request goes through, server processes it, but the browser blocks `evil.com`'s JS from reading the response. The attack succeeds but blind: the attacker doesn't know if it worked, can't read balance, can't plan a follow-up. A precise attack becomes a blind shot. CORS turned a known win into a guess.

---

## Attack story 3: supply chain (CORS gives a false sense of safety)

You whitelist `trusted-site.com` in your CORS policy because it's your partner. `trusted-site.com` loads an ad script from `ad-scripts.com`. That ad script ends up running inside `trusted-site.com`'s origin.

```html
<!-- trusted-site.com's HTML -->
<script src="https://ad-scripts.com/banner.js"></script>
```

The browser sees `<script src>` from `ad-scripts.com` but runs the script as part of `trusted-site.com`'s page. From CORS's perspective, the request to `bank.com/transfer` originates from `trusted-site.com`, which is on the whitelist. **CORS lets it through.** Bank responds normally. Ad script reads the response, exfiltrates.

CORS only knows about origins, not about the trustworthiness of code running inside an origin. **A whitelisted origin compromised by a supply chain attack defeats CORS entirely.**

Defenses for this layer are different:

- **Subresource Integrity (SRI)**: `<script src="..." integrity="sha384-...">`. Browser refuses to run scripts whose hash doesn't match. Catches CDN tampering or rogue ad-server delivery.
- **Content Security Policy (CSP)**: restrict which origins can load scripts, restrict inline scripts via nonce.
- **Principle of least privilege**: whitelist as few origins as possible, scope CORS rules per endpoint when possible.

---

## The clean mental split

Three jobs, three layers, often confused:

| Job | Mechanism | Who does it | Stops what |
|---|---|---|---|
| Hide secrets from the client | Server-side calls (Server Actions, Route Handlers, RSC) | You | Client-side leak of API keys, tokens, internals |
| Block cross-origin response reads | Same-Origin Policy + CORS | Browser (default) + server (opt-in unlock) | Cross-origin JS reading sensitive responses |
| Block cross-origin authenticated requests | `SameSite` cookie + CSRF token + Origin check | Browser default + server | Classic CSRF (form submissions, simple requests) |

Server-side calls are not a CORS feature. CORS is not a CSRF defense for simple requests. CSRF defense is not a substitute for stopping XSS. Tangling these together is what makes web security feel mystical.

---

## What I'd do today

- **API key or session token? Server-side call.** Don't expose it in client code, don't try to "obscure" it. Use Server Action / Route Handler / RSC.
- **Cross-origin API I own?** Set CORS explicitly. Allow only specific origins, never `*` when credentials are involved.
- **CSRF protection on the cookie path?** Rely on `SameSite=Lax` default + CSRF token on state-changing POST/PUT/DELETE + `Origin` check.
- **Loading third-party scripts?** Add SRI hashes. Add CSP. Treat every whitelisted origin as a potential supply chain.
- **Don't list CORS as a CSRF defense.** It only helps for non-simple cross-origin requests and only partially.

---

## References

- [Same-Origin Policy (MDN)](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy)
- [CORS (MDN)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
- [Stopping XSS and CSRF: who's responsible for what](/v2/xss-and-csrf-defense-stack)
- [Subresource Integrity (MDN)](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)
- [Why does my JS code receive a CORS error while Postman does not? (Sentry answers)](https://sentry.io/answers/why-does-my-javascript-code-receive-a-no-access-control-allow-origin-header-error-while-postman-does-not/)
- [CORS cannot use wildcard with credentials (StackOverflow)](https://stackoverflow.com/questions/19743396/cors-cannot-use-wildcard-in-access-control-allow-origin-when-credentials-flag-i)
