stringtranslate.com

Token web JSON

JSON Web Token ( JWT , pronunciación sugerida / dʒɒt / , igual que la palabra "jot" [ 1] ) es un estándar de Internet propuesto para crear datos con firma opcional y/o cifrado opcional cuya carga útil contiene JSON que afirma una cierta cantidad de afirmaciones . Los tokens se firman utilizando un secreto privado o una clave pública/privada .

Por ejemplo, un servidor podría generar un token que tenga la afirmación "iniciado sesión como administrador" y proporcionársela a un cliente. El cliente podría entonces utilizar ese token para demostrar que ha iniciado sesión como administrador. Los tokens pueden estar firmados por la clave privada de una de las partes (normalmente la del servidor) de modo que cualquier parte pueda verificar posteriormente si el token es legítimo. Si la otra parte, por algún medio adecuado y fiable, está en posesión de la clave pública correspondiente, también podrá verificar la legitimidad del token. Los tokens están diseñados para ser compactos, [2] seguros para URL , [3] y utilizables, especialmente en un contexto de inicio de sesión único (SSO) de navegador web . Las afirmaciones JWT se pueden utilizar normalmente para pasar la identidad de usuarios autenticados entre un proveedor de identidad y un proveedor de servicios , o cualquier otro tipo de afirmaciones según lo requieran los procesos empresariales. [4] [5]

JWT se basa en otros estándares basados ​​en JSON: JSON Web Signature y JSON Web Encryption . [1] [6] [7]

Estructura

Encabezamiento
Identifica qué algoritmo se utiliza para generar la firma. En el siguiente ejemplo, HS256indica que este token está firmado con HMAC-SHA256.
Los algoritmos criptográficos más utilizados son HMAC con SHA-256 (HS256) y la firma RSA con SHA-256 (RS256). JWA (JSON Web Algorithms) RFC 7518 introduce muchos más para la autenticación y el cifrado. [8]
{ "alg" : "HS256" , "tipo" : "JWT" ​​}    
Carga útil
Contiene un conjunto de reclamaciones. La especificación JWT define siete nombres de reclamación registrados, que son los campos estándar que se incluyen comúnmente en los tokens. [1] Por lo general, también se incluyen reclamaciones personalizadas, según el propósito del token.
Este ejemplo tiene el reclamo estándar Emitido en el momento ( iat) y un reclamo personalizado ( loggedInAs).
{ "loggedInAs" : "admin" , "iat" : 1422779638 }    
Firma
Valida el token de forma segura. La firma se calcula codificando el encabezado y la carga útil mediante la codificación Base64url RFC  4648 y concatenando ambos con un punto como separador. Luego, esa cadena se ejecuta a través del algoritmo criptográfico especificado en el encabezado. Este ejemplo utiliza HMAC-SHA256 con un secreto compartido (también se definen algoritmos de clave pública). La codificación Base64url es similar a base64 , pero utiliza diferentes caracteres no alfanuméricos y omite el relleno.
HMAC_SHA256 ( secreto , base64urlEncoding ( encabezado ) + '.' + base64urlEncoding ( carga útil ) )      

Las tres partes se codifican por separado utilizando Base64url Encoding RFC  4648 y se concatenan utilizando puntos para producir el JWT:

const token = base64urlEncoding ( encabezado ) + '.' + base64urlEncoding ( carga útil ) + '.' + base64urlEncoding ( firma )           

Los datos anteriores y el secreto de "secretkey" crean el token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN _oWnFSRgCzcmJmMjLiuyu5CSpyHI=

(Las cadenas json anteriores están formateadas sin nuevas líneas ni espacios, en matrices de bytes UTF-8. Esto es importante ya que incluso cambios leves en los datos afectarán el token resultante)

Este token resultante se puede pasar fácilmente a HTML y HTTP . [3]

Usar

En la autenticación, cuando un usuario inicia sesión correctamente, se suele devolver un token web JSON (JWT). Este token debe enviarse al cliente mediante un mecanismo seguro, como una cookie exclusiva de HTTP . No se recomienda almacenar el JWT localmente en mecanismos de almacenamiento del navegador, como el almacenamiento local o de sesión . Esto se debe a que JavaScript que se ejecuta en el lado del cliente (incluidas las extensiones del navegador) puede acceder a estos mecanismos de almacenamiento, lo que expone el JWT y compromete la seguridad. En el caso de procesos desatendidos, el cliente también puede autenticarse directamente generando y firmando su propio JWT con un secreto compartido previamente y pasándolo a un servicio compatible con OAuth de la siguiente manera:

