← Todos los artículos

Por qué el navegador nunca habla con nuestra API

En las aplicaciones que construimos, el navegador no guarda ningún token legible y nunca llama directamente a la API. Así funciona y esto es lo que cuesta.

Cuando inicias sesión en el portal de clientes de este sitio, tu navegador nunca recibe un token de acceso que pueda leer, y nunca llama directamente a nuestra API. Todas las peticiones pasan primero por el servidor web. Así construimos la mayoría de portales de cliente y paneles, y este es el motivo.

El planteamiento habitual y su problema

Una forma común de construir una aplicación web es una SPA que llama a una API JSON desde el navegador. La aplicación tiene que guardar un token en algún sitio a su alcance, lo que significa que cualquier script que se ejecute en la página también lo tiene a su alcance. Basta una dependencia vulnerable o un script inyectado para llevarse la sesión.

Lo que hacemos nosotros

El sitio web tiene una parte de servidor, y ese servidor es el único cliente de la API. A este patrón se le suele llamar backend for frontend.

  • La sesión vive en dos cookies marcadas como HttpOnly, así que el JavaScript de la página no puede leerlas. En producción además son Secure.
  • El token de acceso dura 15 minutos. Un segundo token, de mayor duración, lo renueva, y se sustituye cada vez que se usa.
  • Si un token de renovación antiguo vuelve a aparecer, lo tratamos como robado y cerramos todas las sesiones que descienden de él.
  • Las páginas se generan en el servidor con los datos ya incluidos. Los formularios se envían al servidor, que valida los datos y después llama a la API.

La API sigue comprobando cada petición: quién llama, qué rol tiene y con qué frecuencia lo hace.

Lo que cuesta

Hay un salto más entre el navegador y los datos, y el servidor web tiene que estar en marcha para que algo funcione. Los límites de peticiones también requieren cuidado: la API ve al servidor web, no al visitante, así que el servidor web le pasa la dirección del visitante y la API limita por ella.

Para una aplicación que maneja datos de clientes, es un precio que pagamos con gusto. El navegador no guarda nada que merezca la pena robar, la API no tiene superficie entre orígenes que defender, y las páginas de contenido siguen funcionando con JavaScript desactivado.