Un artículo lo lleva a combinar Spring Security con Jwt para lograr un inicio de sesión sin estado

Hay muchas estrategias de inicio de sesión en proyectos de separación de front-end y back-end, pero JWT es actualmente una solución popular. Este artículo compartirá con usted cómo usar Spring Security y JWT juntos para lograr la separación de front-end y back-end. Solución de inicio de sesión de Time.

1. Inicio de sesión sin estado

1. ¿Qué es la estadidad?

Servicio con estado, es decir, el servidor necesita registrar la información del cliente de cada sesión, a fin de identificar la identidad del cliente y procesar la solicitud de acuerdo con la identidad del usuario. Un diseño típico es la sesión en Tomcat.

Por ejemplo, iniciar sesión: después de que el usuario inicia sesión, guardamos la información del usuario en la sesión del servidor, y le damos al usuario un valor de cookie, registramos la sesión correspondiente y luego la siguiente solicitud, el usuario lleva el valor de la cookie (este paso lo completa automáticamente el navegador) , Podemos identificar la sesión correspondiente para encontrar la información del usuario.
Este método es actualmente el más conveniente, pero también tiene algunos inconvenientes, como sigue:

(1) El servidor guarda una gran cantidad de datos, lo que aumenta la presión sobre el servidor
(2) El servidor guarda el estado del usuario y no admite la implementación en clúster

2. ¿Qué es apátrida?

Cada servicio del clúster de microservicios usa una interfaz de estilo RESTful para la provisión externa.
Y una de las especificaciones más importantes del estilo RESTful es la apatridia de los servicios, a saber:

El servidor no almacena ninguna información del solicitante del cliente
. Cada solicitud del cliente debe tener información autodescriptiva, y la identidad del cliente puede identificarse a través de esta información.

Entonces, ¿cuáles son los beneficios de esta apatridia?

Las solicitudes de los clientes no dependen de la información del servidor y no es necesario que varias solicitudes accedan al mismo servidor
. El clúster y el estado del servidor son transparentes para el
cliente. El servidor se puede migrar y escalar de forma arbitraria (la implementación del clúster es conveniente) para
reducir el servidor Presión de almacenamiento

3. ¿Cómo lograr la apatridia?

El proceso de inicio de sesión sin estado:

Primero, el cliente envía el nombre de la cuenta / contraseña al servidor para la autenticación. Una vez que
se pasa la autenticación, el servidor encripta y codifica la información del usuario en un token, que se devuelve al cliente.
Después de que el cliente envía una solicitud, debe llevar el
par de servidor del token de autenticación . El token enviado por el cliente se descifra, se juzga si es válido y se obtiene la información de inicio de sesión del usuario

二 、 JWT

1. Introducción a JWT

JWT, el nombre completo es Json Web Token, es una especificación de autenticación de identidad y autorización ligera de estilo JSON que puede realizar autorizaciones de aplicaciones web distribuidas y sin estado:

Inserte la descripción de la imagen aquí
Como especificación, JWT no está vinculado a un determinado lenguaje. La implementación de Java que se usa comúnmente es el proyecto de código abierto jjwt en GitHub. La dirección es la siguiente:https://github.com/jwtk/jjwt

2. Formato de datos JWT

JWT contiene tres partes de datos:

  1. Encabezado: encabezado, normalmente el encabezado tiene dos partes de información:

Tipo de declaración, aquí está el
algoritmo de cifrado JWT , personalizado

Vamos a codificar Base64Url (decodificable) en el encabezado para obtener la primera parte de los datos.

  1. Carga útil: La carga útil son datos válidos. En el documento oficial (RFC7519), aquí hay 7 ejemplos de información:

iss (emisor): indica el emisor
exp (fecha de vencimiento): indica la fecha de vencimiento del
sub (asunto) del token : sujeto
aud (audiencia): audiencia
nbf (no antes): tiempo de vigencia
iat (emitido en): tiempo de emisión
jti (JWT ID ): Numeración

Esta parte también usará la codificación Base64Url para obtener la segunda parte de los datos.

  1. Firma: la firma es la información de autenticación de todos los datos. Generalmente, en base a los datos de los dos primeros pasos, más la clave secreta del servicio (la clave secreta se almacena en el servidor y no se puede filtrar al cliente), es generada por el algoritmo de cifrado configurado en el Encabezado. Se usa para verificar la integridad y confiabilidad de todos los datos.
    El formato de datos generado es el siguiente:

Inserte la descripción de la imagen aquí
Tenga en cuenta que, cuando los datos están .espaciados en tres porciones, correspondientes respectivamente a las tres partes antes mencionadas, además, cuando los datos no se envuelven, las imágenes de ajuste se muestran solo por conveniencia.

3. Proceso de interacción de JWT

Diagrama de flujo:
Inserte la descripción de la imagen aquí
traducción de pasos:

La aplicación o el cliente solicita la autorización del servidor de autorización. Una vez
obtenida 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 los recursos protegidos (como la API)

Debido a que el token emitido por JWT ya contiene la información de identidad del usuario, y se incluirá en cada solicitud, el servicio no necesita guardar la información del usuario, ni siquiera consultar la base de datos, que cumple con la especificación sin estado RESTful.

4. Problemas con JWT

Habiendo dicho eso, JWT no es perfecto. Algunos problemas causados ​​por el mantenimiento del estado de inicio de sesión por parte del cliente todavía existen aquí. Algunos ejemplos son los siguientes:

(1) Problema de renovación, este es uno de los problemas criticados por muchas personas. La solución tradicional cookie + sesión naturalmente apoya la renovación, pero como el servidor no guarda el estado del usuario, es difícil resolver el problema de renovación perfectamente. Si se introduce redis , Aunque puede resolver el problema, pero jwt se ha vuelto indescriptible.
(2) Problema de cierre de sesión. Dado que el servidor ya no guarda la información del usuario, generalmente es posible cerrar sesión modificando el secreto. Una vez que se modifica el secreto del servidor, los tokens no vencidos que se hayan emitido fallarán la autenticación y luego cerrarán la sesión, pero después de todo, no El cierre de sesión tradicional es conveniente.
(3) La contraseña se restablece. Después de restablecer la contraseña, el token original aún puede acceder al sistema. En este momento, el secreto debe modificarse a la fuerza.
(4) Con base en el segundo y tercer punto, generalmente se recomienda que diferentes usuarios utilicen diferentes secretos.

Tres, integración real de SpringBoot JWT

(1) Agregar dependencia:

Inserte la descripción de la imagen aquí
Luego agregue la dependencia jwt:

		<dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

Necesita ser agregado

Supongo que te gusta

Origin blog.csdn.net/nanhuaibeian/article/details/108578893
Recomendado
Clasificación