Franco Seiler — Software StudioFranco Seiler — Software StudioBootcampYouTube
← Volver al blog

Por qué usé un patrón BFF para separar Next.js de mi backend

Cómo un Backend-for-Frontend mantiene los tokens fuera del navegador y deja que el frontend evolucione sin tocar la API. Con el ejemplo real de una plataforma de e-commerce.

Por Franco Seiler2 min de lecturaRead in English
Panel de administración de la plataforma de e-commerce

Cuando construí a.cer0, una plataforma de e-commerce a medida, tomé una decisión que a primera vista parece trabajo de más: el frontend en Next.js nunca habla directamente con el backend de Express. Todo pasa por una capa intermedia.

Ese patrón se llama Backend-for-Frontend (BFF), y resolvió tres problemas concretos.

El problema: los tokens no deberían vivir en el navegador

La forma habitual de autenticar una SPA es guardar el JWT en localStorage y adjuntarlo en cada request. Funciona, pero deja el token expuesto a cualquier script que corra en la página. Un solo paquete comprometido en tu árbol de dependencias puede leerlo.

Con un BFF, el token vive en una cookie httpOnly que el JavaScript del cliente no puede leer:

// El route handler de Next.js recibe la request del navegador,
// lee la cookie httpOnly y reenvía al backend real.
export async function POST(request: Request) {
  const token = (await cookies()).get('session')?.value;

  const response = await fetch(`${process.env.API_URL}/orders`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${token}`,
    },
    body: await request.text(),
  });

  return Response.json(await response.json(), { status: response.status });
}

El navegador nunca ve el token. Solo ve una cookie que no puede inspeccionar.

El segundo beneficio: la URL del backend queda privada

Sin BFF, la URL de tu API está en el bundle del cliente. Cualquiera la extrae y le pega directo, saltándose el rate limiting de tu frontend. Con el proxy, el backend puede vivir en una red privada y aceptar tráfico solo del BFF.

El tercero: el frontend deja de depender de la forma de la API

Este es el que más subestimé. Cuando el backend devuelve tres endpoints que el frontend necesita combinar, el BFF los combina del lado del servidor:

Sin BFF Con BFF
3 requests desde el navegador 1 request desde el navegador
Latencia sumada del cliente Latencia interna entre servidores
El cliente conoce la estructura de la API El cliente conoce solo su propia forma

En una conexión móvil lenta, esa diferencia es de cientos de milisegundos.

Lo que costó

No es gratis. El BFF agrega un salto de red y una capa más que mantener. Si tu API ya es pública y no manejás sesiones sensibles, probablemente no lo necesites.

Lo usaría de nuevo en cualquier proyecto con autenticación real y un backend propio. En un sitio estático o un consumo de API pública, es sobreingeniería.

Para cerrar

El patrón BFF no es una moda arquitectónica: es una respuesta concreta a que el navegador es un entorno hostil donde no podés guardar secretos. Si tu app maneja sesiones de usuario, vale la pena considerarlo antes de que sea difícil de retrofitear.

Recibí los artículos por mail

Un mail cuando publicamos algo nuevo. Sin spam, sin promociones, y te das de baja en un clic.

Por qué usé un patrón BFF para separar Next.js de mi backend | Franco Seiler