Un JSON Web Token (JWT) es una cadena compacta que se usa para transportar afirmaciones entre partes, habitualmente en sistemas de inicio de sesión. Tiene tres partes separadas por puntos: cabecera, carga útil y firma.
Las tres partes
- Cabecera: JSON que describe el token, por ejemplo
{"alg":"HS256","typ":"JWT"}. - Carga útil: JSON con las afirmaciones, como el id de usuario, una hora de caducidad y datos personalizados.
- Firma: un valor que demuestra que las dos primeras partes no se modificaron.
La cabecera y la carga útil se codifican cada una con base64url, que es base64 usando - y _ en lugar de + y / y sin el relleno =.
Calcular la firma HS256
HS256 significa HMAC con SHA-256. Los pasos son:
- Codifica la cabecera en base64url.
- Codifica la carga útil en base64url.
- Únelas con un punto:
cabeceraB64.cargaB64. - Calcula el HMAC-SHA256 de esa cadena con la clave secreta.
- Codifica el resultado en base64url.
El token final es cabeceraB64.cargaB64.firmaB64.
Qué demuestra la firma
Cualquiera que conozca el secreto puede recalcular la firma y compararla. Si cambió incluso un carácter de la cabecera o la carga útil, la firma ya no coincidirá. Esto da integridad y autenticidad: el token vino de alguien con el secreto y no fue alterado.
Qué no hace
La carga útil está codificada, no cifrada. Cualquiera puede decodificarla y leerla, así que nunca pongas contraseñas ni datos sensibles dentro de un JWT normal.
Afirmaciones comunes
issemisor,subsujeto,audaudiencia.expcaducidad ynbfno válido antes de, ambos en segundos Unix.iatemitido en.
Pruebas y aprendizaje
Un codificador te permite construir tokens con afirmaciones elegidas y un secreto de prueba para probar una API o estudiar el formato. Usa secretos desechables para esto. No pegues nunca un secreto real de producción en ninguna página web.
Preguntas frecuentes
¿HS256 es el único algoritmo? No. RS256 y ES256 usan pares de claves pública y privada, que encajan cuando quien verifica no debe tener el secreto de firma.
¿Qué longitud debe tener el secreto? Al menos 32 bytes aleatorios para HS256.

