Definición
¿Alguna vez has visitado un museo donde te sellan la mano para poder entrar y salir sin hacer cola de nuevo? El access token es exactamente eso pero para APIs - es la prueba de que ya te autenticaste y tienes permiso para acceder a ciertos recursos. En lugar de enviar tu contraseña con cada petición (peligroso y tedioso), presentas este token que dice “ya verifiqué mi identidad, déjame pasar.”
Cuando inicias sesión en una aplicación, el servidor de autenticación verifica tus credenciales y te entrega un access token. Este token es como un pase VIP temporal - tiene información sobre quién eres y qué puedes hacer, y tiene fecha de caducidad. Cada vez que tu aplicación necesita datos del servidor, incluye este token en la petición. El servidor lo verifica y, si es válido, te da lo que pediste.
¿Por qué no duran para siempre? Seguridad. Si alguien roba tu access token, solo funciona por poco tiempo - minutos u horas, no días o años. Es como si tu pase VIP del concierto expirara a medianoche: incluso si lo pierdes, el daño está limitado. Para sesiones largas, usamos refresh tokens (otro concepto) que obtienen nuevos access tokens sin requerir que vuelvas a introducir tu contraseña.
Ejemplo
Apps Bancarias Móviles: Cuando abres tu app del banco, introduces tu PIN o huella. El servidor verifica y te da un access token que dura quizás 15 minutos. Durante esos 15 minutos, puedes ver saldos, hacer transferencias - todo usando ese token. Después de 15 minutos, necesitas autenticarte de nuevo (o un refresh token lo hace por ti).
Integración con Redes Sociales: Tu aplicación de gestión de redes pide acceso a tu cuenta de Twitter. Autorizas, y Twitter le da un access token. Ahora la app puede publicar tweets en tu nombre usando ese token. El token tiene “scopes” específicos - quizás puede publicar pero no puede leer tus mensajes privados.
APIs de Terceros: Cuando una app de fitness sincroniza con Apple Health, obtiene un access token que le permite leer tus datos de ejercicio. El token especifica exactamente qué puede acceder - pasos sí, ubicación no. Si la app intenta leer algo fuera de su scope, el token es rechazado.
Sesiones de E-commerce: Al iniciar sesión en Amazon, obtienes un access token que te identifica mientras navegas. Cada vez que agregas algo al carrito o ves tus pedidos, ese token va con la petición. Amazon verifica el token para saber que eres tú y no un impostor.
Analogía
El Pase VIP del Concierto: Entras al concierto mostrando tu entrada (autenticación). Te dan una pulsera VIP (access token) que te permite acceder al backstage, pero solo durante el concierto. La pulsera tiene un color específico (scopes) que indica exactamente a qué áreas puedes entrar. Mañana la pulsera ya no sirve - expiró.
La Tarjeta del Hotel: Cuando haces check-in (autenticación), te dan una tarjeta magnética (access token). Esa tarjeta abre tu habitación y quizás el gimnasio, pero no otras habitaciones ni áreas de servicio. La tarjeta expira cuando termina tu estancia. Si la pierdes, se puede desactivar y emitir una nueva.
La Sesión de la Biblioteca: Usas tu carnet para entrar a la biblioteca (autenticación) y obtener acceso a las salas de estudio por 4 horas (access token). Durante esas horas puedes entrar y salir de la sala libremente. Pasadas las 4 horas, necesitas volver al mostrador para renovar.
El Ticket de Estacionamiento Validado: Entras al centro comercial y te validan el ticket (autenticación). El ticket validado (access token) te permite salir sin pagar por cierto tiempo. Después de 3 horas, el ticket expira y ya no es válido - necesitas una nueva validación.
Code Example
// Usando un access token en peticiones a la API
const response = await fetch('https://api.example.com/user/profile', {
headers: {
'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...',
'Content-Type': 'application/json'
}
});
// Verificando el token en el servidor
function verifyAccessToken(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader?.startsWith('Bearer ')) {
return res.status(401).json({ error: 'Token no proporcionado' });
}
const token = authHeader.substring(7);
try {
const decoded = jwt.verify(token, publicKey);
req.user = decoded;
next();
} catch (error) {
return res.status(401).json({ error: 'Token inválido o expirado' });
}
}
Diagrama
sequenceDiagram
participant Cliente as Cliente
participant AuthServer as Servidor Auth
participant API
Cliente->>AuthServer: 1. Autenticar (usuario/contraseña)
AuthServer->>AuthServer: Validar credenciales
AuthServer->>Cliente: 2. Access Token (TTL: 15-60 min)
Note over Cliente: Token almacenado de forma segura
Cliente->>API: 3. Petición + Bearer token
API->>API: Validar firma del token
API->>API: Verificar expiración
API->>Cliente: 4. Recurso protegido
Note over Cliente,API: Más tarde...
Cliente->>API: 5. Petición + Bearer token
API->>API: Token expirado!
API->>Cliente: 6. 401 No autorizado
Note over Cliente: Usar refresh token para obtener nuevo access token
Notas de Seguridad
CRÍTICO - …
Configuración y Validación:
- Almacena access tokens de forma segura (nunca en localStorage para apps web, usa cookies httpOnly o memoria).
- Establece tiempos de expiración cortos (5-60 minutos).
- Transmite solo sobre HTTPS.
- Valida tokens en cada petición.
Monitoreo y Protección:
- Implementa rotación de tokens.
- Monitorea robo de tokens mediante rate limiting y detección de anomalías.
- Nunca registres access tokens en logs.
- Usa tokens separados para diferentes scopes/audiencias.
- Implementa revocación de tokens para logout y compromiso de cuentas.