¿Me faltan lagunas con la gestión de mi sesión actual?

1

Estoy creando un sitio con Spring, que requiere autenticación para poder acceder a ciertas páginas.

El sitio en realidad está compuesto por un host cliente, que representa las vistas y maneja el enlace de datos, y un host de API REST (también construido con Spring), su responsabilidad es devolver / manipular datos, validación / generación de token de usuario etc.

Decidí implementar una autenticación personalizada en el lado de REST. Al recibir un nombre de usuario y una contraseña válidos, volverá:

  • JWT firmado por la API REST con AES-256, la carga útil contendrá la identificación del usuario y la fecha de caducidad.
  • El JWT se almacena en una cookie, que es solo HTTP, segura y válida solo desde el dominio del sitio del cliente (¿es suficiente para contrarrestar los ataques csrf de medida?)

La única puerta trasera en la que podría pensar es si el atacante roba la cookie, por lo que podría agregar a la carga de JWT un valor aleatorio único para el usuario (que está almacenado en la base de datos), y en el caso de que el usuario esté sospechando que su sesión fue robada, podría emitir una solicitud para restablecer el valor único, haciendo que el token robado sea inútil.

¿Me estoy perdiendo alguna puerta trasera que pueda permitir que un atacante omita la autenticación fácilmente? ¿Debo usar Spring Security en su lugar? Me temo que no podré lograr el comportamiento sin estado que tengo actualmente ...

¡Gracias!

    
pregunta Nadav96 28.03.2017 - 21:17
fuente

1 respuesta

2

Serás vulnerable a un ataque CSRF.

Ya que quiere quedarse sin estado, la mejor opción es usar doble envío de cookies variación. Debe tener cuidado y no hacerlo ingenuamente, consulte esta pregunta. En resumen, deberá vincular su token CSRF a una sesión de seguridad:

  1. Generar un token CSRF suficientemente grande
  2. Incluya el token CSRF dentro de JWT como una de las reclamaciones
  3. Proporcione CSRF al cliente como resultado de una autenticación exitosa en un objeto JSON, por ejemplo. Proporcionará una cookie que contiene su JWT en el mismo paso. La cookie no se puede leer desde el cliente (httpOnly), por lo tanto, es necesario proporcionarla en un objeto JSON o en algún otro formato.
  4. En el cliente, almacenar el token CSRF en sessionStorage o localStorage y enviarlo al servidor en cada solicitud que cambie de estado como encabezado.
  5. En el lado del servidor, valide el valor del encabezado y JWT

Tu solución para revocar JWT está bien. Asegúrese de generar una nueva ID y emitir un nuevo token cuando el usuario cambie la contraseña.

Para minimizar el posible impacto que un JWT robado puede tener en su aplicación, mantenga la caducidad tan breve como su aplicación lo permita.

Puede implementar una seguridad JWT sin estado utilizando Spring Security y debe evitar hacerlo en un controlador REST y rodar su propia implementación personalizada. Vea esto como un buen punto de partida. Aunque es para Spring Boot, se puede modificar fácilmente para que funcione con Spring simple.

    
respondido por el Marko Vodopija 28.03.2017 - 23:04
fuente

Lea otras preguntas en las etiquetas