Аутентификация и база данных: обзор

Обзорно понимаем, куда в Next.js встраиваются логин и база данных, без привязки к конкретной библиотеке.

В Next.js доступ к базе данных и проверка аутентификации живут на сервере — в серверных компонентах, Server Actions и Route Handlers, где секреты и сессии не утекают в браузер.

Подключение базы данных

Строка подключения — это секрет, поэтому она в .env (без NEXT_PUBLIC_), а сам клиент БД создаётся в lib/ и используется только в серверном коде:

// lib/db.ts — выполняется только на сервере
import { connect } from "some-db-client";

export const db = connect(process.env.DATABASE_URL);

Запрос к БД делают в серверном компоненте (для чтения) или в Server Action (для записи). Популярные инструменты доступа к данным — Prisma и Drizzle; конкретный выбор — за пределами этого обзора.

Как устроена аутентификация

Логин в вебе обычно строится так:

ШагГде в Next.js
Пользователь вводит логин/парольФорма + Server Action
Сервер проверяет и создаёт сессиюServer Action / Route Handler
Сессия хранится в cookieHTTP-only cookie (недоступна JS)
Следующие запросы читают cookieСерверный компонент / middleware

Ключевая идея: проверка «кто это» делается на сервере, а признак сессии лежит в HTTP-only cookie, которую нельзя прочитать из браузерного JS — это защита от кражи токена.

Middleware для защиты маршрутов

Файл middleware.ts в корне выполняется до рендера и может, например, перенаправить неавторизованного пользователя на страницу входа. Логику решения смоделируем на JS:

function guard(path, isLoggedIn) {
  const protectedPaths = ["/dashboard", "/settings"];
  if (protectedPaths.some((p) => path.startsWith(p)) && !isLoggedIn) {
    return "redirect:/login";
  }
  return "allow";
}

console.log(guard("/dashboard", false));
console.log(guard("/dashboard", true));
console.log(guard("/blog", false));

Вывод:

redirect:/login
allow
allow

Готовые решения

Писать аутентификацию с нуля рискованно. На практике берут проверенные библиотеки (например, Auth.js / NextAuth, или внешние сервисы вроде Clerk), которые закрывают сессии, OAuth и хранение паролей. Этот курс лишь обозначает, куда они встраиваются.

Итог

  • Доступ к БД и проверка логина — только на сервере; строка подключения — секрет в .env.
  • Сессию хранят в HTTP-only cookie, недоступной браузерному JavaScript.
  • middleware.ts защищает маршруты до рендера; аутентификацию берут из проверенных библиотек.
Проверьте себя
1. Где в Next.js должен выполняться доступ к базе данных?
AВ клиентском компоненте с 'use client'
BТолько на сервере: в серверных компонентах, Server Actions, Route Handlers
CВ браузере через fetch к БД напрямую
DВ next.config.js
2. Почему сессию хранят в HTTP-only cookie?
AТак быстрее загружается страница
BТакую cookie нельзя прочитать из браузерного JavaScript, что защищает токен от кражи
CЭто требование CSS
DЧтобы cookie была видна в localStorage
3. Что удобно делать в файле middleware.ts?
AХранить компоненты
BПроверять доступ и перенаправлять неавторизованных пользователей до рендера
CСтилизовать страницы
DОптимизировать картинки
Поддержать проект