Rotación de tokens de actualización: prácticas recomendadas para desarrolladores
¿Quieres que tu aplicación sea más segura y al mismo tiempo mantener contentos a los usuarios? La rotación de tokens de actualización puede ser útil. Se trata de un método en el que los tokens de actualización se reemplazan después de cada uso, lo que garantiza que sean válidos solo una vez. Esto mejora la seguridad, bloquea los ataques de repetición y simplifica la gestión de sesiones, todo ello sin interrumpir la experiencia del usuario.
¿Por qué utilizar la rotación de tokens de actualización?
- Mayor seguridad:Limita el uso indebido de tokens y proporciona registros de actividad claros.
- Mejor control:Administre sesiones con precisión y revoque el acceso instantáneamente si es necesario.
- Experiencia de usuario fluida:Sesiones largas sin inicios de sesión frecuentes.
Cómo funciona:
- Cuando un token de acceso expira, el token de actualización se utiliza para solicitar uno nuevo.
- El servidor emite nuevos tokens de acceso y actualización mientras invalida el token de actualización antiguo.
- Esto crea una cadena segura de tokens, lo que reduce riesgos como el robo de tokens.
Pasos clave para la implementación:
- Establezca duraciones de token de acceso cortas (15 a 30 minutos).
- Utilice tokens de actualización de un solo uso (válidos durante 7 a 14 días).
- Almacene tokens de forma segura (por ejemplo, cookies solo HTTP o almacenamiento seguro del lado del servidor).
- Monitorear actividades sospechosas como reutilización de tokens o patrones de inicio de sesión inusuales.
Al adoptar la rotación de tokens de actualización, refuerzas la seguridad de tu aplicación y garantizas una autenticación fluida para los usuarios. ¿Quieres saber más? ¡Comencemos!
Detección de secuestro de sesión mediante tokens de actualización rotativos
Cómo funcionan los tokens de actualización
Esta sección explica el proceso de token OAuth 2.0 y cómo la rotación de tokens de actualización mejora la seguridad.
Flujo de tokens de OAuth 2.0

