Middleware chạy trước khi request tới route, ở tầng gần biên (Edge Runtime mặc định) — nghĩa là môi trường hạn chế, không phải Node đầy đủ.
Giới hạn thực tế:
- Không có nhiều Node API (fs, socket TCP thô), nên không kết nối trực tiếp DB theo cách thông thường; xác thực nặng phải gọi qua HTTP hoặc dùng driver hỗ trợ edge.
- Có ngân sách thời gian và kích thước bundle chặt; đặt logic nặng ở đây làm chậm mọi request.
- Không đọc được body dễ dàng, không render UI. Đầu ra chỉ là NextResponse.next() / redirect() / rewrite() cộng chỉnh header/cookie.
- Cần config.matcher để loại trừ asset tĩnh, nếu không nó chạy cho cả /_next/* và ảnh.
Không nên dùng làm lớp phân quyền duy nhất. CVE-2025-29927 là ví dụ trực tiếp: header nội bộ x-middleware-subrequest có thể bị giả mạo để bỏ qua middleware, khiến kiểm tra đăng nhập đặt ở đó bị vượt qua hoàn toàn.
Mô hình đúng: middleware làm lớp lọc thô, tối ưu trải nghiệm — redirect người chưa đăng nhập bằng cách kiểm tra sự tồn tại của cookie phiên, chọn locale, chia A/B. Việc xác thực và phân quyền thật phải nằm sát dữ liệu: kiểm tra session và quyền ngay trong Server Component, Server Action hoặc Route Handler trước khi đọc/ghi. Cùng một hàm requireUser() gọi ở mọi điểm truy cập dữ liệu.