> ## Documentation Index
> Fetch the complete documentation index at: https://woku.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Headers de seguridad y CSP

> HSTS, CSP nonce-based, X-Frame-Options, Permissions-Policy y demás headers aplicados por defecto

Toda respuesta HTTP de Woku incluye un set de headers de seguridad
calibrados para obtener calificación A+ en
[securityheaders.com](https://securityheaders.com).

## Headers comunes (todos los dominios)

| Header                       | Valor                                                                  | Por qué                                                                                  |
| ---------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| `Strict-Transport-Security`  | `max-age=63072000; includeSubDomains; preload`                         | Fuerza HTTPS por 2 años en navegador. Apto para HSTS preload list.                       |
| `X-Content-Type-Options`     | `nosniff`                                                              | Bloquea MIME-sniffing.                                                                   |
| `X-Frame-Options`            | `DENY`                                                                 | Bloquea cualquier framing del contenido. Defensa-en-profundidad sobre `frame-ancestors`. |
| `Referrer-Policy`            | `strict-origin-when-cross-origin`                                      | No leakea path/query a sitios externos.                                                  |
| `Permissions-Policy`         | `camera=(self), microphone=(self), geolocation=(), interest-cohort=()` | Habilita cámara/micrófono solo para Woku; bloquea geolocation y FLoC.                    |
| `Cross-Origin-Opener-Policy` | `same-origin`                                                          | Aísla el contexto del navegador para mitigar Spectre.                                    |

## API (`api.woku.app`)

La API sirve también la documentación Swagger en `/documentation`,
que usa scripts inline propios. En el API se aplican todos los
headers de arriba y **CSP no se enforza** porque la API no es una
superficie HTML para usuarios. La protección CSP se enforza en los
frontends donde corre código que ejecuta el navegador (review,
admin).

CORS está restringido a una **allowlist** (`ALLOWED_ORIGINS` env
var). En desarrollo se añaden `localhost:5173` (Vite admin) y
`localhost:3000` (Next.js review) automáticamente.

## Frontend público (`review.woku.app`)

Además de los headers comunes, este dominio aplica una **CSP
nonce-based** generada per-request:

```
default-src 'self';
script-src 'self' 'nonce-<random>' 'strict-dynamic';
style-src 'self' 'unsafe-inline';
img-src 'self' blob: data: https://wokuapifiles.s3.us-east-1.amazonaws.com;
font-src 'self' data:;
connect-src 'self' https://api.woku.app wss://api.woku.app;
media-src 'self' blob: https://wokuapifiles.s3.us-east-1.amazonaws.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
object-src 'none';
upgrade-insecure-requests
```

Lo importante:

* **`script-src` con nonce + `strict-dynamic`**: solo se ejecuta el
  bundle de Next.js (que lleva el nonce) y los scripts que ese
  bundle cargue dinámicamente. Cualquier `<script>` inyectado por un
  atacante (XSS) es bloqueado por el navegador.
* **`frame-ancestors 'none'` + `object-src 'none'`**: nadie puede
  embeber Woku en un `<iframe>` ni cargar plugins. Defensa contra
  clickjacking.
* **`connect-src` limitado**: el front solo puede hacer XHR/fetch a
  `api.woku.app` (HTTPS y WSS). Cualquier exfiltración a otros
  dominios es bloqueada por el navegador.
* **`upgrade-insecure-requests`**: si por error queda un recurso
  `http://`, el navegador lo reescribe a `https://`.

El nonce se genera con `crypto.getRandomValues(16 bytes)` codificado
en base64. Es **único por request** y el navegador rechaza scripts que
no lo lleven.

## Validación

Periodicamente probamos los tres dominios contra:

* [securityheaders.com](https://securityheaders.com) → objetivo
  **A+** sostenido.
* [Mozilla Observatory](https://observatory.mozilla.org) → objetivo
  **A+** sostenido.
* [Hardenize](https://www.hardenize.com) → batería completa
  (TLS, CSP, HTTPS, HSTS, redirects, certs).

## Reportar un downgrade

Si descubres un dominio Woku con headers más permisivos que los
documentados aquí: `team@woku.app`.
