Estoy escribiendo un servidor de aplicaciones y hay una opción para usar cookies seguras para la autenticación. Así es como parece funcionar:
- Usted define una clave secreta de 32 bytes en el servidor
- Cuando el usuario inicia sesión, verifica la base de datos para ver si los hash de bcrypt coinciden, y si es así, llama a
request.remember(user_id)
- En los controladores de ruta que requieren autenticación (y el ID de usuario), desenvuelve el ID de usuario descifrando la cookie y, si es válida, continuará. De lo contrario, devuelve un error
Unauthorized
. - Si un usuario golpea el controlador de cierre de sesión, solo llamo
request.forget()
y la cookie se elimina en el cliente.
Todo esto parece funcionar. Entonces, lo que siento curiosidad es ¿por qué no todos hacen esto? Miro a mi alrededor y parece que se habla mucho de JWTs, generando UUID de token de autenticación y almacenándolos en Redis / la base de datos, etc. Entonces, ¿parece que este método no es seguro? ¿Y necesitas almacenar el estado en el servidor?
Si tuviera que adivinar, diría que un problema con este enfoque podría ser que si la cookie se roba de alguna manera (no estoy seguro de cómo se trata de TLS y las cookies son solo de HTTP y seguras si eso importa), entonces el usuario podría ser suplantado por un atacante. Pero creo que esto también se aplicaría a los otros esquemas?
Otro problema que podría ver es que un usuario podría generar aleatoriamente tokens de autenticación hasta que encuentre uno que coincida con un usuario. Pero tampoco estoy seguro de si esto es un problema, ya que me limité a limitar el controlador de autenticación y me imagino que este tipo de cosas llevaría un tiempo. Oh, tal vez podrían hacer 100 cuentas y ver qué aspecto tenía el token de autenticación de cookie cifrado y aplicar fuerza bruta al cliente para averiguar cuál era la clave secreta en el servidor. ¿Y entonces podrían hacerse pasar por usuarios generando tokens de autenticación? Aunque creo que llevaría demasiado tiempo encontrar la clave, ya que tiene 32 bytes.
Supongo que este enfoque no hace que las cookies expiren automáticamente (¿es por eso que no se usa mucho? Pero creo que hay una manera de agregar un encabezado de expiración a las cookies? ¿Eso funcionaría?) Ni siquiera estoy seguro de si Necesito la caducidad de esta aplicación ... Parece que molestaría a los usuarios. ¿Cuánto tiempo duran las sesiones en lugares como Google / Facebook? Siento que siempre he iniciado sesión en esos servicios para siempre.
No lo sé. Siento que me estoy perdiendo mucha información aquí. ¿Hay algún lugar donde pueda encontrar una lista de pros y contras de todos estos enfoques diferentes?