Tôi đã làm hỏng Matcher Auth trong Next.js tới ba lần
Tôi đã làm hỏng ba dự án trước khi hiểu được cách proxy.ts hoạt động trong Next.js 16.
Lỗi xảy ra một cách âm thầm. Không có log. Không có cảnh báo. Không có lỗi. Chỉ có các lệnh redirect bị hỏng và các lỗ hổng bảo mật.
Nếu bạn đang nâng cấp lên Next.js 16, đừng chỉ chạy codemod rồi bỏ mặc. Bạn cần phải kiểm tra ba điều sau đây.
Cạm bẫy khi di chuyển (The Migration Trap)
Next.js đã đổi tên middleware.ts thành proxy.ts. Đây không chỉ đơn thuần là thay đổi tên gọi.
middleware.tschạy trên Edge runtime. Nó có hỗ trợ crypto hạn chế.proxy.tschạy trên Node.js runtime theo mặc định. Nó có hỗ trợ crypto đầy đủ.
Nếu bạn cập nhật package thủ công mà không dùng codemod, file middleware.ts cũ của bạn có thể vẫn còn tồn tại. Nó sẽ biên dịch bình thường. Nó sẽ vượt qua các kiểm tra TypeScript. Nhưng nó sẽ không làm gì cả. Các route của bạn sẽ không bị chặn lại. Các lệnh redirect của bạn sẽ không hoạt động.
Kiểm tra thủ công ba điều sau:
proxy.tsphải tồn tại ở thư mục gốc của dự án.- Hàm được export phải có tên là
proxy. middleware.tsphải được xóa bỏ.
Lỗ hổng Matcher (The Matcher Gap)
Matcher là nơi các thiết lập auth thường xuyên thất bại nhất.
Nếu matcher của bạn quá rộng, proxy sẽ chạy trên mọi file CSS và hình ảnh. Điều này gây ra các vòng lặp redirect vô tận.
Nếu matcher của bạn quá hẹp, bạn sẽ tạo ra một lỗ hổng bảo mật.
Nếu một route không nằm trong matcher, proxy sẽ không bao giờ chạy. Người dùng có thể gửi các header riêng của họ đến route đó. Nếu Server Component của bạn tin tưởng các header đó, kẻ tấn công có thể giả mạo bất kỳ ai.
Giải pháp: Đừng tin tưởng vào Headers
Tôi đã học được một bài học xương máu: đừng chỉ dựa dẫm vào các header được chuyển tiếp bởi proxy.
Sử dụng phương pháp tiếp cận hai lớp:
- Proxy đóng vai trò như một cổng kiểm soát nhanh tại ranh giới mạng.
- Server Component xác thực JWT trực tiếp từ cookie tại thời điểm render.
Bước kiểm tra thứ hai này sẽ lấp đầy lỗ hổng. Ngay cả khi matcher bỏ sót một route, Server Component sẽ phát hiện ra người dùng không hợp lệ. Nó có thể làm tăng thêm vài mili giây độ trễ nhưng sẽ ngăn chặn một lỗi bảo mật nghiêm trọng.
Danh sách kiểm tra tóm tắt:
- Sử dụng
proxy.tscho auth. - Sử dụng Node.js runtime để có hỗ trợ crypto đầy đủ.
- Thiết lập header trên request, không phải trên response.
- Luôn luôn xác thực JWT bên trong các Server Components.