BookinglyTech News
Infraestructura

Middleware de Next.js no es el lugar ideal para la autenticación basada en base de datos

La práctica de consultar la base de datos en cada ejecución de middleware en Next.js crea cuellos de botella y aumenta la latencia, según un análisis reciente.

2 min de lecturaDev.to0 vistas

El ecosistema de Next.js sigue promoviendo el concepto de "Edge Everything" por su latencia global reducida y experiencia de desarrollo fluida. Sin embargo, la práctica de realizar comprobaciones de autenticación basadas en base de datos directamente dentro del middleware de Edge se ha convertido en un asesino silencioso de rendimiento.

Limitaciones del Runtime Edge

El runtime Edge de Next.js se ejecuta en V8 isolates y no soporta módulos nativos de Node.js como net, tls y fs. Los drivers tradicionales de bases de datos, como pg para PostgreSQL o el motor binario de Prisma, dependen de sockets TCP y no funcionan en este entorno. Los desarrolladores suelen recurrir a soluciones HTTP, como APIs de datos o proxies REST, que añaden latencia y sobrecarga.

Frecuencia de ejecución

El middleware se dispara en cada solicitud coincidente: navegación de página, fetch de componentes del servidor, revalidaciones en segundo plano y peticiones de activos estáticos (si el matcher no se configura correctamente). Un clic de usuario puede generar una cadena de peticiones, y si cada una ejecuta una consulta de base de datos, el resultado es una auto‑DDoS en la propia base de datos, con agotamiento de conexiones y latencia creciente.

Arquitectura de dos capas

Para preservar seguridad y rendimiento, adopta una estrategia de dos capas:

1. Guardia Edge

Utiliza el middleware únicamente para tareas ligeras compatibles con Edge. La verificación de tokens de sesión se puede hacer con la librería jose, que aprovecha la Web Crypto API. Así se valida la firma JWT sin llamar a la base de datos.

// middleware.js
import { jwtVerify } from 'jose';

export async function middleware(request) {
  const token = request.cookies.get('session')?.value;
  if (token) {
    try {
      await jwtVerify(token, new TextEncoder().encode(process.env.JWT_SECRET));
      return NextResponse.next();
    } catch { }
  }
  return NextResponse.redirect(new URL('/login', request.url));
}

export const config = {
  matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
};

2. Lifter Node.js

Las comprobaciones de autorización granular—verificación de roles, revocación de sesión, obtención de perfil—se delegan a componentes del servidor, manejadores de ruta o acciones del servidor. En este entorno, puedes usar pg‑pool o ORMs robustos sin restricciones del runtime Edge.

Conclusión

Mantener el middleware ligero y delegar las operaciones intensivas de estado al backend garantiza que la aplicación siga siendo escalable y segura. Al evitar consultas de base de datos en el borde, se previene la sobrecarga y se mantiene la latencia bajo control.

Revisa la publicación original en dev.to