He pasado mucho tiempo estudiando la creación de una API que debe ser accesible mediante una aplicación de JavaScript de una sola página y cómo hacerla lo más segura posible.
Gran parte de lo que estoy leyendo sobre estándares como OAuth sugiere que nunca desea que el token de acceso que emite esté disponible directamente para el cliente, y es por eso que a menudo se critican cosas como la Subvención Implícita.
Recientemente leí este artículo: enlace
... que ofreció una interesante sugerencia de enviar solicitudes de proxy a la API a través de un componente del lado del servidor delgado, para que la aplicación de una sola página pueda autenticarse con el proxy, recuperar una cookie de sesión cifrada y luego realizar solicitudes al proxy servidor que adjuntaría el token de acceso del usuario a las solicitudes antes de reenviarlas a la API real.
Lo que me pregunto es ¿cómo es esto más seguro que simplemente entregarle al cliente un token de acceso? Si el atacante hubiera podido obtener el token de acceso, seguramente puede obtener la cookie que almacena la información de la sesión, que es tan buena como el token de acceso para realizar solicitudes a la API.
¿Por qué consideramos que las cookies cifradas con detalles de sesión en ellas son seguras, pero confiar en el cliente con el token de acceso real se considera inseguro?
La verdadera diferencia es que una API sin acceso directo del cliente se considera una API segura y privada, y cualquier API a la que deba acceder el cliente de alguna manera (incluso a través de un proxy) debe ser tratada como una API pública o abierta, y solo tiene que aceptar la compensación del riesgo de que alguien pueda falsificar solicitudes si pudiera obtener la cookie de sesión o el token de acceso.
¿Cuál es realmente la forma más segura para que una aplicación de una sola página demuestre su identidad con una API?