Principios de generación y verificación de tokens para prevenir ataques CSRF
El mensaje consta de información de identificación del cliente (uid, did), cuerpo de carácter aleatorio y marca de tiempo de vencimiento.
Utilice símbolos (como "$" y ") para separar la parte del mensaje de la parte de la firma cifrada.
La firma se basa en la parte de información del mensaje mencionada en el mensaje anterior y basado en la clave específica para cifrar el mensaje anterior
Token = formato base64(msg)...base64(sha 256("key",msg))
Cuando el usuario recibe el mensaje del cliente. Cuando el cliente obtiene el token y lo envía nuevamente al servidor, el servidor primero determina la validez del token. Si es válido, el servidor deconstruye el token enviado por el cliente en tres. partes: mensaje, delimitador y firma.
El servidor primero verifica que el token aún sea sensible al tiempo, si no, deniega el acceso a la información enviada por el cliente y si la firma obtenida lo es. Igual que la firma enviada por el cliente, el token es válido
El JWT consta de las siguientes tres partes:
Es decir:
El encabezado. La parte es un objeto JSON que describe los metadatos JWT, generalmente de la siguiente manera
El atributo alg indica el algoritmo de firma y el valor predeterminado es HMAC SHA256 (escrito como
Typ). atributo. Indica el tipo de token, el token JWT se escribe como JWT
La parte de carga útil también es un objeto JSON, que se utiliza para almacenar los datos reales que deben pasarse
<. p>Además de los campos oficiales, también puede definir campos privados en esta sección:Tenga en cuenta que los JWT no están cifrados de forma predeterminada y cualquiera puede leerlos, así que no coloque información confidencial. en esta parte.
Este objeto JSON también se convertirá en una cadena utilizando el algoritmo Base64URL.
La parte de la firma es la firma de las dos primeras partes. p>
Primero, debe especificar un secreto. Esta clave solo la conoce el servidor y no puede revelarse al usuario. Luego, se genera de acuerdo con la siguiente fórmula utilizando el algoritmo de firma especificado en el encabezado (predeterminado). es HMAC SHA256).
Después de calcular la firma, el encabezado, la carga útil y la firma se combinan en una cadena, con cada parte separada por un "punto" (.), a la que se puede devolver. el usuario.
Como se mencionó anteriormente, el algoritmo para el encabezado de cadena y la carga útil es Base64URL. El algoritmo es básicamente similar al algoritmo Base64, pero existen algunas diferencias sutiles
en algunos. En casos (como api.example. com/?), las URL pueden poner JWT como tokens. Base64 tiene tres caracteres +, / y =, que tienen significados especiales en las URL, por lo que deben reemplazarse con: = omitido, + reemplazado con -. , / reemplazado por _. Este es el algoritmo Base64URL.
El cliente recibe el JWT devuelto por el servidor, que puede almacenarse en una cookie o en un almacenamiento local.
A partir de entonces, cada vez que el cliente se comunique con el servidor deberá traer este JWT. Puede colocarlo en una cookie y enviarlo automáticamente, pero no se puede enviar entre dominios, por lo que es mejor colocarlo en el campo Autorización de información del encabezado de la solicitud HTTP.
Autorización: portador <Token>
Otro enfoque es que, cuando se cruzan dominios, el JWT se coloca en el cuerpo de datos de la solicitud POST.