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

  1. Mantener los tokens pequeños: No usar JWT como almacenamiento de sesión

  2. Usar expiration corta: 15-30 minutos para tokens de acceso

  3. Validar siempre la firma en el servidor

  4. Usar HTTPS para transmitir tokens

  5. Almacenar tokens de forma segura en el cliente

Malas prácticas con JWT

  1. Almacenar información sensible como contraseñas

  2. No validar la firma en el servidor

  3. Usar tiempos de expiración muy largos

  4. Confiar en el payload sin verificar

Implementación de ejemplo: Sistema de certificados

Generación del token

php
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

php
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

Entradas más populares de este blog

1-Autenticación JWT en PHP: Explicación y Ejemplo

8-JWT en 10 minutos - ¿Qué es JWT? ¿Para que sirve? ¿Cuando usarlo? ¿Cómo se usa?

2-JSON Web Tokens