Java utiliza la autenticación de cookies y JWT

HTTP es un protocolo sin estado que se utiliza para transferir datos. Permite la comunicación entre el cliente y el servidor>. Originalmente se estableció para establecer una conexión entre un navegador web y un servidor web. Por ejemplo, al comprar en línea, agregamos algunos productos, por ejemplo. Auriculares a nuestro carrito de compras, y luego seguimos buscando otros artículos, durante este período, esperamos realizar cualquier otra tarea que sea almacenar el estado de los artículos del carrito de compras sin perderlos. Esto significa que queremos recordar nuestro estado durante todo el proceso de compra. Dado que HTTP es un protocolo sin estado, para superar el problema, podemos usar session o token

1. Autenticación basada en sesión

Antes de la llegada de los tokens web JSON, usábamos principalmente este tipo de autenticación. En este tipo de autenticación, el servidor es responsable de la autenticación y el cliente no sabe qué pasará con el servidor después de enviar la solicitud.

Entonces, ¿qué es una cookie de sesión?
Dado que el cliente no especifica el comando Expires (tiempo de vencimiento) o Max-Age (límite superior máximo), se eliminará cuando se cierre el cliente. Sin embargo, los navegadores web pueden utilizar la restauración de sesión , que mantiene la mayoría de las cookies de sesión de forma permanente, como si el navegador nunca se hubiera cerrado.

¿Qué sucede cuando un usuario inicia sesión en el sitio web en un navegador web? Por ejemplo, después de que un usuario inicia sesión, el servidor creará una sesión para el usuario y almacenará los datos de la sesión en la memoria del servidor. Cuando un usuario realiza ciertas actividades en el sitio web, se crea un ID de sesión, que se almacena en una cookie en el navegador del cliente. En cada solicitud realizada por el usuario, la cookie se enviará en consecuencia. Luego, cuando el usuario inicia sesión inicialmente, el servidor puede usar los datos de la sesión almacenados en la memoria del servidor para verificar los datos de la sesión en la cookie. Cuando el usuario cierra la sesión del sitio web, los datos de la sesión se eliminarán de la base de datos y la memoria del servidor.

2. Autenticación basada en tokens

En la autenticación basada en tokens, utilizamos JWT (JSON Web Tokens) para la autenticación. Este es un método ampliamente utilizado de RESTful API.

Cuando el usuario envía una solicitud de autenticación de usuario con detalles de inicio de sesión, el servidor creará un token cifrado en forma de JSON WEB TOKENS (JWT) y lo enviará de vuelta al cliente. Cuando el cliente recibe el token, significa que el usuario está autenticado y puede usar el cliente para realizar cualquier actividad.

JWT generalmente se almacena en el almacenamiento local del cliente.Cuando un usuario solicita cualquier dato del servidor o realiza alguna actividad en el sitio web, el JWT se enviará como la clave única del usuario. Por lo tanto, cuando el servidor recibe la solicitud, verificará que el JWT sea solo el usuario específico para cada solicitud y luego enviará la respuesta requerida al cliente.

localStorage.setItem("key", "value");

El estado del usuario se almacena en el cliente JWT. Cuando el usuario cierra la sesión, el token se eliminará del cliente (localStorage). Por lo tanto, la mayoría de los datos se almacenan en el cliente y se puede acceder a ellos directamente en lugar de enviar una solicitud al servidor.

JSON WEB TOKENS consta de tres partes conectadas por (.):
1. Encabezado
2. Carga
3. Firma

Estructura JWT:
xxxxx.yyyyy.zzzzz

La salida contiene tres cadenas de URL Base64 separadas por puntos. Estas cadenas se pueden pasar fácilmente en entornos HTML y HTTP. En comparación con los estándares basados ​​en XML (como SAML), es más compacto.

JWT ha codificado el encabezado y la carga útil anteriores y lo ha firmado con una clave, de la siguiente manera

¿Cual es mejor?

