Este documento describe la arquitectura de seguridad aplicada al sistema de autenticación de la aplicación Leonobitech, incluyendo cookies httpOnly, Redis, fingerprint, middleware y validación profunda de tokens.
La autenticación se implementa en múltiples niveles, cada uno con responsabilidades claras:
| Capa | Propósito | Corre en | Validación profunda |
|---|---|---|---|
middleware.ts |
Bloqueo superficial de rutas públicas si hay cookies | Edge / App Router | ❌ |
SessionProvider |
Estado global de sesión vía React Query | Cliente (React) | ✅ (via API) |
/api/auth/session |
Proxy seguro con meta y cookies hacia backend real | API Route | ✅ |
backend /account/me |
Validación real: Redis, fingerprint, expiración, revocado | Backend Core | ✅ 🔐 |
| Nombre | Propósito | Tipo | Seguridad |
|-------------|----------------------------------------- --|----------|---------------------------------|
| accessKey | Identificador (jti) del access token | httpOnly | secure, sameSite=strict |
| clientKey | Hash del fingerprint del dispositivo | httpOnly | secure, sameSite=strict |
Las cookies nunca contienen tokens. Se usan como claves para lookup seguro en Redis y fingerprint.
El archivo middleware.ts intercepta las rutas públicas /login, /register, /verify-email si existen cookies activas, y redirige al dashboard sin validar el token.
if (accessKey && clientKey && isPublicRoute(path)) {
redirect("/dashboard");
}No consume Redis ni verifica JWT. Previene render innecesario de páginas públicas para usuarios ya autenticados.
- Se recibe
accessKey(hashedjti) yclientKey(fingerprint). - Se busca el token en Redis.
- Se verifica firma JWT, expiración,
aud,sub, etc. - Se reconstruye el fingerprint desde
meta. - Se compara con
clientKeyy datos originales del token. - Si coincide → sesión válida. Si no →
401 Unauthorized.
Cuando el access token no está en Redis:
- El middleware
authenticatedel backend detecta su ausencia. - Busca el refresh token persistido en la base de datos mediante
clientKey. - Valida fingerprint nuevamente.
- Si todo es válido, se generan nuevos tokens.
- Se actualizan cookies con nuevos
accessKeyyclientKey.
Incluye:
{
deviceInfo: { device, os, browser },
userAgent,
language,
platform,
timezone,
screenResolution,
label
}Se usa para:
- Regenerar el fingerprint (
clientKey) - Detectar cambios sospechosos en el dispositivo
- Vincular dispositivos únicos por usuario
En el endpoint /api/auth/session se bloquean IPs privadas:
127.0.0.1,::1,10.x.x.x,192.168.x.x, etc.- Previene falsificación local desde entornos no autorizados
- Se puede deshabilitar en entorno de desarrollo
- Cada request incluye un
X-Request-IDúnico para trazabilidad. - Se loguean eventos críticos: fingerprint inválido, IP sospechosa, sesión inválida.
- Se integran logs con consola, archivos o base de datos de eventos.
- Cookies httpOnly sin exponer tokens al cliente
- Redis TTL para access tokens (auto-expiración real)
- Validación cruzada con fingerprint + metadata
- Middleware de bloqueo preventivo sin costo de validación
- Proxy centralizado (
/api/auth/session) para control completo - Backend único de verdad (
/account/me)
Leonobitech Dev Team
https://www.leonobitech.com
Auditoría. Trazabilidad. Seguridad real.