Descubre qué son los JSON Web Tokens y cómo pueden ayudarte a comprender los fundamentos del JWT.
Actualmente, los JSON Web Tokens (JWT) son ampliamente utilizados en diversas aplicaciones, garantizando la seguridad de la información.
En este artículo, presento algunos de los conceptos fundamentales que permiten entender la base del JWT. ¡Echa un vistazo a continuación!
¿Qué es JWT?
JWT es una estructura independiente para la seguridad de la información en forma de tokens de acceso. Estos tokens presentan la información en formato JSON, donde se cifran y se utilizan para validar la comunicación entre las partes involucradas.
A continuación, ve algunas razones por las que el JWT se ha vuelto tan popular hoy en día.
Rendimiento
Los JWT ofrecen una ventaja significativa al ser stateless. Esto significa que no es necesario realizar consultas constantes a la base de datos para validar cada usuario en cada solicitud realizada.
Cuando un usuario se autentica, se genera un JWT y se envía al usuario, quien lo incluirá en todas las solicitudes posteriores. El servidor luego valida el token enviado, eliminando la necesidad de consultar la base de datos, lo que mejora significativamente el rendimiento de la aplicación.
Seguridad
Los JWT contribuyen a la seguridad de varias maneras. Por ejemplo, una vez que un token está firmado, podemos verificar su autenticidad e integridad. De esta manera, podemos confirmar que el contenido es válido y que el autor del contenido es quien dice ser.
Además, el payload del token JWT está cifrado, lo que garantiza la confidencialidad de los datos y dificulta que un atacante modifique el token o utilice uno robado, ya que esto invalidaría la firma.
Usabilidad
El JWT sigue un estándar abierto (RFC 7519) que define una forma concisa de transmitir información de manera segura mediante un objeto JSON. Este objeto puede ser transmitido por varias plataformas y lenguajes de programación.
Gracias a esto, los JWT pueden usarse para autenticar solicitudes en dispositivos móviles, navegadores y escritorios.
La estructura estándar de un JWT
Como se mencionó anteriormente, el JWT se construye siguiendo una estructura estándar (RFC 7519) y está compuesto por tres partes esenciales: header, payload y signature. Vamos a detallar cada una de ellas a continuación.
Header
El encabezado del JWT desempeña un papel crucial, ya que contiene información relevante sobre cómo se procesa un token. Está compuesto por dos partes:
- Typ (type): designa el tipo de token. Para un JWT, el valor de esta clave será “JWT”.
- Alg (Algorithm): esta parte especifica el algoritmo de firma utilizado para codificar el token. Pueden utilizarse varios algoritmos, como HMAC, SHA256 y RSA.
El encabezado está codificado en Base64URL. A continuación, un ejemplo de encabezado de JWT:
{
“alg”: “SHA256”,
“typ”: “JWT”
}
Payload
En el payload se incluyen las informaciones pertinentes relacionadas con la autenticación y autorización que pretendemos transmitir.
Normalmente, el payload contiene declaraciones sobre una entidad (generalmente un usuario) y datos adicionales. Algunas de las declaraciones estándar más utilizadas son:
- iss (issuer): emisor del token.
- aud (audience): destinatario previsto del token.
- exp (expiration time): fecha y hora en que el token expira.
- nbf (not before): fecha y hora en que el token se vuelve válido.
- iat (issued at): fecha y hora en que el token fue emitido.
- sub (subject): sujeto del token (generalmente la identificación del usuario).
Al igual que el encabezado, el payload también está codificado en Base64URL y estructurado en formato JSON. A continuación, un ejemplo de cómo puede lucir:
{
“sub”: “123456”,
“name”: “Snappy HostGator”,
“email”: “[email protected]”,
“role”: “admin”
}
En este ejemplo, se almacenan y transmiten de forma segura las informaciones relevantes del usuario, como el ID del sujeto (sub), el nombre, el correo electrónico y el rol.
Signature
Por último, pero no menos importante, la firma es una parte esencial del JWT, que garantiza la integridad de los datos transmitidos y, por lo tanto, confirma la autenticidad del token. Esto es crucial para evitar cualquier manipulación de los datos durante la transmisión.
La firma se crea combinando el header y el payload codificados, junto con una clave secreta, mediante un algoritmo específico. Este algoritmo se define en el encabezado del JWT. Por ejemplo, si utilizamos el algoritmo SHA256 (según lo especificado en el header) y la clave secreta “secret”, la firma se creará de la siguiente manera:
HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
‘secret’
)
Esta firma se agrega como la tercera parte del JWT. Cuando se recibe un token, el receptor puede decodificar la firma utilizando la misma clave secreta y el algoritmo, y compararla con la información que genera por sí mismo.
Si ambas informaciones coinciden, esto valida la autenticidad del token y garantiza que los datos no han sido manipulados durante la transmisión.
Ejemplo de uso de JWT
Podemos considerar un escenario común, donde tenemos un sitio con una área de miembros en la que los usuarios deben iniciar sesión para acceder.
Cuando el usuario se registra o inicia sesión por primera vez, el servidor verifica las credenciales del usuario y, si son válidas, genera un JWT. Este JWT puede incluir información como la identificación del usuario (sub) y su nivel de acceso (role), y luego el servidor devuelve este JWT al cliente.
El cliente, generalmente el navegador, almacenará este JWT, normalmente en una cookie o en el localStorage. Entonces, cada vez que el cliente haga una solicitud al servidor para acceder a una página o recurso que requiera autenticación, enviará el JWT junto con la solicitud.
En este momento, cuando el servidor recibe la solicitud, primero verifica la firma del JWT para asegurarse de que sea válido y no haya sido manipulado de alguna manera. Si la firma es válida, el servidor lee el payload del JWT para identificar al usuario.
Esto permite al servidor saber quién es y qué puede hacer sin la necesidad constante de consultar la base de datos o mantener un estado de sesión, simplificando el proceso y haciendo la aplicación más eficiente para el usuario.