OAuth 2.0 gestiona los tokens de actualización mediante una secuencia definida de pasos. Cuando un usuario inicia sesión, el servidor de autorización proporciona dos tokens: un token de acceso de corta duración (válido entre 15 y 60 minutos) y un token de actualización de mayor duración (válido entre 7 y 14 días).
Así es como funciona el proceso:
1. Autenticación inicial
Después de un inicio de sesión exitoso, el sistema emite:
- Un token de acceso a corto plazo para llamadas API.
- Un token de actualización a más largo plazo para solicitar nuevos tokens de acceso.
2. Uso del token de acceso
El cliente incluye el token de acceso en el encabezado de autorización para cada solicitud de API, de la siguiente manera:
Autorización: Portador eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... 3. Actualizando el token
Cuando el token de acceso expira, el cliente utiliza el token de actualización para solicitar uno nuevo sin necesidad de que el usuario inicie sesión nuevamente.
A continuación, veamos cómo la rotación de tokens mejora este proceso.
Proceso de rotación de tokens
La rotación de tokens refuerza la seguridad al reemplazarlos después de cada actualización, lo que garantiza que los tokens de actualización sean válidos para un solo uso. Así funciona:
- El cliente observa que el token de acceso ha expirado.
- Envía el token de actualización actual al punto final del token.
- El servidor valida el token de actualización y emite nuevos tokens de acceso y actualización.
- El token de actualización antiguo no es válido.
- El servidor envía los nuevos tokens al cliente.
- El cliente actualiza sus tokens almacenados.
Este enfoque de "uso único" crea una cadena segura de tokens, lo que reduce el riesgo de uso indebido.
Para aplicar tokens de actualización de un solo uso, considere estas comprobaciones:
| Controlar | Propósito | Implementación |
|---|---|---|
| Detección de reutilización de tokens | Prevenir ataques de repetición | Realizar un seguimiento de los tokens de actualización usados en una lista negra |
| Período de gracia | Manejar condiciones de carrera | Permitir una ventana de 30 segundos para solicitudes simultáneas |
| Validación de la familia de tokens | Mantener el linaje del token | Incluir referencias de tokens principales en nuevos tokens |
La rotación de tokens funciona sin problemas en segundo plano, lo que mejora la seguridad y garantiza una experiencia de usuario fluida. Con este método, se garantizan actualizaciones de credenciales seguras y automáticas sin necesidad de iniciar sesión con frecuencia.
Configuración de la rotación de tokens
Pasos básicos de configuración
Para configurar la rotación de tokens, configure su servidor de autorización con los siguientes parámetros:
- Establezca la duración del token de acceso entre 15 y 30 minutos.
- Limite la validez del token de actualización a un máximo de 7 a 14 días.
- Habilite las comprobaciones de validación de tokens para garantizar la seguridad.
- Aplicar limitación de velocidad en los puntos finales del token para evitar el abuso.
Su servidor debe mantener un registro de tokens con estos campos esenciales:
| Campo | Propósito | Valor de ejemplo |
|---|---|---|
| Identificación del token | Identificador único | uuid-v4 |
| Hora de emisión | Marca de tiempo de la creación del token | 18/03/2025, 14:30 EST |
| Identificación familiar | Tokens relacionados con grupos | familia-uuid-v4 |
| Token anterior | Realiza un seguimiento del token principal | hash del token anterior |
| Estado de revocación | Indica el estado del token | activo/revocado |
Una vez configurado, pase a implementar la rotación de tokens en su código.
Ejemplos de programación
A continuación se muestra un ejemplo de rotación de tokens utilizando Node.js:
const jwt = require('jsonwebtoken'); const crypto = require('crypto'); función asíncrona rotateTokens(refreshToken) { const decodedToken = jwt.verify(refreshToken, process.env.SECRET_KEY); // Generar un nuevo par de tokens const newAccessToken = jwt.sign( { userId: decodedToken.userId }, process.env.SECRET_KEY, { expiresIn: '30m' } ); const newRefreshToken = jwt.sign( { userId: decodedToken.userId, familyId: decodedToken.familyId, previousToken: crypto.createHash('sha256') .update(refreshToken).digest('hex') }, process.env.SECRET_KEY, { expiresIn: '7d' } ); // Invalidar el token de actualización antiguo await invalidateToken(refreshToken); return { accessToken: newAccessToken, refreshToken: newRefreshToken }; } Mejores prácticas para el almacenamiento de tokens
Después de implementar la rotación de tokens, asegúrese de que los tokens se almacenen de forma segura siguiendo estas prácticas:
- Almacenamiento del lado del servidor
Utilice una base de datos segura y rápida como Redis para almacenar los metadatos de los tokens. La compatibilidad con la expiración integrada de Redis es especialmente útil:await redis.setex( `token:${tokenId}`, 604800, // 7 días en segundos JSON.stringify(tokenMetadata) ); - Almacenamiento del lado del cliente
Para aplicaciones web, almacene los tokens de actualización en cookies solo HTTP con indicadores de seguridad adecuados:res.cookie('refreshToken', token, { httpOnly: true, secure: true, sameSite: 'strict', maxAge: 604800000 // 7 días en milisegundos }); - Aplicaciones móviles
Utilice opciones de almacenamiento seguro específicas de la plataforma:- iOS: Servicios de llavero
- Android: Preferencias compartidas cifradas
- React Native: Almacenamiento asíncrono cifrado
Evite estos errores al almacenar tokens:
- Nunca guarde tokens en
almacenamiento local, ya que es vulnerable a ataques XSS. - Evite incrustar datos confidenciales en la carga útil JWT.
- Asegúrese de que todos los datos almacenados estén encriptados.
- Mantenga los tokens de acceso y actualización en ubicaciones de almacenamiento separadas para reducir riesgos.
sbb-itb-59e1987
Medidas de seguridad
Prevención de la reutilización de tokens
Para detener los ataques de repetición, monitoree el uso del token con un sistema centralizado que rastrea los cambios de estado del token:
const tokenRegistry = { async markTokenUsed(tokenId, timestamp) { const token = await db.tokens.findOne({ id: tokenId }); if (token.used || token.revoked) { throw new SecurityError('Se detectó reutilización de token'); } await db.tokens.update({ id: tokenId, used: true, lastUsedAt: timestamp }); } }; Si se detecta una reutilización de tokens, tome medidas inmediatas:
- Revocar el token para evitar un mayor uso indebido.
- Registrar el incidente para fines de auditoría.
- Forzar la reautenticación para la sesión afectada.
- Notificar a los administradores para investigar la violación.
Estos pasos complementan los métodos de revocación de tokens que se describen a continuación.
Pasos para la revocación de tokens
La revocación de tokens se puede aplicar en diferentes niveles según la situación:
| Tipo de revocación | Cuándo utilizarlo | Impacto |
|---|---|---|
| Token único | Actividad sospechosa en un dispositivo | Sólo se ve afectado el token específico |
| Revocación familiar | Violación que involucra múltiples dispositivos | Todos los tokens relacionados quedan invalidados |
| Revocación global | Incidente de seguridad importante | Todos los tokens activos se revocan en todo el sistema. |
A continuación se muestra un ejemplo de revocación de token familiar:
función asíncrona revokeTokenFamily(familyId) { await db.tokens.updateMany( { familyId: familyId }, { revoked: true, revokedAt: new Date(), reason: 'security_breach' } ); // Notificar a los clientes await notifyClients(familyId); // Registrar evento de seguridad await logSecurityEvent({ type: 'family_revocation', familyId: familyId, timestamp: new Date() }); } Límites de uso y seguimiento
Monitorear las solicitudes de tokens es esencial para detectar actividad inusual. Utilice límites de frecuencia y monitoree los patrones de uso para identificar posibles amenazas:
const rateLimits = { tokenRequests: { ventana: '15m', intentos máximos: 100, duración del bloque: '1h' }, intentos de actualización: { ventana: '24h', intentos máximos: 1000, duración del bloque: '24h' } }; Las métricas clave a monitorear incluyen:
- Frecuencia de actualización de tokens por usuario
- Intentos fallidos de actualización del token
- Origen geográfico de las solicitudes
- Tendencias de uso basadas en el tiempo
- Número de sesiones activas simultáneas
Configure alertas para comportamientos sospechosos, como:
- Múltiples intentos de actualización desde diferentes IP
- Rotaciones rápidas de tokens
- Acceso en horarios inusuales
- Solicitudes de lugares inesperados
Almacene datos de uso de tokens en una base de datos de series temporales para un mejor análisis y detección de amenazas:
const metrics = { async recordTokenUsage(tokenId, context) { await timeseriesDB.insert({ timestamp: new Date(), tokenId: tokenId, userId: context.userId, ipAddress: context.ip, userAgent: context.userAgent, geoLocation: await geolocate(context.ip) }); } }; Cuando se detecten irregularidades, refuerce la seguridad mediante:
- Aumento de los intervalos de seguimiento
- Acortamiento de los tiempos de expiración de los tokens
- Agregar pasos de verificación adicionales
- Iniciar revisiones manuales para una investigación más profunda
Pruebas y mantenimiento
Procedimientos de prueba
Las pruebas automatizadas son esenciales para garantizar que el proceso de rotación de tokens funcione correctamente. A continuación, se muestra un ejemplo de cómo probar esta funcionalidad:
describe('Pruebas de rotación de tokens', () => { test('debe rotar y validar tokens', async () => { // Probar la rotación básica const initialToken = await generateRefreshToken(); const rotatedToken = await rotateToken(initialToken); expect(rotatedToken).not.toEqual(initialToken); expect(await validateToken(rotatedToken)).toBeTruthy(); // Probar el flujo de autenticación completo const authResponse = await authenticate(credentials); await simulatorTokenExpiry(authResponse.accessToken); const newTokens = await performTokenRotation(authResponse.refreshToken); await verifyTokenLineage(authResponse.refreshToken, newTokens.refreshToken); }); }); Una vez que haya confirmado que la rotación de tokens funciona como se espera, controle el rendimiento del sistema para identificar y resolver problemas de manera temprana.
Monitoreo del sistema
Realice un seguimiento del rendimiento de la rotación de tokens utilizando métricas clave para mantener la confiabilidad:
| Métrico | Descripción | Umbral de alerta |
|---|---|---|
| Latencia de rotación | Tiempo para completar la rotación | > 500 ms |
| Tasa de éxito | Rotaciones exitosas | < 99.9% |
| Longitud de la cadena de tokens | Rotaciones en secuencia | > 50 rotaciones |
| Frecuencia de error | Intentos fallidos por hora | > 10 errores |
Además, registre todos los eventos del ciclo de vida del token para una mejor trazabilidad:
const rotateLogger = { async logRotationEvent(evento) { await logger.info('token_rotation', { timestamp: new Date().toISOString(), tokenId: evento.tokenId, rotateDuration: evento.duración, estado: evento.estado, errorCode: evento.error || null }); } }; Gestión de errores
Incluso con pruebas y monitoreo exhaustivos, pueden ocurrir errores. Utilice mecanismos de recuperación específicos para abordarlos eficazmente:
const errorHandler = { async handleRotationError(error, context) { // Manejo de errores primario con disyuntor integrado if (this.failureCount >= 5) { await this.activateFailover(); return; } switch(error.code) { case 'TOKEN_EXPIRED': await forceReauthentication(context.userId); break; case 'DATABASE_ERROR': await this.retryWithBackoff(context); break; default: await this.notifyAdministrator(error); } await metrics.recordError(error); }, async retryWithBackoff(context, intentos = 0) { if (intentos > 3) return; await new Promise(resolve => setTimeout(resolve, Math.pow(2, intentos) * 1000)); return this.handleRotationError(context, intentos + 1); } }; Este enfoque garantiza que los errores se gestionen de manera eficiente, minimizando las interrupciones en el sistema.
Conclusión
Puntos clave
La rotación del token de actualización garantiza un equilibrio entre seguridad, actuación, y experiencia del usuarioEstas son las prácticas básicas que conviene tener en cuenta:
- Optimizar el rendimiento del sistema mediante un seguimiento continuo.
- Implementar un manejo resiliente de errores para permitir una recuperación sin problemas de los problemas.
- Realizar pruebas rigurosas para validar y afinar el mecanismo de rotación.
Guía paso a paso para la implementación
Si está listo para implementar la rotación de tokens, aquí le mostramos un desglose del proceso:
- Configuración inicial
Comience por crear un almacenamiento seguro de tokens con métodos de cifrado estándar. Incorpore la limitación de velocidad y asegúrese de que su servidor de autenticación pueda escalar para satisfacer la demanda. - Configuración de seguridad
Defina parámetros críticos como la duración de los tokens, las ventanas de rotación y los límites. Por ejemplo, aquí tiene una configuración sencilla:const securityConfig = { tokenLifetime: 3600, // Tokens válidos por 1 hora rotateWindow: 86400, // Tokens de actualización válidos por 24 horas maxRotations: 30, // Número máximo de rotaciones de tokens jwtAlgorithm: 'RS256', // Algoritmo de cifrado asimétrico tokenLength: 256 // Tamaño del token en bits }; - Configuración de monitoreo
Establezca umbrales para el rendimiento del sistema y configure alertas ante anomalías. Prepárese para escalar su infraestructura cuando las métricas muestren un aumento de la demanda. - Despliegue de producción
Implemente el sistema gradualmente, prestando atención a las métricas críticas. Mantenga registros detallados de los eventos de rotación para auditoría y resolución de problemas. Para una infraestructura escalable y confiable, considere soluciones de alojamiento como Servion (https://servidor.com), que admite entornos de alto rendimiento.