AUTENTICACIÓN JWT, ¿QUÉ ES Y CUÁNDO USARLA?

Fragmentos tomados del sitio: ciberseguridad.com

¿Qué es JWT?

Un JWT es un mecanismo para verificar el propietario de algunos datos JSON. Es una cadena codificada y segura para URL que puede contener una cantidad ilimitada de datos (a diferencia de una cookie) y está firmada criptográficamente.

Cuando un servidor recibe un JWT, puede garantizar que los datos que contiene sean confiables porque están firmados por la fuente. Ningún intermediario puede modificar un JWT una vez enviado.

Es importante tener en cuenta que un JWT garantiza la propiedad de los datos pero no el cifrado. Cualquier persona que intercepte el token puede ver los datos JSON que almacena en un JWT porque solo está serializado, no cifrado.

Por esta razón, se recomienda encarecidamente utilizar HTTPS con JWT (y HTTPS en general, por cierto).

La razón principal para usar JWT es intercambiar datos JSON de una manera que se pueda verificar criptográficamente. Hay dos tipos de JWT:

  • JSON Web Signature (JWS)
  • JSON Web Encryption (JWE)

Los datos en un JWS son públicos, lo que significa que cualquier persona con el token puede leer los datos, mientras que un JWE está encriptado y es privado. Para leer los datos contenidos en un JWE, necesitas tanto el token como una clave secreta.

Cuando usas un JWT, generalmente es un JWS. La ‘S’ (la firma) es la parte importante y permite validar el token.

¿Por qué utilizar JWT?

En resumen, los JWT se utilizan como una forma segura de autenticar usuarios y compartir información.

Normalmente, el emisor utiliza una clave privada o secreta para firmar el JWT. El receptor del JWT verificará la firma para asegurarse de que el token no haya sido alterado después de que fue firmado por el emisor. Es difícil para las fuentes no autenticadas adivinar la clave de firma e intentar cambiar las afirmaciones dentro del JWT.

Sin embargo, no todos los algoritmos de firma son iguales. Por ejemplo, algunos algoritmos de firma utilizan un valor secreto que se comparte entre el emisor y la parte que verifica el JWT. Otros algoritmos utilizan una clave pública y privada. La clave privada es conocida solo por el emisor, mientras que la clave pública puede distribuirse ampliamente. La clave pública se puede usar para verificar la firma, pero solo la clave privada se puede usar para crear la firma. Esto es más seguro que un secreto compartido porque la clave privada solo necesita existir en un lugar.

Debido a esto, el servidor no necesita mantener una base de datos con la información necesaria para identificar al usuario. Para los desarrolladores, esta es una gran noticia: el servidor que emite el JWT y el servidor que lo valida no tienen que ser el mismo.

Firmas JWT: ¿cómo se utilizan para la autenticación?

La última parte de un JWT es la firma, que es un código de autenticación de mensaje. La firma de un JWT solo puede ser producida por alguien en posesión tanto de la carga útil (más el encabezado) como de una clave secreta determinada.

Así es como se utiliza la firma para garantizar la autenticación:

  • El usuario envía el nombre de usuario y la contraseña a un servidor de autenticación, que puede ser nuestro servidor de aplicaciones, pero normalmente es un servidor independiente.
  • El servidor de autenticación valida la combinación de nombre de usuario y contraseña y crea un token JWT con una carga útil que contiene el identificador técnico del usuario y una marca de tiempo de vencimiento.
  • El servidor de autenticación luego toma una clave secreta y la usa para firmar el encabezado más la carga útil y lo envía de vuelta al navegador del usuario.
  • El navegador toma el JWT firmado y comienza a enviarlo con cada solicitud HTTP a nuestro servidor de aplicaciones.
  • El JWT firmado actúa efectivamente como una credencial de usuario temporal, que reemplaza la credencial permanente que es la combinación de nombre de usuario y contraseña.

Y a partir de ahí, esto es lo que hace nuestro servidor de aplicaciones con el token JWT:

  • Nuestro servidor de aplicaciones verifica la firma JWT y confirma que, de hecho, alguien en posesión de la clave secreta firmó esta carga útil en particular.
  • La carga útil identifica a un usuario en particular a través de un identificador técnico.
  • Solo el servidor de autenticación está en posesión de la clave privada, y el servidor de autenticación solo entrega tokens a los usuarios que envían la contraseña correcta.
  • Por lo tanto, nuestro servidor de aplicaciones puede estar seguro de que este token fue entregado a este usuario en particular por el servidor de autenticación, lo que significa que es el usuario, ya que tenía la contraseña correcta.
  • El servidor procede a procesar la solicitud HTTP asumiendo que realmente pertenece a ese usuario.