Una guía completa de JWT

¿Qué es JWT?

JWT (JSON Web Token) es un estándar abierto y el número de estándar es RFC7591. Se utiliza para transferir información de forma segura entre diferentes entidades. Se basa en tokens codificados en JSON.

La composición de JWT.

JWT consta de tres partes: encabezado, carga útil y firma.

  1. El encabezado contiene el tipo de token (typ) y el algoritmo de firma utilizado (alg), que generalmente se representa mediante codificación Base64. Los ejemplos son los siguientes:
{
  "alg": "HS256",
  "typ": "JWT"
}
  1. La carga útil es la parte principal de almacenamiento de información del token y contiene varios reclamos para representar información sobre la entidad (usuario, dispositivo u otro sujeto) y otros datos complementarios. La carga útil puede contener declaraciones estándar (por ejemplo: iss, sub, exp, nbf, iat, aud, etc.) o declaraciones personalizadas. La carga útil también está codificada en Base64 y se transmite en el token. Los ejemplos son los siguientes:
{
  "sub": "myapp",
  "name": "oscar",
  "role": "admin"
}
  1. Una firma es un valor hash que utiliza una clave para firmar el encabezado y la carga útil para garantizar que el token no pueda ser manipulado. La firma generalmente se genera utilizando el algoritmo (por ejemplo: HMAC, RSA, etc.) y la clave especificada en el encabezado, y se agrega al final del token como una cadena. La verificación de firma se puede utilizar para verificar la integridad y autenticidad del token.

Si observamos el proceso de generación de JWT en lenguaje Java, los pasos son los siguientes:

  1. Genere la cadena codificada en Base64 del encabezado
String header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
String encodedHeader = Base64.getEncoder().encodeToString(header.getBytes());
  1. Generar la cadena de codificación Base64 del vector
		String payload = "{\"sub\":\"myapp\",\"name\":\"oscar\"}";
		String encodedPayload = Base64.getEncoder().encodeToString(payload.getBytes());
  1. Después de usar el punto .para conectar el encabezado y el portador, use el algoritmo de firma para firmar y agregue el contenido firmado al final de toda la cadena.
		Key secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
		String concatenated = encodedHeader + '.' + encodedPayload;

		Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
		sha256_HMAC.init(secretKey);
		byte[] signature = sha256_HMAC.doFinal(concatenated.getBytes("utf-8"));
		String compact = concatenated + '.' + Base64.getEncoder().encodeToString(signature);

La cadena completa obtenida después de la generación es la siguiente:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJteWFwcCIsIm5hbWUiOiJvc2NhciJ9.5z6NoiF7MR999wOPn2NU6HnyPODx66qm5yRT+n8pNHs=

El contenido obtenido luego de decodificar a través de https://base64.us/ es el siguiente:
Insertar descripción de la imagen aquí

Como puede verse en lo anterior, el token JWT es una cadena.

El papel de JWT

JWT es adecuado para transmitir información de autenticación y autorización en solicitudes de red y, a menudo, se utiliza para crear mecanismos de control de acceso y autenticación sin estado. Una vez que el cliente recibe el token, puede verificar su validez decodificando y validando el token, y utilizar la información que contiene para autorización y autenticación.

En resumen, un JWT es un token de seguridad codificado en JSON, que consta de un encabezado, una carga útil y partes de firma que se pueden usar para pasar información entre entidades y verificar la identidad. Proporciona un mecanismo simple, extensible y autónomo para manejar tareas relacionadas con la autenticación y autorización .
JWT también se usa a menudo para el inicio de sesión único, es decir, después de que el usuario inicia sesión en el sistema A, se genera un token y luego el usuario trae este token cuando accede a otros sistemas, y luego puede acceder a los sistemas B, C, D. , etc.

Ventajas y desventajas de JWT

  1. Basado en JSON, fácil de analizar
  2. El contenido enriquecido se puede definir en tokens y es fácil de ampliar.
  3. Antimanipulación y alta seguridad mediante cifrado asimétrico y firmas digitales
  4. Los servicios de recursos pueden utilizar JWT para completar la autorización sin depender del servidor de autorización.

defecto:

  • El token JWT es más largo y ocupa más espacio de almacenamiento.

Cifrado y descifrado de JWT

El cifrado y descifrado de JWT normalmente implica los siguientes tres pasos:

  1. Crear JWT:
    crear JWT requiere preparar tres partes: encabezado, carga útil y firma. Al crear un JWT, primero Base64 codifica el encabezado y la carga útil, y concatena las dos cadenas codificadas con puntos para formar la primera parte del JWT. Luego, use la clave y el algoritmo de firma especificado para firmar la cadena anterior, genere una cadena de firma y conéctela con la cadena anterior con un punto para formar la forma final de JWT.

  2. Verificar JWT:
    el proceso de verificación de JWT generalmente incluye los siguientes pasos: Primero, Base64 decodifica las partes del encabezado y la carga útil del JWT para extraer la información que contienen. A continuación, se calcula una firma en las partes del encabezado y la carga útil utilizando el mismo algoritmo y clave utilizados para crear el JWT. Finalmente, la cadena de firma calculada se compara con la parte de la firma en el JWT. Si los dos son iguales, significa que el JWT no ha sido manipulado y se puede confiar en él.

  3. Decodificar el JWT:
    si necesita ver los datos contenidos en el JWT, puede decodificar Base64 la primera parte del JWT para obtener el encabezado y la información de carga útil. El resultado decodificado suele ser una cadena en formato JSON, que se puede convertir en un objeto a través de la biblioteca de análisis JSON correspondiente.

Cabe señalar que la información del encabezado y la carga útil en el JWT no están cifradas, solo codificadas en Base64. Por lo tanto, esta información se puede obtener fácilmente. Para proteger la confidencialidad de los datos, la parte de la carga útil generalmente se cifra mediante un algoritmo de cifrado, es decir, se convierte al formato JWE (JSON Web Encryption). JWE proporciona un método de cifrado estandarizado para proteger información confidencial en JWT. El JWE cifrado incluye encabezado, clave y texto cifrado cifrado, etc., que deben descifrarse utilizando el algoritmo y la clave correspondientes.

En general, el cifrado y descifrado de JWT suele implicar los pasos de crear el JWT, validarlo y decodificarlo. Entre ellos, la verificación de JWT se puede utilizar para verificar si el JWT ha sido manipulado para garantizar la integridad y credibilidad del JWT. Cifrar la parte de la carga útil puede proteger la información confidencial en el JWT y mejorar la confidencialidad del JWT.



Supongo que te gusta

Origin blog.csdn.net/oscar999/article/details/132706309
Recomendado
Clasificación