Spring SecurityJWTJavaSecurity

JWT + Spring Security: Autenticación sin magia negra

JWT no es solo guardar un token. Entender el flujo completo — generación, validación y autorización — es lo que separa una implementación segura de una que parece segura.

Edgar
Edgar Camberos
2025-05-2510 min de lectura

¿Por qué JWT sobre sesiones?

Las sesiones HTTP tradicionales requieren estado del lado del servidor. Con JWT:

  • El token lleva la información del usuario, firmado con clave secreta
  • La API verifica la firma, sin consultar ninguna tabla de sesiones
  • Facilita el escalado horizontal — cada instancia puede validar el token sin compartir una tabla de sesiones
  • El flujo completo

    1. POST /auth/login { email, password }
    2. API valida credenciales contra BD
    3. API genera JWT firmado con claims (userId, roles, exp)
    4. Cliente recibe { accessToken: "eyJ..." }
    5. Cliente incluye: Authorization: Bearer eyJ...
    6. JWT Filter valida firma y extrae claims
    7. Spring Security tiene al usuario autenticado en contexto

    La clase JwtService

    @Service
    public class JwtService {
        
        @Value("${jwt.secret}")
        private String secretKey;
        
        public String generateToken(UserDetails userDetails) {
            return Jwts.builder()
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + expirationMs))
                .signWith(getSignKey(), SignatureAlgorithm.HS256)
                .compact();
        }
        
        public boolean isTokenValid(String token, UserDetails userDetails) {
            final String username = extractUsername(token);
            return username.equals(userDetails.getUsername()) 
                && !isTokenExpired(token);
        }
    }

    Errores comunes que evito

  • JWT en localStorage — vulnerable a XSS; preferir httpOnly cookies en producción
  • No validar expiración — siempre verificar el claim exp
  • Secret en el código — siempre en variables de entorno
  • Sin TTL — definir un tiempo de expiración razonable
  • Conclusión

    JWT bien implementado es seguro, escalable y predecible. El secreto está en entender el flujo completo y tratar el token como un documento firmado con responsabilidades claras, no como un string mágico.

    Edgar Camberos

    Java Backend Developer · Spring Boot

    Edgar Camberos | Java Backend Developer · Spring Boot