Security - Visión General
Paquete: @tiendana/utils
Funciones para manejar aspectos de seguridad como parsing de JWT tokens y validación de dominios para prevenir ataques CSRF y redirecciones no autorizadas.
Funciones Disponibles
parseJwt
Decodifica un JWT token sin verificar la firma, extrayendo el payload.
const payload = parseJwt(token);
// { userId: '123', email: 'user@example.com', exp: 1234567890 }
isSameDomain
Verifica si dos URLs pertenecen al mismo dominio (host).
isSameDomain('https://example.com/page1', 'https://example.com/page2');
// true
isSameDomain('https://example.com', 'https://other.com');
// false
Casos de Uso Comunes
Validación de JWT Client-Side
import { parseJwt } from '@tiendana/utils';
function isTokenExpired(token: string): boolean {
try {
const payload = parseJwt(token);
const now = Math.floor(Date.now() / 1000);
return payload.exp < now;
} catch {
return true;
}
}
Prevención de Open Redirects
import { isSameDomain } from '@tiendana/utils';
function safeRedirect(targetUrl: string) {
const currentUrl = window.location.href;
if (isSameDomain(currentUrl, targetUrl)) {
window.location.href = targetUrl;
} else {
console.warn('Redirect bloqueado: dominio diferente');
}
}
Auth Guard
import { parseJwt } from '@tiendana/utils';
import { getCookie } from '@tiendana/utils';
function checkAuthentication(): boolean {
const token = getCookie('auth_token');
if (!token) return false;
try {
const payload = parseJwt(token);
const now = Math.floor(Date.now() / 1000);
return payload.exp > now;
} catch {
return false;
}
}
Cuándo Usar Cada Función
| Función | Usar cuando... |
|---|---|
parseJwt | Necesitas leer datos de un JWT sin verificar la firma (client-side) |
isSameDomain | Necesitas validar redirects o verificar origen de URLs |
⚠️ Advertencias de Seguridad
parseJwt solo DECODIFICA el token, NO VERIFICA la firma. NUNCA uses esta función para validación de seguridad en el servidor:
// ❌ INSEGURO - No verificar firma en servidor
const payload = parseJwt(token);
if (payload.role === 'admin') {
// Cualquiera puede crear un token con role: admin
}
// ✅ SEGURO - Solo para leer info en cliente
const payload = parseJwt(token);
console.log(`Bienvenido, ${payload.userName}`);
La verificación de firma DEBE hacerse en el servidor con librerías como jsonwebtoken o jose.
isSameDomain compara solo el host (dominio + puerto), no el protocolo:
// Estos se consideran mismo dominio (mismo host)
isSameDomain('http://example.com', 'https://example.com');
// true (⚠️ mismo dominio, diferente protocolo)
// Si necesitas validar protocolo también:
function isSameOrigin(url1: string, url2: string): boolean {
try {
const uri1 = new URL(url1);
const uri2 = new URL(url2);
return uri1.origin === uri2.origin;
} catch {
return false;
}
}
Características Comunes
✅ Client-side safe: Seguras para usar en el navegador
✅ Error handling: Manejo de errores sin crashes
✅ Type-safe: TypeScript bien definido
⚠️ NO para autenticación: No reemplazan validación server-side
Ver También
- Cookies - Para almacenar/leer tokens
- Validation - Validación adicional de datos