¿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 } - Claims registrados: Claims reservados pero opcionales, como
-
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.