Я трижды умудрился испортить свой Next.js Auth Matcher
Я сломал три проекта, прежде чем понял, как работает 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 никогда не запустится. Пользователь сможет отправить свои собственные заголовки на этот маршрут. Если ваш Server Component доверяет этим заголовкам, злоумышленник сможет выдать себя за кого угодно.
Решение: не доверяйте заголовкам
Я усвоил это на собственном горьком опыте: не полагайтесь исключительно на заголовки, передаваемые через proxy.
Используйте двухслойный подход:
- Proxy выступает в роли быстрого шлюза на границе сети.
- Server Component проверяет JWT напрямую из cookie во время рендеринга.
Эта вторая проверка закрывает брешь. Даже если matcher пропустит маршрут, Server Component обнаружит неавторизованного пользователя. Это добавит несколько миллисекунд задержки, но предотвратит серьезную проблему с безопасностью.
Итоговый чек-лист:
- Используйте proxy.ts для аутентификации.
- Используйте Node.js runtime для полной поддержки crypto.
- Устанавливайте заголовки в request, а не в response.
- Всегда проверяйте JWT внутри Server Components.