Hack Frontend Community

Чем отличается авторизация от аутентификации?

Чем отличается авторизация от аутентификации?

Аутентификация (Authentication) и Авторизация (Authorization) — это два разных, но взаимосвязанных процесса обеспечения безопасности в веб-приложениях.


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

Аутентификация — это процесс проверки личности пользователя. Система определяет, кто вы есть.

Основные характеристики

  • Отвечает на вопрос: "Кто вы?"
  • Проверяет учетные данные (логин/пароль, токен, биометрия)
  • Происходит перед авторизацией
  • Результат: пользователь идентифицирован или нет

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

// Пример простой аутентификации
async function authenticate(email, password) {
  const response = await fetch('/api/auth/login', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ email, password })
  });
  
  if (response.ok) {
    const { token } = await response.json();
    // Сохраняем токен для последующих запросов
    localStorage.setItem('authToken', token);
    return true;
  }
  
  return false;
}

Методы аутентификации

  1. Логин и пароль — классический способ
  2. OAuth 2.0 — вход через Google, Facebook и т.д.
  3. JWT токены — токены с цифровой подписью
  4. Биометрия — отпечаток пальца, Face ID
  5. Двухфакторная аутентификация (2FA) — дополнительный код из SMS или приложения
  6. Magic links — ссылка для входа по email

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

Авторизация — это процесс проверки прав доступа. Система определяет, что вам разрешено делать.

Основные характеристики

  • Отвечает на вопрос: "Что вам разрешено делать?"
  • Проверяет права и роли пользователя
  • Происходит после аутентификации
  • Результат: доступ разрешен или запрещен

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

// Пример проверки прав доступа
function checkAuthorization(user, resource, action) {
  // Проверяем роль пользователя
  if (action === 'delete' && user.role !== 'admin') {
    throw new Error('Недостаточно прав для удаления');
  }
  
  // Проверяем владение ресурсом
  if (action === 'edit' && resource.ownerId !== user.id) {
    throw new Error('Вы можете редактировать только свои ресурсы');
  }
  
  return true;
}

// Middleware для защиты роутов
function requireAdmin(req, res, next) {
  if (req.user?.role !== 'admin') {
    return res.status(403).json({ error: 'Доступ запрещен' });
  }
  next();
}

Модели авторизации

  1. Role-Based Access Control (RBAC) — на основе ролей (admin, user, moderator)
  2. Attribute-Based Access Control (ABAC) — на основе атрибутов пользователя
  3. Access Control Lists (ACL) — списки доступа для каждого ресурса
  4. Policy-Based Access Control (PBAC) — на основе политик безопасности

Ключевые различия

КритерийАутентификацияАвторизация
Вопрос"Кто вы?""Что вам можно?"
ЦельПроверить личностьПроверить права
ПорядокПервый шагВторой шаг
ДанныеЛогин, пароль, токенРоли, права, политики
РезультатВход выполнен / отклоненДоступ разрешен / запрещен
HTTP статус401 Unauthorized403 Forbidden
ПримерВход в системуДоступ к админ-панели

Практический пример

// 1. АУТЕНТИФИКАЦИЯ — проверяем, кто пользователь
app.post('/api/auth/login', async (req, res) => {
  const { email, password } = req.body;
  
  const user = await User.findOne({ email });
  if (!user || !await user.comparePassword(password)) {
    return res.status(401).json({ error: 'Неверные учетные данные' });
  }
  
  const token = generateJWT(user);
  res.json({ token, user: { id: user.id, role: user.role } });
});

// 2. АВТОРИЗАЦИЯ — проверяем права доступа
app.delete('/api/posts/:id', authenticateToken, async (req, res) => {
  const post = await Post.findById(req.params.id);
  
  // Проверяем права: только автор или админ может удалить
  if (post.authorId !== req.user.id && req.user.role !== 'admin') {
    return res.status(403).json({ error: 'Недостаточно прав' });
  }
  
  await post.delete();
  res.json({ success: true });
});

// Middleware для аутентификации
function authenticateToken(req, res, next) {
  const token = req.headers.authorization?.split(' ')[1];
  
  if (!token) {
    return res.status(401).json({ error: 'Требуется аутентификация' });
  }
  
  try {
    req.user = verifyJWT(token);
    next();
  } catch (error) {
    return res.status(401).json({ error: 'Недействительный токен' });
  }
}

Связь процессов

┌─────────────────┐
│  Пользователь   │
└────────┬────────┘
┌─────────────────────────┐
│   1. АУТЕНТИФИКАЦИЯ     │
│   "Кто вы?"             │
│   Логин + Пароль        │
└────────┬────────────────┘
    ✓ Успешно
┌─────────────────────────┐
│   2. АВТОРИЗАЦИЯ        │
│   "Что вам можно?"      │
│   Проверка прав         │
└────────┬────────────────┘
    ✓ Доступ разрешен
┌─────────────────────────┐
│   Доступ к ресурсу      │
└─────────────────────────┘

HTTP коды ошибок

401 Unauthorized — ошибка аутентификации

  • Пользователь не аутентифицирован
  • Токен отсутствует или недействителен
  • Неверные учетные данные
// Пример 401
res.status(401).json({ error: 'Требуется вход в систему' });

403 Forbidden — ошибка авторизации

  • Пользователь аутентифицирован, но не имеет прав
  • Недостаточно прав для выполнения действия
// Пример 403
res.status(403).json({ error: 'Доступ запрещен' });

Примеры из реальной жизни

Аутентификация

  • Вход в аккаунт Gmail с логином и паролем
  • Разблокировка телефона по отпечатку пальца
  • Подтверждение личности паспортом на границе

Авторизация

  • Доступ к админ-панели только для администраторов
  • Редактирование только своих постов в соцсети
  • Просмотр приватных файлов только владельцем

Советы для собеседования

  1. Запомните порядок: сначала аутентификация, потом авторизация
  2. Различайте HTTP коды: 401 для аутентификации, 403 для авторизации
  3. Приводите примеры: JWT для аутентификации, RBAC для авторизации
  4. Понимайте связь: без аутентификации нет авторизации
  5. Знайте методы: OAuth, JWT, 2FA для аутентификации; RBAC, ACL для авторизации

Итог

  • Аутентификация — проверка личности ("Кто вы?")
  • Авторизация — проверка прав ("Что вам можно?")
  • Аутентификация всегда происходит перед авторизацией
  • 401 — ошибка аутентификации, 403 — ошибка авторизации
  • Оба процесса критически важны для безопасности приложения