Almacenamiento del nombre de usuario en sessionStorage: ¿mala idea?

1

Estoy trabajando en la aplicación React-Django que usa JWT para la autenticación. El usuario inicia sesión con su nombre de usuario y contraseña, el servidor valida y responde con JWT y nombre de usuario, y (actualmente) solo estoy almacenando el JWT en sessionStorage .

Luego se verifica que JWT es válido y actual en cualquier momento en que el usuario navega entre rutas protegidas. Si sigue siendo bueno, se actualiza. es decir, se envía desde sessionStorage.getItem('token') al servidor, se devuelve uno nuevo si el enviado sigue siendo válido y reemplaza al existente en sessionStorage . Genial.

El problema con el que me he encontrado es que, mientras he identificado, el usuario tiene permiso para acceder y seguir accediendo a estas rutas protegidas, no sé realmente quiénes son y, por lo tanto, no puedo extraer datos específicos de ellos. (No he tenido suerte con el uso de cosas como user = request.user.username para saber quién es el usuario actual y el JWT después de que el número inicial de JWT no lleve el nombre de usuario junto con él ... por lo que puedo decir).

Veo dos opciones para resolver esto:

1) Almacene el JWT en la base de datos en relación con el usuario y en sessionStorage para que pueda llamarse desde sessionStorage , en comparación con la base de datos, y luego identifique al usuario a partir de eso.

Parece que esta podría ser la opción "más segura" para ir.

2) Dado que el servidor ya está enviando de vuelta el username junto con el JWT cuando el usuario inicia sesión, puedo comenzar a almacenar ambos en sessionStorage . De esa manera, puedo sessionStorage.getItem('username') y solicitar al servidor que recupere información específica del usuario. Sin embargo, alguien podría sessionStorage y obtener su nombre de usuario. (Los JWT solo son válidos durante 15 minutos, y si cumple con ese límite de tiempo, el usuario cierra la sesión y se hace sessionStorage.clear() ).

El segundo, es lo que me preocupa de la seguridad. Estoy lejos de ser un experto en seguridad, así que solo tengo curiosidad por saber cuáles son las ramificaciones de almacenar username en sessionStorage y cuáles de ellas serían "mejores".

EDITAR: A medida que continúo leyendo sobre el tema, estoy encontrando numerosas guías y libros que usan ejemplos donde username se almacena en sessionStorage . Aunque eso no lo hace bien. Por ejemplo, este bonito ejemplo que almacena el nombre de usuario y la contraseña en localStorage (es posible que me esté arriesgando, pero es una idea muy mala):

enlace

    
pregunta sockpuppet 10.11.2017 - 18:21
fuente

1 respuesta

1

Bien hecho por pensar a través de las limitaciones de JWT. La mayoría de la gente no lo hace y, como ha visto, la mayoría de los tutoriales de JWT en la web son horriblemente inseguros.

Una cosa a tener en cuenta es que la entrega de un JWT al servidor no demuestra que el dispositivo / navegador de origen es el que recibió el token en primer lugar. Esa es una de las razones por las que los JWT deben tener una vida muy corta porque, por sí solos, están fácilmente sujetos a ataques de repetición de tokens. Incluso TLS no garantiza la libertad de un ataque de reproducción JWT, si la PC original ya estaba comprometida.

Para agregar seguridad adicional, debe estar seguro de que la necesita. Obviamente, una de las razones para usar JWT es aligerar la carga en el servidor. Agregar la validación de token del lado del servidor y / o un almacén de sesión elimina claramente parte de esa ventaja.

Si necesita la seguridad adicional, deberá cifrar los datos adicionales en el token, por ejemplo. dirección IP. O deberá almacenar suficientes datos en un almacén de sesión para poder validar sensiblemente que el token ha regresado de donde lo esperaba, y quizás vuelva a registrar la dirección IP de origen.

Se puede decir que una tienda de sesión es más segura pero probablemente no mucho.

Su pregunta con respecto a la identidad se resuelve fácilmente almacenando el ID de usuario contra el token en su almacén de sesión, si está usando uno. Si decide que no desea seguridad adicional, entonces es suficiente almacenar el ID en el token siempre que los valores del token estén cifrados en el servidor.

    
respondido por el Julian Knight 12.11.2017 - 14:21
fuente

Lea otras preguntas en las etiquetas