← Назад к вопросам

В чем разница между аутентификацией и авторизацией?

1.0 Junior🔥 242 комментариев
#Браузер и сетевые технологии

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Аутентификация vs Авторизация: полное объяснение

Эти два термина часто путают, но они обозначают совершенно разные процессы. Понимание различий критично для безопасности веб-приложений.

Аутентификация (Authentication)

Аутентификация — это процесс проверки личности пользователя. Ответ на вопрос: "Кто ты?"

Аутентификация = Доказательство того, что ты — это ты

Примеры аутентификации:

  1. Login/Password (Логин и пароль)
// Пользователь вводит
const credentials = {
  email: 'john@example.com',
  password: 'securePassword123'
};

// Сервер проверяет
const user = await User.findByEmail(credentials.email);
if (await bcrypt.compare(credentials.password, user.passwordHash)) {
  // Аутентификация успешна!
  return createToken(user);
}
  1. OAuth (Google, GitHub, Facebook login)
// Пользователь нажимает "Login with Google"
// Google проверяет личность
// Google возвращает токен
const googleToken = await getGoogleToken();
const user = await createOrUpdateUser(googleToken);
  1. Двухфакторная аутентификация (2FA)
// Этап 1: Логин/пароль
const user = await authenticatePassword(email, password);

// Этап 2: SMS код
const code = await sendSMSCode(user.phone);
const isValid = await verifySMSCode(code, user.phone);

if (isValid) {
  // Пользователь полностью аутентифицирован
  return createToken(user);
}
  1. Биометрия (отпечаток пальца, лицо)
const isAuthenticated = await verifyFingerprint(fingerprint);

Авторизация (Authorization)

Авторизация — это процесс определения прав доступа уже аутентифицированного пользователя. Ответ на вопрос: "Что ты можешь делать?"

Авторизация = Определение того, на что у тебя есть права

Примеры авторизации:

  1. Проверка ролей
// Пользователь уже аутентифицирован (имеет токен)
function deleteUser(req, res) {
  const user = req.user; // Это уже аутентифицированный пользователь
  
  // Авторизация: проверка прав
  if (user.role !== 'admin') {
    return res.status(403).send('Access Denied');
  }
  
  // Только админ может удалять пользователей
  await User.delete(req.params.id);
}
  1. Проверка прав доступа к ресурсу
// Может ли текущий пользователь редактировать этот пост?
function updatePost(req, res) {
  const userId = req.user.id; // Аутентифицирован
  const postId = req.params.id;
  
  const post = await Post.findById(postId);
  
  // Авторизация: проверка владельца
  if (post.authorId !== userId) {
    return res.status(403).send('You cannot edit this post');
  }
  
  // Пользователь имеет право редактировать
  await post.update(req.body);
}
  1. Проверка permissions (разрешений)
// Эти разрешения хранятся в БД
const permissions = {
  admin: ['read', 'create', 'update', 'delete'],
  editor: ['read', 'create', 'update'],
  viewer: ['read']
};

function canPerformAction(user, action) {
  // Авторизация: есть ли у пользователя это разрешение?
  return permissions[user.role]?.includes(action) || false;
}

if (!canPerformAction(req.user, 'delete')) {
  return res.status(403).send('Forbidden');
}

Визуальное различие

Сценарий: Вход в банк

Аутентификация:
├─ Показываешь паспорт
├─ Охранник проверяет
└─ "Окей, ты действительно Иван Петров"
   ✓ Тебя пускают внутрь

Авторизация (после входа):
├─ Подходишь к кассе
├─ Кассир проверяет твой счёт
└─ "Ты можешь снять деньги со своего счета"
   ✓ Кассир выдаёт деньги
   ✗ Но не может дать тебе доступ к банковским хранилищам
   ✗ И не может дать тебе доступ к чужим счетам

Практический пример в приложении

// Middleware для аутентификации
function authenticateUser(req, res, next) {
  const token = req.headers.authorization?.split(' ')[1];
  
  if (!token) {
    return res.status(401).send('Not authenticated'); // Нужна аутентификация
  }
  
  try {
    req.user = jwt.verify(token);
    next();
  } catch (error) {
    return res.status(401).send('Invalid token');
  }
}

// Middleware для авторизации
function requireAdmin(req, res, next) {
  // Предполагаем, что authenticateUser уже выполнен
  if (req.user.role !== 'admin') {
    return res.status(403).send('Forbidden'); // Не имеет доступа
  }
  next();
}

// Использование
app.delete('/users/:id',
  authenticateUser,  // Сначала проверяем: КТО ты?
  requireAdmin,      // Потом проверяем: ЧТО ты можешь делать?
  deleteUserHandler  // Затем выполняем действие
);

Коды ошибок HTTP

// 401 Unauthorized — аутентификация не пройдена
if (!req.user) {
  return res.status(401).send('Not authenticated');
}

// 403 Forbidden — авторизация не пройдена
if (req.user.role !== 'admin') {
  return res.status(403).send('Access forbidden');
}

Таблица сравнения

СвойствоАутентификацияАвторизация
ВопросКто ты?Что ты можешь делать?
ПроверяетЛичностьПрава доступа
КогдаПеред входомПосле входа
ПримерЛогин + парольПроверка ролей
HTTP код401 Unauthorized403 Forbidden
ДанныеУчетные данные (пароль)Токен + роль/разрешения

Типичный flow приложения

Пользователь заходит на сайт
        ↓
[АУТЕНТИФИКАЦИЯ] Вводит логин/пароль
        ↓
Сервер проверяет: "Верны ли учетные данные?"
        ↓
✓ ДА → Выдаём токен → Пользователь вошёл
        ↓
Пользователь открывает защищённую страницу
        ↓
[АВТОРИЗАЦИЯ] Отправляет токен
        ↓
Сервер проверяет: "Имеет ли право доступа?"
        ↓
✓ ДА (у него есть admin роль) → Показываем страницу
✗ НЕТ (у него роль viewer) → Ошибка 403

Фронтенд: как это выглядит

// React компонент
export function Dashboard() {
  const { user } = useAuth(); // Аутентифицированный пользователь
  
  // Аутентификация проверка
  if (!user) {
    return <Navigate to="/login" />; // Перенаправляем на логин
  }
  
  return (
    <div>
      <h1>Welcome, {user.name}</h1>
      
      {/* Авторизация проверка */}
      {user.role === 'admin' && (
        <AdminPanel />
      )}
      
      {/* Только владелец может редактировать */}
      {user.id === post.authorId && (
        <EditPostButton />
      )}
    </div>
  );
}

Реальный пример: GitHub

Аутентификация в GitHub:

  • Ты вводишь логин и пароль
  • GitHub проверяет, что это действительно ты
  • GitHub выдаёт токен доступа

Авторизация в GitHub:

  • Ты можешь видеть свои приватные репозитории (да)
  • Ты можешь видеть приватные репозитории друга (нет, нет прав)
  • Ты можешь удалить свой репозиторий (да)
  • Ты можешь удалить чужой репозиторий (нет, нет прав)

Итоговые правила

  1. Аутентификация = подтверждение личности ("Ты действительно John?")
  2. Авторизация = проверка прав ("Можешь ли ты удалить этот файл?")
  3. Порядок: аутентификация ВСЕГДА идёт перед авторизацией
  4. 401 ошибка — проблема с аутентификацией
  5. 403 ошибка — проблема с авторизацией
  6. Правило: не доверяй фронтенду! Авторизацию ВСЕГДА проверяй на сервере
В чем разница между аутентификацией и авторизацией? | PrepBro