Sobre JWT

JSON Web Token (abreviado JWT) es un estándar abierto basado en JSON propuesto por IETF (RFC 7519) para la creación de tokens de acceso que permiten la propagación de identidad y privilegios. Por ejemplo, un servidor podría generar un token indicando que el usuario tiene privilegios de administrador y enviarlo a un cliente. El cliente entonces podría utilizar el token para probar que está actuando como un administrador en el cliente o en otro sistema.  El token está firmado por el  servidor utilizando una clave secreta, así que el cliente y el servidor son ambos capaz de verificar que el token es legítimo. Los JSON Web Tokens están diseñados para ser compactos, poder ser enviados en las URLs y ser utilizados en escenarios de Single Sign-On (SSO).

Los JSON Web Tokens generalmente están formados por tres partes: un encabezado (header), un contenido (payload), y una firma (signature).


El encabezado identifica qué algoritmo fue usado para generar la firma y normalmente se ve de la siguiente forma:

header = {
"alg": "HS256",
"typ": "JWT"
}

 

El contenido contiene la información de los privilegios o claims del token:Donde HS256 indica que este token está firmado utilizando HMAC-SHA256 y es del tipo JWT.

payload = {
"sub": "usuario@empresa.com",
"iat": 1422779638
}

 

La firma está calculada codificando el encabezamiento y el contenido en base64url,  concatenando ambas partes con un punto como separador:


El estándar sugiere incluir una marca temporal o timestamp en inglés, llamado iat para indicar en momento en el que el token fue creado.

key = "sekr3t"

unsignedToken = encodeBase64Url(header) + "." + encodeBase64Url(payload)

signature = HMAC-SHA256(key, unsignedToken)

 

En el token,  las tres partes -encabezado, contenido y firma- están concatenadas utilizando puntos de la siguiente forma:

token = encodeBase64Url(header) +

        "." + encodeBase64Url(payload) +

        "." + encodeBase64Url(signature)

 

#printtoken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

 

El token puede ser fácilmente transmitido en entornos HTML y HTTP, siendo más compacto que estándares basados en XML. Generalmente los algoritmos de cifrado utilizados son HMAC con SHA-256 (HS256) y firma digital con SHA-256 (RS256). El estándar JSON Web Algorithms (RFC 7518) introduce muchos más alternativas para autenticación y encriptación.