Skip to main content
Every HTTP response from woku includes a set of security headers calibrated to earn an A+ rating on securityheaders.com.

Common headers (all domains)

API (api.woku.app)

The API also serves the Swagger documentation at /documentation, which uses its own inline scripts. On the API, all of the headers above are applied and CSP is not enforced because the API is not an HTML surface for users. CSP protection is enforced on the frontends where code that the browser executes runs (review, admin). CORS is restricted to an allowlist (ALLOWED_ORIGINS env var). In development, localhost:5173 (Vite admin) and localhost:3000 (Next.js review) are added automatically.

Public frontend (review.woku.app)

In addition to the common headers, this domain applies a nonce-based CSP generated per request:
The key points:
  • script-src with nonce + strict-dynamic: only the Next.js bundle (which carries the nonce) and the scripts that this bundle loads dynamically are executed. Any <script> injected by an attacker (XSS) is blocked by the browser.
  • frame-ancestors 'none' + object-src 'none': nobody can embed woku in an <iframe> or load plugins. Defense against clickjacking.
  • connect-src limited: the frontend can only make XHR/fetch to api.woku.app (HTTPS and WSS). Any exfiltration to other domains is blocked by the browser.
  • upgrade-insecure-requests: if an http:// resource is left in by mistake, the browser rewrites it to https://.
The nonce is generated with crypto.getRandomValues(16 bytes) encoded in base64. It is unique per request and the browser rejects scripts that do not carry it.

Validation

We periodically test the three domains against:

Reporting a downgrade

If you find a woku domain with headers more permissive than those documented here: team@woku.app.