POST /oauth2/token Tipo de contenido: aplicación / x-www-form-urlencoded tipo_concesión = urn:ietf:params:oauth:tipo-concesión:jwt-bearer & aserción = eyJhb...

Si el cliente pasa una aserción JWT válida, el servidor generará un access_token válido para realizar llamadas a la aplicación y lo pasará de vuelta al cliente:

{ "access_token" : "eyJhb..." , "token_type" : "Portador" , "expires_in" : 3600 }      

Cuando el cliente desea acceder a una ruta o un recurso protegido, el agente de usuario debe enviar el JWT, normalmente en el Authorization encabezado HTTP mediante el Beareresquema. El contenido del encabezado podría ser similar al siguiente:

Autorización: Portador eyJhbGci ...<snip>... yu5CSpyHI

Este es un mecanismo de autenticación sin estado, ya que el estado del usuario nunca se guarda en la memoria del servidor. Las rutas protegidas del servidor comprobarán si hay un JWT válido en el encabezado de autorización y, si está presente, se permitirá al usuario acceder a los recursos protegidos. Como los JWT son autónomos, toda la información necesaria está allí, lo que reduce la necesidad de consultar la base de datos varias veces.

Campos estándar

Implementaciones

Existen implementaciones de JWT para muchos lenguajes y marcos, incluidos, entre otros:

Vulnerabilidades

Los tokens web JSON pueden contener el estado de la sesión. Pero si los requisitos del proyecto permiten la invalidación de la sesión antes de la expiración del JWT, los servicios ya no pueden confiar en las afirmaciones del token solo por el token. Para validar que la sesión almacenada en el token no se revoque, las afirmaciones del token deben verificarse con un almacén de datos . Esto hace que los tokens ya no sean apátridas, lo que socava la ventaja principal de los JWT. [36]

El consultor de seguridad Tim McLean informó sobre vulnerabilidades en algunas bibliotecas JWT que usaban el algcampo para validar tokens de manera incorrecta, generalmente al aceptar un alg=nonetoken. Si bien estas vulnerabilidades fueron corregidas, McLean sugirió descontinuar el algcampo por completo para evitar una confusión de implementación similar. [10] Aún así, se siguen encontrando nuevas alg=nonevulnerabilidades en circulación, con cuatro CVE presentados en el período 2018-2021 que tienen esta causa. [37] [ se necesita una mejor fuente ]

Con un diseño adecuado, los desarrolladores pueden abordar las vulnerabilidades de los algoritmos tomando precauciones: [38] [39]

  1. Nunca deje que el encabezado JWT por sí solo impulse la verificación
  2. Conozca los algoritmos (evite depender solo del algcampo)
  3. Utilice un tamaño de clave adecuado

En 2017 se descubrió que varias bibliotecas JWT eran vulnerables a un ataque de curva elíptica no válida. [40]

Algunos han argumentado que los tokens web JSON son difíciles de usar de forma segura debido a los muchos algoritmos y opciones de cifrado diferentes disponibles en el estándar, y que se deberían usar estándares alternativos tanto para los frontends web [41] como para los backends. [42]

Véase también

