25-Qué es JWT, cómo funciona y buenas prácticas
https://www.youtube.com/watch?v=3o4vEIkiRgE
Tutorial sobre Tokens JWT (JSON Web Tokens)
Introducción a JWT
Los JSON Web Tokens (JWT) son un estándar abierto (RFC 7519) que define una forma compacta y autónoma de transmitir información de forma segura entre partes como un objeto JSON. Esta información puede ser verificada y confiable porque está firmada digitalmente.
Estructura de un JWT
Un JWT consiste en tres partes separadas por puntos:
Header: Especifica el algoritmo de firma y el tipo de token
Payload: Contiene los "claims" o información que queremos transmitir
Signature: Firma digital que verifica la autenticidad del mensaje
Ejemplo: aaaa.bbbb.cccc
Información que podemos incluir en JWT
En el payload podemos incluir:
Datos de usuario (id, email, roles)
Información de recursos (curso, certificado)
Tiempo de expiración (exp)
Y cualquier dato que necesitemos transmitir de forma segura
Buenas prácticas con JWT
Mantener los tokens pequeños: No usar JWT como almacenamiento de sesión
Usar expiration corta: 15-30 minutos para tokens de acceso
Validar siempre la firma en el servidor
Usar HTTPS para transmitir tokens
Almacenar tokens de forma segura en el cliente
Malas prácticas con JWT
Almacenar información sensible como contraseñas
No validar la firma en el servidor
Usar tiempos de expiración muy largos
Confiar en el payload sin verificar
Implementación de ejemplo: Sistema de certificados
Generación del token
use Symfony\Component\Security\Core\Encoder\JwtEncoder;
class CertificateController
{
private $jwtEncoder;
public function __construct(JwtEncoder $jwtEncoder)
{
$this->jwtEncoder = $jwtEncoder;
}
public function generateCertificate(Request $request)
{
$studentId = 5;
$courseId = 3;
// Datos a incluir en el token
$payload = [
'student_id' => $studentId,
'course_id' => $courseId,
'exp' => time() + 900 // Expira en 15 minutos
];
// Generar token firmado
$token = $this->jwtEncoder->encode($payload);
// Enviar por email
$emailContent = "Descarga tu certificado: https://misitio.com/certificado/$token";
mail($userEmail, "Tu certificado", $emailContent);
return new Response("Certificado enviado por email");
}
}Validación y uso del token
public function downloadCertificate(Request $request, $token)
{
try {
// Decodificar y validar token
$payload = $this->jwtEncoder->decode($token);
// Verificar que no ha expirado
if (isset($payload['exp']) && $payload['exp'] < time()) {
throw new \Exception("Token expirado");
}
// Generar PDF con la información del payload
$pdfContent = $this->generatePdf(
$payload['student_id'],
$payload['course_id']
);
return new Response($pdfContent, 200, [
'Content-Type' => 'application/pdf',
]);
} catch (\Exception $e) {
return new Response("Token inválido", 401);
}
}Consideraciones de seguridad
Firmar tokens con clave privada y verificar con clave pública
Usar algoritmos seguros como RS256 en lugar de HS256
Proteger las claves privadas y no versionarlas en Git
Considerar revocación de tokens para casos críticos
Conclusión
Los JWT son una herramienta poderosa para autenticación y transmisión de información segura, pero deben implementarse correctamente considerando:
Tamaño adecuado del payload
Tiempos de expiración apropiados
Validación estricta en el servidor
Almacenamiento seguro de claves
¡Recuerda suscribirte para más contenido sobre desarrollo seguro y mejores prácticas!
Comentarios
Publicar un comentario