Tengo esta aplicación web que será toda la tecnología del lado del cliente (HTML, CSS, JavaScript / AngularJS, etc.). Esta aplicación web va a interactuar con la API REST para acceder y modificar datos. En este momento no está decidido qué tipo de sistema de autenticación utilizará la API REST.
Según tengo entendido, cualquier tipo de sistema de autenticación API (API Keys, OAuth 1/2, etc.) tendrá ciertos datos que deben mantenerse en secreto, de lo contrario el acceso puede verse comprometido. Para las claves API, las claves deben ser secretas, para OAuth 2 el secreto del cliente / tokens de acceso / tokens de actualización deben mantenerse en secreto, estoy seguro de que algunas de las 4 claves involucradas en OAuth 1 deben mantenerse en secreto (no demasiada experiencia con OAuth 1). He estado tratando de pensar si hay una manera de almacenar estas cosas secretas en una aplicación web pura del lado del cliente sin una capa intermedia en el lado del servidor.
He estado tratando de pensar en esto y no se me ocurre ningún lugar para hacerlo. Quiero decir que no puedo almacenarlo en JavaScript porque cualquiera puede ver la fuente o abrir la consola y obtener los datos. No estoy 100% seguro de cuán seguro es localStorage y si los usuarios pueden acceder / modificar esos datos. Incluso si el almacenamiento local fuera seguro, las dos formas en que puedo pensar en ingresar datos no lo son. Una forma es simplemente almacenar los datos en el código fuente de JavaScript, que es lo más inseguro que se me ocurre. Ahora, si estaba usando algo como OAuth 2 en el que la API del resto me daría los tokens, eso aún no sería tan seguro (mejor que la primera opción) porque esos tokens serían devueltos como texto sin formato para que cualquiera que pueda ver el solicitudes que la computadora está haciendo podría ver.
¿Hay alguna forma de tener una aplicación que se esté ejecutando completamente en el lado del cliente para poder almacenar datos secretos de forma segura sin algún tipo de capa intermedia en el lado del servidor?
fuente
Respuestas:
No, nunca puede ser completamente seguro. El usuario tiene el control del hardware y usted está tratando de mantener algo fuera de sus manos. En última instancia, PUEDEN obtenerlo a través de un medio u otro. Como está trabajando desde javascript, su posición es MUCHO peor que una aplicación de computadora normal, ya que el usuario no solo controla el hardware, sino que también controla el sandbox en el que se está ejecutando.
Puede ocultar cosas y dificultar el acceso a las cosas, pero al final PUEDEN sacarlas, si se esfuerzan lo suficiente.
fuente
Al diseñar sistemas de seguridad, uno siempre necesita pensar en el modelo de amenaza. " Hacerlo seguro " es un requisito tonto, no procesable o verificable. " Evitar que el usuario extraiga los tokens de acceso de la aplicación " es mucho mejor y define los límites de la solución. " Evitar que otros obtengan tokens de acceso de un usuario " también es mejor y define un espacio de solución completamente diferente. Las soluciones para una no necesariamente resolverán la otra ( p . Ej. , Esta última requiere SSL si se trata de WiFi, pero eso no afectará en absoluto a la primera).
fuente
una opción es que la API REST otorgue acceso o no se base en un inicio de sesión de usuario; puede devolver un token basado en sesión (guid, cadena hash, lo que desee) que se puede pasar a las otras llamadas a la API REST para autenticar el acceso
si le preocupa almacenar la información de inicio de sesión del usuario en la máquina cliente, no lo haga, pero el usuario deberá ingresar la información de cuenta y contraseña cada vez
no estoy tan familiarizado con OAuth et al, pero no veo ninguna razón convincente para almacenar la información de autenticación de manera persistente ...
fuente