¿JWT o cookie de sesión para API para aplicaciones web y móviles?

0

He estado leyendo todo lo que pude sobre este tema durante los últimos días y no puedo decidir cuál sería el mejor enfoque.

Los dos únicos requisitos son:

  • Necesito conocer los usuarios que han iniciado sesión y cada sesión que tienen, para que el usuario pueda ver una lista con esta información y poder cerrar cualquier sesión que elija.

  • Ambas aplicaciones deberían usar los mismos puntos finales de una API de descanso.

Al principio usaba cookies de sesión y llamaba a la API con setCredentials = true, pero descubrí que las aplicaciones móviles manejan las cookies de manera diferente y no tengo control sobre eso (por ejemplo, se eliminan por varias razones antes de que caduquen ). Pensé en guardar la cookie en el almacenamiento nativo y agregarla a cada solicitud, pero no puedo acceder a la cookie de ninguna manera porque httpOnly está configurado como verdadero. La solución sería establecer httpOnly en falso, pero de esta manera estoy exponiendo la cookie y no estoy seguro de qué medidas de seguridad debo implementar para proteger la cookie contra el robo o la manipulación.

La otra solución sería usar JWT y almacenarlo en el almacenamiento web / nativo. También almacenaría en una tabla todos los tokens que siguen siendo válidos (hash con un algoritmo de contraseña) para obtener la lista de usuarios registrados y sus sesiones, y otra tabla para tokens no válidos para cuando el usuario elija finalizar una sesión en particular / cambie la contraseña / Pero, una vez más, no estoy seguro de las medidas de seguridad que deberían aplicarnos con este enfoque. ¿Debo cifrar el token también? Estaba pensando en agregarle datos sobre el dispositivo que solicita el token para verificar siempre que el dispositivo que solicitó el token es el que lo usa. ¿Qué otras cosas debo hacer para proteger este token?

Si implemento correctamente cualquiera de estas opciones, ¿cuál sería la más segura tanto para la web como para el móvil?

    
pregunta Leia 10.10.2018 - 16:29
fuente

2 respuestas

0

¿Confías en todo el código de tu cliente? En caso afirmativo, puede almacenar las ID de sesión en el almacenamiento local y asegurarse de enviarlas con cada solicitud HTTP. En su backend, simplemente tenga una tabla con hash de ID de sesión como clave principal, e ID de usuario como clave externa y un tiempo de caducidad. No guarde una lista de sesiones eliminadas, solo elimine la fila (o márquela como eliminada).

El riesgo de las cookies es que se envían con cada solicitud HTTP a su dominio, incluso si se originó en un cliente falso. Esto se llama CSRF . A menos que tenga algún tipo de protección CSRF, evite las cookies y use el almacenamiento local.

Por supuesto, si no puedes confiar en todo el código de tu cliente, necesitarás otra solución.

Además, si está utilizando HTTPS, las identificaciones de sesión, ya sean cookies o formularios, se cifrarán.

    
respondido por el Irfan434 10.10.2018 - 20:51
fuente
0

Antes de entrar en los detalles, diré que tanto las cookies de sesión como las JWT funcionan para su caso y que ambas están seguras si se implementan correctamente . Personalmente, me gustaría ir con JWT solo porque es más fácil obtener información actualizada o soluciones listas para usar.

JWT

Los JWT fueron realmente diseñados para la autorización sin estado en mente, pero todavía puedes usarlos para las sesiones. Querrá consultar especialmente el uso de un modelo de token de acceso / actualización en el que realiza un seguimiento de los tokens de actualización activos en su base de datos.

En cuanto al cifrado, existen dos implementaciones principales del estándar JWT, a saber, JWS (un token firmado) y JWE (token firmado y cifrado). Lo que debe tener en cuenta es que la firma de un token firmado ya garantiza la integridad del token. Solo implementaría JWE si también está pasando información confidencial en el token que desea ocultar del cliente . Sin embargo, JWT por sí solo no resuelve los problemas con los ataques de intermediarios, por lo que debe recordar usar SSL siempre que transmita el token.

El almacenamiento del token diferirá entre su aplicación web y la aplicación nativa móvil. Para las aplicaciones móviles, debe almacenarlas en el Llavero / Almacén del sistema operativo (probablemente a través de un envoltorio) que está diseñado para tal fin. Por otro lado, la ubicación de almacenamiento de JWT en un navegador es un tema bastante controvertido, ya que el almacenamiento en almacenamiento web (sessionStorage / localStorage) es vulnerable a ataques XSS, mientras que el almacenamiento dentro de una cookie es vulnerable a CSRF.

De lo que puedo deducir, la tendencia general es evitar el almacenamiento web debido a su superficie de ataque más grande, pero para ser honesto, he visto ejemplos de ambos métodos. Para aplicaciones de una sola página, también puede considerar mantener el token en la memoria sin almacenamiento persistente.

Cookies de sesión

Sin conocer los detalles de su aplicación móvil, es difícil decirlo, pero según mi experiencia, si está utilizando los mecanismos de almacenamiento de cookies de CookieManager / NSHTTPCookie provisto por Google / iOS, no debería haber un problema de cookies eliminadas que usted describe.

El almacenamiento de cookies en el navegador requerirá que lo asegure contra CSRF. La protección que debe usar dependerá en gran medida de las restricciones y la implementación específicas de su servidor y creo que debería consultar los recursos en OWASP o haga una pregunta más específica.

    
respondido por el AlphaD 12.10.2018 - 09:39
fuente

Lea otras preguntas en las etiquetas