nuevo: obtenga el manual de JWT gratis y aprenda JWTs en profundidad!
¿qué es JSON Web Token?
JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define una forma compacta y autónoma para transmitir información de forma segura entre las partes como un objeto JSON. Esta información puede ser verificada y confiable porque está firmada digitalmente. Los JWT se pueden firmar usando un secreto (con el algoritmo HMAC) o un par de claves públicas/privadas usando RSA O ECDSA.,
aunque los JWT se pueden cifrar para proporcionar secreto entre las partes, nos centraremos en los tokens firmados. Los tokens firmados pueden verificar la integridad de las reclamaciones contenidas en ellos, mientras que los tokens cifrados ocultan esas reclamaciones de otras partes. Cuando los tokens se firman utilizando pares de claves públicas / privadas, la firma también certifica que solo la parte que tiene la clave privada es la que la firmó.
¿cuándo debe usar Tokens Web JSON?
Aquí hay algunos escenarios donde los Tokens Web JSON son útiles:
-
autorización: este es el escenario más común para usar JWT., Una vez que el Usuario haya iniciado sesión, cada solicitud posterior incluirá el JWT, lo que le permitirá acceder a rutas, servicios y recursos que Se Permiten con ese token. El inicio de sesión único es una característica que utiliza ampliamente JWT hoy en día, debido a su pequeña sobrecarga y su capacidad para ser utilizado fácilmente en diferentes dominios.
-
intercambio de información: los Tokens Web JSON son una buena manera de transmitir información de forma segura entre las partes. Debido a que los JWT se pueden firmar, por ejemplo, utilizando pares de claves públicas/privadas, puede estar seguro de que los remitentes son quienes dicen ser., Además, como la firma se calcula utilizando el encabezado y la carga útil, también puede verificar que el contenido no haya sido alterado.
¿qué es la estructura del Token web JSON?
en su forma compacta, los Tokens Web JSON constan de tres partes separadas por puntos (.
), que son:
- Header
- Payload
- Signature
por lo tanto, un JWT suele tener el siguiente aspecto.
xxxxx.yyyyy.zzzzz
Vamos a desglosar las diferentes partes.,
Header
el encabezado normalmente consta de dos partes: el tipo del token, que es JWT, y el algoritmo de firma que se está utilizando, como HMAC SHA256 o RSA.
por ejemplo:
{ "alg": "HS256", "typ": "JWT"}
entonces, este JSON está codificado Base64Url para formar la primera parte del JWT.
Payload
la segunda parte del token es la payload, que contiene las reclamaciones. Las reclamaciones son declaraciones sobre una entidad (normalmente, el Usuario) y datos adicionales.Hay tres tipos de reclamaciones: reclamaciones registradas, públicas y privadas.,
-
reclamaciones registradas: se trata de un conjunto de reclamaciones predefinidas que no son obligatorias, pero se recomiendan, para proporcionar un conjunto de reclamaciones útiles e interoperables. Algunos de ellos son: iss (emisor), exp (tiempo de vencimiento), sub (sujeto), AUD (audiencia) y otros.
tenga en cuenta que los nombres de las reclamaciones tienen solo tres caracteres, ya que JWT está destinado a ser compacto.
-
reclamos públicos: estos pueden ser definidos a voluntad por aquellos que usan JWTs., Pero para evitar colisiones, deben definirse en el registro de tokens Web JSON de IANA o definirse como un URI que contiene un espacio de nombres resistente a colisiones.
-
reclamos privados: estos son los reclamos personalizados creados para compartir información entre partes que acuerdan usarlos y no son reclamos registrados o públicos.
Un ejemplo de carga útil podría ser:
{ "sub": "1234567890", "name": "John Doe", "admin": true}
la carga útil se codifica Base64Url para formar la segunda parte del Token web JSON.,
tenga en cuenta que para los tokens firmados esta información, aunque está protegida contra la manipulación, es legible por cualquier persona. No ponga información secreta en la carga útil o elementos de encabezado de un JWT a menos que esté encriptada.
Signature
para crear la parte de firma, debe tomar el encabezado codificado, la carga útil codificada, un secreto, el algoritmo especificado en el encabezado y firmarlo.,
por ejemplo, si desea utilizar el algoritmo HMAC SHA256, la firma se creará de la siguiente manera:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
la firma se utiliza para verificar que el mensaje no se ha cambiado en el camino, y, en el caso de tokens firmados con una clave privada, también puede verificar que el remitente del JWT es quien dice que es.
juntando todo
la salida es de tres cadenas Base64-URL separadas por puntos que se pueden pasar fácilmente en entornos HTML y HTTP, mientras que son más compactas en comparación con estándares basados en XML como SAML.,
lo siguiente muestra un JWT que tiene el encabezado anterior y la carga codificada, y está firmado con un secreto.
Si quieres jugar con JWT y poner estos conceptos en práctica, puedes utilizar jwt.io depurador para decodificar, verificar y generar JWTs.
¿cómo funcionan los Tokens Web JSON?
en Autenticación, cuando el usuario inicia sesión correctamente usando sus credenciales, se devolverá un Token Web JSON. Dado que los tokens son credenciales, se debe tener mucho cuidado para evitar problemas de seguridad., En general, no debe mantener tokens más tiempo del requerido.
tampoco debe almacenar datos de sesión confidenciales en el almacenamiento del navegador debido a la falta de seguridad.
siempre que el usuario quiera acceder a una ruta o recurso protegido, el agente de usuario debe enviar el JWT, normalmente en el encabezado Authorization utilizando el esquema Bearer. El contenido de la cabecera debería ser el siguiente:
Authorization: Bearer <token>
esto puede ser, en ciertos casos, un mecanismo de autorización sin estado., Las rutas protegidas del servidor buscarán un JWT válido en el encabezado Authorization
, y si está presente, se le permitirá al usuario acceder a recursos protegidos. Si el JWT contiene los datos necesarios, la necesidad de consultar la base de datos para ciertas operaciones puede reducirse, aunque esto puede no ser siempre el caso.
si el token se envía en el encabezado Authorization
, el uso compartido de recursos de origen cruzado (CORS) no será un problema, ya que no utiliza cookies.,
el siguiente diagrama muestra cómo se obtiene y utiliza un JWT para acceder a API o recursos:
- La aplicación o cliente solicita autorización al servidor de autorización. Esto se realiza a través de uno de los diferentes flujos de autorización. Por ejemplo, una aplicación web típica compatible con OpenID Connect pasará por el punto final
/oauth/authorize
utilizando el flujo de código de autorización. - cuando se concede la autorización, el servidor de autorización devuelve un token de acceso a la aplicación.,
- La aplicación utiliza el token de acceso para acceder a un recurso protegido (como una API).
tenga en cuenta que con los tokens firmados, toda la información contenida en el token se expone a los usuarios u otras partes, aunque no puedan cambiarla. Esto significa que no debe poner información secreta dentro del token.
¿por qué deberíamos usar Tokens Web JSON?
hablemos de los beneficios de los Tokens Web JSON (JWT) en comparación con los Tokens web simples (SWT) y los Tokens de lenguaje de marcado de aserción de seguridad (SAML).,
como JSON es menos detallado que XML, cuando se codifica su tamaño también es más pequeño, haciendo que JWT sea más compacto que SAML. Esto hace que JWT sea una buena opción para pasar en entornos HTML y HTTP.
en cuanto a la seguridad, SWT solo puede ser firmado simétricamente por un secreto compartido usando el algoritmo HMAC. Sin embargo, los tokens JWT y SAML pueden usar un par de claves públicas/privadas en forma de certificado X. 509 para la firma. Firmar XML con firma digital XML sin introducir agujeros de seguridad oscuros es muy difícil en comparación con la simplicidad de firmar JSON.,
los analizadores JSON son comunes en la mayoría de los lenguajes de programación porque se asignan directamente a objetos. Por el contrario, XML no tiene una asignación natural de documento a objeto. Esto hace que sea más fácil trabajar con JWT que con aserciones SAML.
con respecto al uso, JWT se utiliza a escala de Internet. Esto destaca la facilidad de procesamiento del lado del cliente del token Web JSON en múltiples plataformas, especialmente móviles.,
comparación de la longitud de un JWT codificado y un SAML codificado
si desea leer más sobre los Tokens Web JSON e incluso comenzar a usarlos para realizar la autenticación en sus propias aplicaciones, navegue a la página de destino del Token Web JSON en Auth0.
Leave a Reply