# 02 — Seguridad, Autenticación y Cifrado
## Estándar obligatorio de cookies HTTP-only, middleware Next.js y encriptación Kong
> **Uso:** Esta guía define las directrices y mecanismos de protección obligatorios para evitar fugas de información, proteger sesiones de usuario y asegurar transacciones.
---
## 1. Protección de Rutas (Autenticación Server-Side)
El frontend protege páginas y layouts directamente en el servidor utilizando el middleware `serverRequireAuth` antes de renderizar la interfaz. Esto previene el parpadeo de pantallas ("flash of unauthenticated content") y asegura que ningún Server Component exponga datos no autorizados.
### 1.1 Proteger un Server Component (Page / Layout):
```typescript
import { serverRequireAuth } from '@/lib/auth/middleware';
export default async function DashboardPage() {
// 1. Invocar obligatoriamente en la cabecera
const user = await serverRequireAuth(); // Redirige a /login si falla la sesión
// 2. Si pasa, renderizamos de forma segura con los datos del usuario
return (
Bienvenido al Portal Seguro, {user.name}
ID de usuario verificado: {user.id}
);
}
```
### 1.2 Chequeo de Autenticación Opcional:
Si deseas validar si el usuario está autenticado pero sin forzar la redirección (ej. en la Landing Page pública):
```typescript
import { checkAuth } from '@/lib/auth/middleware';
export default async function LandingPage() {
const { isAuthenticated, user } = await checkAuth();
return (
);
}
```
---
## 2. Almacenamiento Seguro de Sesión (HTTP-only Cookies)
Queda **estrictamente prohibido** almacenar tokens JWT, contraseñas o datos de sesión en `localStorage` o `sessionStorage`. El navegador es vulnerable a ataques XSS y robo de tokens en estos alcances.
### Directrices de Cookies:
1. **`access_token`** y **`refresh_token`** deben configurarse en el backend o en el Route Handler de Next.js como:
- `httpOnly: true` (Evita acceso por scripts JS).
- `secure: true` (Viaja solo por HTTPS — desactivado solo en localhost).
- `sameSite: 'strict'` (Mitigación completa de CSRF).
- `path: '/'` (Válido para todo el dominio).
---
## 3. Cifrado Perimetral de Datos (Kong Gateway)
Para cualquier dato altamente sensible en tránsito en el cliente (como números de cuenta de ahorros, saldos o datos personales) que no queramos que sea interceptado o inspeccionado en las herramientas de desarrollo del navegador, aplicaremos el cifrado Kong perimetral.
Utilizamos las funciones integradas en `lib/cypher/encrypt.ts` y `lib/cypher/decrypt.ts`:
### 3.1 Cifrar datos en el cliente antes de enviar:
```typescript
import { kongEncrypt } from '@/lib/cypher/encrypt';
function ConfirmarTransaccion() {
const enviarMontoSeguro = () => {
const cuentaOrigenCifrada = kongEncrypt('0102-1234-56-1234567890');
// El payload viajará cifrado y será descifrado en el Gateway Kong o en el Backend
apiCall('/api/transferencia', {
cuentaOrigen: cuentaOrigenCifrada
});
};
}
```
### 3.2 Descifrar datos en el servidor/cliente tras recibirlos:
```typescript
import { kongDecrypt } from '@/lib/cypher/decrypt';
function DetalleCuenta({ cuentaEncriptada }: { cuentaEncriptada: string }) {
// Descifrar para visualización del usuario final
const numeroCuentaReal = kongDecrypt(cuentaEncriptada);
return (
Número de cuenta: {numeroCuentaReal}
);
}
```
---
## 4. Reglas de Oro de Seguridad en Frontend
- **Secrets de Entorno:** Nunca commitees archivos `.env.local` con secretos de producción reales. Las variables de servidor de Next.js (sin prefijo `NEXT_PUBLIC_`) son inaccesibles para el cliente. Úsalas para llaves privadas de cifrado o tokens de backend.
- **Sanitización de Inputs:** Valida y sanitiza todos los datos ingresados por el usuario utilizando esquemas robustos (Zod o TypeScript estricto) antes de renderizarlos en la UI para prevenir inyecciones HTML/React.