Discutamos desde el principio:
JWT es un enfoque muy moderno, simple y seguro que se extiende a Json Web Tokens. Json Web Tokens son una solución sin estado para la autenticación. Por lo tanto, no es necesario almacenar ningún estado de sesión en el servidor, lo que, por supuesto, es perfecto para API relajantes. Las API de reposo siempre deben estar sin estado, y la alternativa más utilizada para la autenticación con JWT es simplemente almacenar el estado de inicio de sesión del usuario en el servidor mediante sesiones. Pero, por supuesto, no sigue el principio que dice que las API relajantes no deberían tener estado y es por eso que soluciones como JWT se hicieron populares y efectivas.
Entonces, ahora sepamos cómo funciona la autenticación con Json Web Tokens. Asumiendo que ya tenemos un usuario registrado en nuestra base de datos. Entonces, el cliente del usuario comienza haciendo una solicitud de publicación con el nombre de usuario y la contraseña, la aplicación luego verifica si el usuario existe y si la contraseña es correcta, entonces la aplicación generará un Json Web Token único solo para ese usuario.
El token se crea usando una cadena secreta que se almacena en un servidor . A continuación, el servidor envía ese JWT al cliente, que lo almacenará en una cookie o en un almacenamiento local.
Así, el usuario se autentica y básicamente inicia sesión en nuestra aplicación sin dejar ningún estado en el servidor.
Por lo tanto, el servidor no sabe qué usuario ha iniciado sesión realmente, pero, por supuesto, el usuario sabe que ha iniciado sesión porque tiene un Json Web Token válido, que es un poco como un pasaporte para acceder a partes protegidas de la aplicación.
Así que de nuevo, solo para asegurarte de que tienes la idea. Un usuario inicia sesión tan pronto como recupera su Json Web Token válido único que no se guarda en ningún lugar del servidor. Y, por lo tanto, este proceso es completamente apátrida.
Luego, cada vez que un usuario desea acceder a una ruta protegida, como sus datos de perfil de usuario, por ejemplo. Envía su Json Web Token junto con una solicitud, por lo que es un poco como mostrar su pasaporte para obtener acceso a esa ruta.
Una vez que la solicitud llegue al servidor, nuestra aplicación verificará si el Json Web Token es realmente válido y si el usuario es realmente quien dice ser, entonces los datos solicitados se enviarán al cliente y, de lo contrario, habrá ser un error diciéndole al usuario que no tiene permitido acceder a ese recurso.
Toda esta comunicación debe realizarse a través de https, por lo que es seguro Http cifrado para evitar que cualquiera pueda acceder a contraseñas o Json Web Tokens. Solo entonces tenemos un sistema realmente seguro.
Entonces, un Json Web Token parece parte izquierda de esta captura de pantalla que fue tomada del depurador JWT en jwt.io Así que, esencialmente, es una cadena de codificación compuesta de tres partes. El encabezado, la carga útil y la firma Ahora el encabezado son solo algunos metadatos sobre el token en sí y la carga útil son los datos que podemos codificar en el token, cualquier dato que realmente queramos. Entonces, cuantos más datos queramos codificar aquí, mayor será el JWT. De todos modos, estas dos partes son solo texto sin formato que se codificarán, pero no se cifrarán.
Por lo tanto, cualquiera podrá decodificarlos y leerlos , no podemos almacenar ningún dato confidencial aquí. Pero eso no es un problema en absoluto porque en la tercera parte, así que en la firma, es donde las cosas realmente se ponen interesantes. La firma se crea utilizando el encabezado, la carga útil y el secreto que se guarda en el servidor.
Y todo este proceso se llama firmar el Json Web Token . El algoritmo de firma toma el encabezado, la carga útil y el secreto para crear una firma única. Entonces, solo estos datos más el secreto pueden crear esta firma, ¿de acuerdo? Luego, junto con el encabezado y la carga útil, estas firmas forman el JWT, que luego se envía al cliente.
Una vez que el servidor recibe un JWT para otorgar acceso a una ruta protegida, necesita verificarlo para determinar si el usuario realmente es quien dice ser. En otras palabras, verificará si nadie cambió el encabezado y los datos de carga del token. Entonces, nuevamente, este paso de verificación verificará si ningún tercero realmente alteró el encabezado o la carga del Json Web Token.
Entonces, ¿cómo funciona realmente esta verificación? Bueno, en realidad es bastante sencillo. Una vez que se recibe el JWT, la verificación tomará su encabezado y carga útil, y junto con el secreto que aún se guarda en el servidor, básicamente crea una firma de prueba.
Pero la firma original que se generó cuando se creó el JWT aún está en el token, ¿verdad? Y esa es la clave de esta verificación. Porque ahora todo lo que tenemos que hacer es comparar la firma de prueba con la firma original. Y si la firma de prueba es la misma que la firma original, significa que la carga útil y el encabezado no se han modificado.
Porque si hubieran sido modificados, entonces la firma de la prueba tendría que ser diferente. Por lo tanto, en este caso donde no ha habido alteración de los datos, podemos autenticar al usuario. Y, por supuesto, si las dos firmas son realmente diferentes, entonces significa que alguien manipuló los datos. Por lo general, tratando de cambiar la carga útil. Pero ese tercero que manipula la carga útil, por supuesto, no tiene acceso al secreto, por lo que no puede firmar el JWT. Por lo tanto, la firma original nunca corresponderá a los datos manipulados. Y por lo tanto, la verificación siempre fallará en este caso. Y esa es la clave para hacer que todo este sistema funcione. Es la magia que hace que JWT sea tan simple, pero también extremadamente poderoso.
md5('original messaged' + secret) != md5('changed message' + secret)
por lo tanto, si alguien cambia el mensaje, puede detectarlo