He implementado un sistema de autenticación con JWT y refresh tokens para una API REST. La idea es que el access token expire en 15 minutos y el refresh token en 7 días. Cuando el access token expira, el cliente envía el refresh token a un endpoint /refresh y obtiene un nuevo par de tokens. ¿Ven algún problema de seguridad o diseño? Este es el flujo básico:
// Generación de tokens
const accessToken = jwt.sign({ userId }, ACCESS_SECRET, { expiresIn: '15m' });
const refreshToken = jwt.sign({ userId }, REFRESH_SECRET, { expiresIn: '7d' });
// Verificación del access token
app.use('/api', (req, res, next) => {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) return res.sendStatus(401);
jwt.verify(token, ACCESS_SECRET, (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
});
// Endpoint refresh
app.post('/refresh', (req, res) => {
const refreshToken = req.body.refreshToken;
if (!refreshToken) return res.sendStatus(401);
jwt.verify(refreshToken, REFRESH_SECRET, (err, user) => {
if (err) return res.sendStatus(403);
const newAccess = jwt.sign({ userId: user.userId }, ACCESS_SECRET, { expiresIn: '15m' });
const newRefresh = jwt.sign({ userId: user.userId }, REFRESH_SECRET, { expiresIn: '7d' });
res.json({ accessToken: newAccess, refreshToken: newRefresh });
});
});
Me preocupa que si alguien roba el refresh token, pueda generar tokens indefinidamente. ¿Debería invalidar los refresh tokens anteriores? ¿Alguna recomendación?