
# Seguridad web de las páginas alojadas y de la API de front

El inicio de sesión alojado, el portal de cuenta, las páginas de correo electrónico (verificación, restablecimiento de contraseña, invitación) y la API del navegador que estas llaman siguen una base fija de seguridad web en todos los planes. Estas protecciones no son configuraciones que pueda desactivar. El único ajuste que usted controla es qué orígenes web pueden llamar a los endpoints de OAuth desde el navegador.

## Falsificación de petición entre sitios (CSRF)

Las peticiones que cambian el estado se comprueban antes de leer o modificar nada:

- **Comprobación de origen.** Una petición que cambia el estado, dirigida a la API de inicio de sesión alojado o a una página de verificación o restablecimiento, debe incluir una cabecera `Origin` que coincida exactamente con el host de inicio de sesión del entorno. Cualquier otro origen se rechaza con `origin_not_allowed`.
- **Pantalla de consentimiento.** Un envío de formulario en la pantalla de consentimiento se rechaza cuando su `Origin` no es el host propio de la página, o cuando `Sec-Fetch-Site` está presente y no es `same-origin`.
- **Tokens de formulario.** Cada transacción de inicio de sesión y cada formulario de correo tiene su propio token CSRF, derivado con HMAC-SHA256 a partir de una clave por entorno. La API de inicio de sesión lo espera en la cabecera `Idp-Csrf-Token`; el token de un formulario no sirve para otro. Los tokens se comparan en tiempo constante.
- **Cookies.** Las cookies que transportan el estado del inicio de sesión usan `SameSite=Lax` (véase más abajo), por lo que una petición iniciada desde otro sitio no las envía.

## Peticiones de origen cruzado (CORS)

CORS solo se responde en los endpoints de OAuth que llama una aplicación de navegador: los endpoints de token, revocación, solicitud de autorización enviada (PAR) y userinfo. Se aplica solo a las aplicaciones de página única públicas (tipo `spa`).

- Defina los orígenes permitidos por aplicación con `allowed_web_origins` (`https://host[:port]`, como máximo 20, sin comodines). Consulte [Cree una aplicación](/docs/api/management/applications/create).
- La petición preflight del navegador no indica qué aplicación llama, por lo que se responde con la unión de los orígenes permitidos de las aplicaciones de página única públicas activas del entorno. La petición real se comprueba entonces con la lista de orígenes de la aplicación que llama.
- Un origen fuera de la lista de esa aplicación se rechaza con `403 origin_not_allowed` y no recibe la cabecera `Access-Control-Allow-Origin`.
- Un origen permitido se devuelve exactamente igual. `*` y `null` nunca se envían, `Access-Control-Allow-Credentials` nunca se envía, y cada respuesta de origen cruzado incluye `Vary: Origin`.
- Las peticiones desde el propio host de inicio de sesión no son de origen cruzado y no se ven afectadas.

## Redirecciones tras el inicio de sesión

Si usa el SDK de Next.js, `returnTo` debe ser una ruta de su propia aplicación. Una URL completa o un valor como `//evil.example` se ignora y el usuario llega a `/`. Consulte [SDK de Next.js](/docs/sdk/nextjs).

## Cabeceras de seguridad

Las páginas alojadas establecen estas cabeceras en cada respuesta:

| Cabecera | Valor |
|---|---|
| `Content-Security-Policy` | `default-src 'none'`; scripts solo con un nonce nuevo por respuesta; `style-src 'self'`; `connect-src 'self'`; `frame-ancestors 'none'`; `base-uri 'none'`; `object-src 'none'`; `upgrade-insecure-requests`; Trusted Types obligatorio para los scripts |
| `Reporting-Endpoints` y `report-to` | Las infracciones de la política se notifican a `/u/csp-report` en el mismo host |
| `X-Frame-Options` | `DENY`: las páginas alojadas no pueden incrustarse en un marco |
| `X-Content-Type-Options` | `nosniff` |
| `Referrer-Policy` | `no-referrer` |
| `Cross-Origin-Opener-Policy` | `same-origin` |
| `Permissions-Policy` | Cámara, micrófono, geolocalización, pagos, USB, serie, HID y Bluetooth están desactivados; las solicitudes de clave de acceso se permiten para la propia página |
| `Cache-Control` | `no-store` |

La política no permite scripts en línea ni palabras clave `unsafe-`. Los envíos de formularios se limitan al host propio de la página; en la pantalla de consentimiento, la política también permite la dirección de redirección de la aplicación que solicita, para que la decisión pueda volver a ella.

El endpoint de informes acepta solo informes de infracciones del navegador de como máximo 8 KiB, y tiene límite de frecuencia por dirección IP. Los informes se cuentan por directiva. Al registrarse, no incluyen la cadena de consulta, el fragmento ni datos del usuario.

### Strict-Transport-Security

- Los hosts de entorno en `keenauth.app` envían `max-age=63072000; includeSubDomains`.
- Un [dominio personalizado](/docs/guides/custom-domains) envía solo `max-age=63072000`, sin `includeSubDomains`. KeenAuth no puede decidir por los demás subdominios de su dominio, por lo que esa elección le corresponde a usted.

## Cookies

Las cookies de estado del inicio de sesión llevan el prefijo `__Host-`, por lo que un navegador solo las acepta por HTTPS, con `Path=/` y sin atributo `Domain`. No pueden establecerse desde un subdominio hermano.

| Cookie | Indicadores | Finalidad |
|---|---|---|
| `__Host-idp_session` | `Secure`, `HttpOnly`, `SameSite=Lax` | La sesión del usuario. Su duración termina en la expiración absoluta de la sesión |
| `__Host-idp_device` | `Secure`, `HttpOnly`, `SameSite=Lax` | Reconocimiento del dispositivo |
| `__Host-idp_ltx` y `__Host-idp_azr_*` | `Secure`, `HttpOnly`, `SameSite=Lax` | Vincula un intento de inicio de sesión o autorización al navegador que lo inició |
| `__Host-idp_fed_bind` | `Secure`, `HttpOnly`, `SameSite=None` | Vinculación de corta duración para el inicio de sesión SAML empresarial. El proveedor de identidad envía los datos de vuelta desde otro sitio, por lo que `Lax` la descartaría |

Los scripts de la página no pueden leer los valores de las cookies (`HttpOnly`).

## Relacionado

- [Seguridad del acceso al panel](/docs/security/dashboard-access)
- [Aislamiento de inquilinos](/docs/security/tenant-isolation)
- [Personalice sus páginas de inicio de sesión](/docs/guides/branding)