Referencias

  1. ^ abcd Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura (mayo de 2015). Token web JSON (JWT). IETF . doi : 10.17487/RFC7519 . ISSN  2070-1721. RFC 7519.
  2. ^ Nickel, Jochen (2016). Dominio de la gestión de identidad y acceso con Microsoft Azure. Packt Publishing. pág. 84. ISBN 9781785887888. Recuperado el 20 de julio de 2018 .
  3. ^ ab "JWT.IO - Introducción a los tokens web JSON". jwt.io . Consultado el 20 de julio de 2018 .
  4. ^ Sevillaja, Chris. "La anatomía de un token web JSON" . Consultado el 8 de mayo de 2015 .
  5. ^ "Documentación de Atlassian Connect". developer.atlassian.com . Archivado desde el original el 18 de mayo de 2015. Consultado el 8 de mayo de 2015 .
  6. ^ Jones, Michael B.; Bradley, John; Sakimura, Nat (mayo de 2015). "draft-ietf-jose-json-web-signature-41 - Firma web JSON (JWS)". tools.ietf.org . Consultado el 8 de mayo de 2015 .
  7. ^ Jones, Michael B.; Hildebrand, Joe (mayo de 2015). "draft-ietf-jose-json-web-encryption-40 - Cifrado web JSON (JWE)". tools.ietf.org . Consultado el 8 de mayo de 2015 .
  8. ^ Jones, Michael B. (mayo de 2015). "draft-ietf-jose-json-web-algorithms-40 - Algoritmos web JSON (JWA)". tools.ietf.org . Consultado el 8 de mayo de 2015 .
  9. ^ Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura (mayo de 2015). "Reclamo de "exp" (tiempo de expiración)". Token web JSON (JWT). IETF . sec. 4.1.4. doi : 10.17487/RFC7519 . ISSN  2070-1721. RFC 7519.
  10. ^ ab McLean, Tim (31 de marzo de 2015). "Vulnerabilidades críticas en las bibliotecas de tokens web JSON". Auth0 . Consultado el 29 de marzo de 2016 .
  11. ^ jwt-dotnet en github.com
  12. ^ libjwt en github.com
  13. ^ "liquidz/clj-jwt". GitHub . Consultado el 7 de mayo de 2018 .
  14. ^ cljwt en github.com
  15. ^ JustJWT en github.com
  16. ^ "bryanjos/joken". GitHub . Consultado el 7 de mayo de 2018 .
  17. ^ "golang-jwt/jwt". GitHub . Consultado el 8 de enero de 2018 .
  18. ^ "jose: biblioteca de firma y cifrado de objetos JSON (JOSE) y token web JSON (JWT)". Hackage . Consultado el 25 de diciembre de 2022 .
  19. ^ auth0/java-jwt en github.com
  20. ^ "kjur/jsrsasign". GitHub . Consultado el 7 de mayo de 2018 .
  21. ^ "SkyLothar/lua-resty-jwt". GitHub . Consultado el 7 de mayo de 2018 .
  22. ^ "jsonwebtoken". npm . Consultado el 7 de mayo de 2018 .
  23. ^ ocaml-jwt en github.com
  24. ^ Crypt::JWT en cpan.org
  25. ^ lcobucci/jwt en github.com
  26. ^ Egan, Morten (7 de febrero de 2019), GitHub - morten-egan/jwt_ninja: Implementación PLSQL de tokens web JSON. , consultado el 14 de marzo de 2019
  27. ^ "SP3269/posh-jwt". GitHub . Consultado el 1 de agosto de 2018 .
  28. ^ "jpadilla/pyjwt". GitHub . Consultado el 21 de marzo de 2017 .
  29. ^ net-jwt en pkgs.racket-lang.org
  30. ^ JSON-WebToken en github.com
  31. ^ ruby-jwt en github.com
  32. ^ jsonwebtoken en github.com
  33. ^ rust-jwt en github.com
  34. ^ jwt-scala en github.com
  35. ^ [1] en github.com
  36. ^ Slootweg, Sven. "Deja de usar JWT para las sesiones". joepie91 Divagaciones . Consultado el 1 de agosto de 2018 .
  37. ^ "CVE - Resultados de búsqueda". cve.mitre.org .
  38. ^ "Vulnerabilidades de seguridad comunes de JWT y cómo evitarlas" . Consultado el 14 de mayo de 2018 .
  39. ^ Andreas, Happe. "JWT: Signature vs MAC Attacks" (Ataques de firma frente a ataques MAC). snikt.net . Consultado el 27 de mayo de 2019 .
  40. ^ "Vulnerabilidad crítica en el cifrado web JSON". Auth0 - Blog . Consultado el 14 de octubre de 2023 .
  41. ^ "¡De ninguna manera, JOSÉ! La firma y el cifrado de objetos de Javascript son un mal estándar que todos deberían evitar - Blog de Paragon Initiative Enterprises". paragonie.com . Consultado el 13 de octubre de 2023 .
  42. ^ "Errores en la autorización JWT". authzed.com . Consultado el 16 de noviembre de 2023 .