Post208 nn1

¿Qué es Json Web Token (JWT)?


Profile
Omar Jacobo Muñoz Veliz

 

Json Web Token es un conjunto de medios de seguridad para peticiones http y así representar demandas para ser transferidos entre dos partes (cliente y servidor). Las partes de un JWT se codifican como un objeto JSON que está firmado digitalmente utilizando JSON Web Signature( JWS ).

 

autenticacion-basada-en-token

Escenario del Json Web Token

 

¿Por qué utilizar Json Web Token?

 

La mayoría de las aplicaciones actuales consumen servicios rest y están alojadas en distintos dominios con lo cuál no podemos trabajar con sesiones ya que se almacenan en este. En cada petición el servidor debe comprobar el token proporcionado por el usuario y si es correcto podrá acceder a los recursos solicitados, de otra forma deberá denegar la petición.

 

También nos añade más seguridad. Al no utilizar cookies para almacenar la información del usuario, podemos evitar ataques CSRF (Cross-Site Request Forgery) que manipulen la sesión que se envía al backend. Por supuesto podemos hacer que el token expire después de un tiempo lo que le añade una capa extra de seguridad.

 

El formato de un JWT está compuesto por 3 strings separados por un punto . algo así como:

 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1NGE4Y2U2MThlOTFiMGIxMzY2NWUyZjkiLCJpYXQiOiIxNDI0MTgwNDg0IiwiZXhwIjoiMTQyNTM5MDE0MiJ9.yk4nouUteW54F1HbWtgg1wJxeDjqDA_8AhUPyjE5K0U  

 

Cada string significa una cosa:

 

  • Header La primera parte es la cabecera del token, que a su vez tiene otras dos partes, el tipo, en este caso un JWT y la codificación utilizada. Comúnmente es el algoritmo HMAC SHA256, El contenido sin codificar es el siguiente:

 

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

 

Su codificación sería: 

 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

 

  • Payload: EL Payload está compuesto por los llamados JWT Claims donde irán colocados la atributos que definen nuestro token. Existen varios que puedes consultar aquí, los más comunes a utilizar son:

    • sub: Identifica el sujeto del token, por ejemplo un identificador de usuario.

    • iat: Identifica la fecha de creación del token, válido para si queremos ponerle una fecha de caducidad. En formato de tiempo UNIX

    • exp: Identifica a la fecha de expiración del token. Podemos calcularla a partir del iat. También en formato de tiempo UNIX.

{
 "sub": "54a8ce618e91b0b13665e2f9",
 "iat": "1424180484",
 "exp": "1425390142"
}

 

Su codificación sería: 

 

eyJzdWIiOiI1NGE4Y2U2MThlOTFiMGIxMzY2NWUyZjkiLCJpYXQiOiIxNDI0MTgwNDg0IiwiZXhwIjoiMTQyNTM5MDE0MiJ9

 

También podemos añadirle más campos, incluso personalizados, como pueden ser el rol del usuario, etc.

 

{
    "sub": "54a8ce618e91b0b13665e2f9",
    "iat": "1424180484",
    "exp": "1425390142",
    "role": 2
}

 

  • Signature: La firma es la tercera y última parte del JSON Web Token. Está formada por los anteriores componentes (Header y Payload) cifrados en Base64 con una clave secreta (almacenada en nuestro backend). Así sirve de Hash para comprobar que todo está bien.

 

HMACSHA256(  
    base64UrlEncode(header) + "." + 
    base64UrlEncode(payload), secret
);

 

Su codificación sería:

yk4nouUteW54F1HbWtgg1wJxeDjqDA_8AhUPyjE5K0U

 

Por tanto, todo nuestro JSON Web Token, una vez codificado tendrá esta forma:

 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1NGE4Y2U2MThlOTFiMGIxMzY2NWUyZjkiLCJpYXQiOiIxNDI0MTgwNDg0IiwiZXhwIjoiMTQyNTM5MDE0MiJ9.yk4nouUteW54F1HbWtgg1wJxeDjqDA_8AhUPyjE5K0U


Eticalhacker
J Garcia
ha comentado hace 5 meses

Hola Omar,Se puede decodificar este JWT? que técnicas se podrían usar?, lo pregunto porque creo que se debe pensar como atacante para poder prevenir ataques.Muchas gracias

Artículos que te pueden interesar


Hola comunidad de Backtrack Academy, constantemente estoy escribiendo artículos relacionados con problemas que se presentan en nuestra plataform... Felipe Barrios


Continuar Leyendo

Unos meses atrás estaba configurando un ambiente de contenedores para unos sitios web en un servidor y llego la fase del proyecto de colocar htt... Elzer Pineda


Continuar Leyendo

Compartiendo con unos colegas surge un proyecto de cloud que tenía en mente para unas clases, implementar una nube privada, la mayoría de los pr... José Moreno


Continuar Leyendo