Sobes.tech
Junior
195

¿Qué es JWT (JSON Web Token)?

Respuesta de la IA

sobes.tech AI

JSON Web Token (JWT) es una forma compacta y segura para URLs de transmitir datos entre partes en formato JSON.

Principios de funcionamiento:

  • El token consta de tres partes, separadas por puntos (.): header.payload.signature.

  • Header (Encabezado): Contiene información meta sobre el token, como el tipo de token (JWT) y el algoritmo de firma utilizado (por ejemplo, HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Carga útil): Contiene "claims" - afirmaciones o información que queremos transmitir. Hay varios tipos:

    • Claims registrados: Claims reservados pero opcionales, como iss (emisor), exp (fecha de expiración), sub (tema).
    • Claims públicos: Definidos para uso público, deben estar registrados en IANA JSON Web Token Registry o ser URI que contengan un espacio de nombres protegido contra colisiones.
    • Claims privados: Afirmaciones arbitrarias acordadas entre las partes.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Signature (Firma): Se crea combinando el encabezado y la carga útil codificados con un secreto y el algoritmo especificado en el encabezado. Esto garantiza la integridad del token; si alguien modifica el encabezado o la carga útil, la firma será inválida.

    # Ejemplo de creación de firma usando HS256
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Encabezado)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Carga útil)
    secret = 'your_secret_key'
    
    # Firma = HMACSHA256(Base64Url(Encabezado) + "." + Base64Url(Carga útil), secret)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Codificación de la firma en Base64Url
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Token final: header_str + '.' + payload_str + '.' + signature_b64url
    

Aplicaciones:

  • Autenticación: El servidor emite el token al usuario tras una autenticación exitosa. El usuario envía este token con cada solicitud. El servidor verifica la validez del token y permite el acceso a los recursos.
  • Intercambio de información: Transmisión segura de pequeños volúmenes de datos entre diferentes servicios.

Ventajas:

  • Compacto: Menos datos para transmitir en comparación con XML.
  • Autosuficiente: El token ya contiene la información necesaria del usuario, lo que reduce la necesidad de consultar la base de datos en cada solicitud.
  • Sin estado: El servidor no necesita mantener información de sesión en su lado.
  • Firma criptográfica: Garantiza la integridad de los datos.

Desventajas:

  • No se puede revocar el token: Una vez emitido, el token es válido hasta que expira, a menos que se implemente un mecanismo de listas negras.
  • Almacenamiento del secreto: La clave secreta debe almacenarse de forma segura.
  • Tamaño: A medida que aumenta la cantidad de datos en payload, también aumenta el tamaño del token.