Я совершил три дорогостоящие ошибки в аутентификации с Next.js 16
Я напортачил с матчером proxy.ts в трех разных проектах.
Самое худшее? Никаких ошибок. Никаких предупреждений. Никаких логов. Все выглядело идеально, пока не обнаружились дыры в безопасности.
В Next.js 16 middleware.ts изменился на proxy.ts. Это не просто смена названия. Это фундаментальный сдвиг в том, как вы обрабатываете запросы.
Вот что вам нужно знать, чтобы не сломать аутентификацию.
Новые правила Middleware вызывал путаницу. Разработчики использовали его для вызовов базы данных и тяжелой логики. Это не его задача.
Прокси находится на границе сети. Он перехватывает запросы до того, как они достигнут ваших роутов.
- Он по умолчанию работает на Node.js, а не на Edge runtime.
- Вы получаете полную поддержку crypto.
- Вы можете использовать любую стандартную JWT-библиотеку без костылей.
Тихий сбой
Если вы обновите Next.js, не используя codemod, ваш старый файл middleware.ts может остаться в проекте. Он пройдет проверки TypeScript. Он успешно скомпилируется.
Но он ничего не будет делать.
Ваши редиректы не сработают. Аутентификация не запустится. Ваше приложение просто молча обойдет слой безопасности.
Проверьте эти три вещи вручную:
- Убедитесь, что
proxy.tsнаходится в корне вашего проекта. - Убедитесь, что экспортируемая функция называется
proxy, а неmiddleware. - Полностью удалите старый файл
middleware.ts.
Ловушка матчера Большинство настроек аутентификации ломаются в конфигурации матчера. Если вы не исключите статические файлы, прокси будет запускаться для каждого CSS и JS файла. Это создает бесконечные циклы редиректов для ассетов.
Используйте negative lookahead, чтобы исключить:
- _next/static
- _next/image
- фавиконы и sitemaps
- расширения изображений (png, jpg, svg)
Внимание: не доверяйте только заголовкам Именно на этом я погорел.
Прокси устанавливает такие заголовки, как x-user-id, в запросе. Ваши Server Components читают их через headers().
Если в вашем матчере есть пробел, пользователь может отправить свой собственный заголовок x-user-id. Server Component не сможет отличить заголовок, установленный прокси, от заголовка, отправленного клиентом.
Злоумышленник может подменить ID пользователя на маршруте, не попавшем под действие матчера. Он может не увидеть данные, но сможет получить права доступа, которых у него быть не должно.
Решение: Прокси — это ваши быстрые ворота. Он берет на себя основную нагрузку на edge.
Но вы должны повторно проверить JWT внутри ваших Server Components.
- Прокси быстро блокирует большинство злоумышленников.
- Проверка серверного компонента устраняет брешь, если матчер дает сбой.
Избыточность — это безопасность.