¿Por qué JWT sobre sesiones?
Las sesiones HTTP tradicionales requieren estado del lado del servidor. Con JWT:
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 contextoLa 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
expConclusió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.