En las aplicaciones web modernas, JWT se usa ampliamente porque es más escalable que las cookies basadas en sesión, porque el token se almacena en el lado del cliente y la sesión usa la memoria del servidor para almacenar los datos del usuario, lo que puede ser un gran problema. Una gran cantidad de usuarios acceden a la aplicación a la vez. Dado que el JWT se envía con cada solicitud y contiene toda la información del usuario, incluso si el JWT está codificado, es necesario utilizar la información necesaria en el JWT, y la información confidencial debe evitarse o cifrarse para evitar la seguridad * **.

No existe un método fijo que se pueda usar todo el tiempo, depende del desarrollador y del tipo de requisitos para saber qué método debe usarse en qué situación.

3. JWT se da cuenta del inicio de sesión

   // Definir la duración efectiva de JWT durante siete días
    privado estático final largo EXPIRE_TIME = 60 * 1000 * 60 * 24 * 7;
    //firmante
    Cadena estática privada ISSUER = "K_ang";
    / * Secreto * /
    Cadena final estática privada SING = "K * & ^ A% $ # N @! G";

    / **
     * Generar token
     * proyecto java www.fhadmin.org
     * @param mapa
     * @regreso
     * /
    public static String getToken (Map <String, String> map) {

        // Establecer el tiempo de caducidad
        Fecha fecha = nulo;
        tratar {
            fecha = nueva fecha (System.currentTimeMillis () + EXPIRE_TIME);

            // Crear token
            Constructor de JWTCreator.Builder = JWT.create ()
                    .withIssuer (EMISOR)
                    .withExpiresAt (fecha);
            //añadir información
            map.forEach ((k, v) -> {
                constructor con reclamación (k, v);
            });
            return builder.sign (Algoritmo.HMAC256 (SING));
        } captura (Excepción e) {
            e.printStackTrace ();
            devolver nulo;
        }
    }

    / **
     * Verificar token
     * proyecto java www.fhadmin.org
     * @param token
     * /
    verificación booleana estática pública (token de cadena, número de usuario de cadena) {
        tratar {
            // Establecer algoritmo de cifrado
            Verificador JWTVerifier = JWT.require (Algorithm.HMAC256 (SING)). WithClaim ("userNo", userNo) .build ();
            // Verificar token
            DecodedJWT jwt = verifier.verify (token);
            devuelve verdadero;
        } captura (Excepción e) {
            falso retorno;
        }


    }

    / **
     * Cómo obtener información del token
     * proyecto java www.fhadmin.org
     * @param
     * @regreso
     * /
    public static String getTokenInfo (String token) {
        DecodedJWT decode = JWT.decode (token);
        return decode.getClaim ("userNo"). asString ();
    }
}

// proyecto java www.fhadmin.org
@PostMapping ("/ iniciar sesión")
    inicio de sesión de resultado público (@PathParam ("empNo") String empNo, @PathParam ("empPassword") String empPassword) {
        if (empNo == null || "" .equals (empNo)) {
            return ResultUtil.error (103, "Ingrese el nombre de usuario, el nombre de usuario no puede estar vacío");
        }
        if (empPassword == null || "" .equals (empPassword)) {
            return ResultUtil.error (103, "Por favor ingrese la contraseña, la contraseña no puede estar vacía");
        }
        Emp emp = empService.login (empNo, empPassword);
        si (emp == nulo) {
            return ResultUtil.error (103, "El usuario no existe, la adquisición del token falló");
        }
        if (emp.getEmpPassword () == null ||! emp.getEmpPassword (). equals (empPassword)) {
            return ResultUtil.error (103, "Error de contraseña, no se pudo obtener el token");
        }
        // Token normal
        Token de cadena = JwtUtils.sign (empNo, empPassword);
        emp.setToken (token);   
        return ResultUtil.success (200, "Inicio de sesión exitoso", emp);
    }

 


Supongo que te gusta

Origin blog.51cto.com/14622073/2655918
Recomendado
Clasificación