Я тричі провалив налаштування Matcher у Next.js Auth
Я зламав три проєкти, перш ніж зрозумів, як працює proxy.ts у Next.js 16.
Помилка була «тихою». Жодних логів. Жодних попереджень. Жодних помилок. Лише зламані редиректи та дірки в безпеці.
Якщо ви оновлюєтеся до Next.js 16, не варто просто запустити codemod і забути про все. Вам потрібно перевірити ці три речі.
Пастка міграції
Next.js перейменував middleware.ts на proxy.ts. І це не просто зміна назви.
- middleware.ts працював на Edge runtime. Він мав обмежену підтримку crypto.
- proxy.ts за замовчуванням працює на Node.js runtime. Він має повну підтримку crypto.
Якщо ви оновлюєте пакет вручну без використання codemod, ваш старий файл middleware.ts може залишитися. Він успішно скомпілюється. Він пройде перевірки TypeScript. Але він нічого не робитиме. Ваші маршрути не будуть перехоплюватися. Ваші редиректи не спрацюють.
Перевірте ці три речі вручну:
- proxy.ts має бути у корені вашого проєкту.
- Експортована функція повинна називатися proxy.
- middleware.ts має бути видалений.
Прогалина в Matcher
Matcher — це місце, де найчастіше виникають помилки в налаштуваннях автентифікації.
Якщо ваш matcher занадто широкий, proxy запускається для кожного CSS-файлу та зображення. Це спричиняє нескінченні цикли редиректів.
Якщо ваш matcher занадто вузький, ви створюєте дірку в безпеці.
Якщо маршрут не входить до вашого matcher, proxy ніколи не запуститься. Користувач може надіслати власні заголовки (headers) до цього маршруту. Якщо ваш Server Component довіряє цим заголовкам, зловмисник зможе видати себе за будь-кого.
Вирішення: не довіряйте заголовкам
Я засвоїв це на власному гіркому досвіді: не покладайтеся лише на заголовки, які передає proxy.
Використовуйте двошаровий підхід:
- Proxy діє як швидкий шлюз на межі мережі.
- Server Component перевіряє JWT безпосередньо з cookie під час рендерингу.
Ця друга перевірка закриває прогалину. Навіть якщо matcher пропустить маршрут, Server Component виявить неавторизованого користувача. Це додає кілька мілісекунд затримки, але запобігає масштабній проблемі з безпекою.
Підсумковий чекліст:
- Використовуйте proxy.ts для автентифікації.
- Використовуйте Node.js runtime для повної підтримки crypto.
- Встановлюйте заголовки в запиті (request), а не у відповіді (response).
- Завжди перевіряйте JWT всередині Server Components.