Чем отличается авторизация от аутентификации?
Чем отличается авторизация от аутентификации?
Аутентификация (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;
}
Методы аутентификации
- Логин и пароль — классический способ
- OAuth 2.0 — вход через Google, Facebook и т.д.
- JWT токены — токены с цифровой подписью
- Биометрия — отпечаток пальца, Face ID
- Двухфакторная аутентификация (2FA) — дополнительный код из SMS или приложения
- 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();
}
Модели авторизации
- Role-Based Access Control (RBAC) — на основе ролей (admin, user, moderator)
- Attribute-Based Access Control (ABAC) — на основе атрибутов пользователя
- Access Control Lists (ACL) — списки доступа для каждого ресурса
- Policy-Based Access Control (PBAC) — на основе политик безопасности
Ключевые различия
| Критерий | Аутентификация | Авторизация |
|---|---|---|
| Вопрос | "Кто вы?" | "Что вам можно?" |
| Цель | Проверить личность | Проверить права |
| Порядок | Первый шаг | Второй шаг |
| Данные | Логин, пароль, токен | Роли, права, политики |
| Результат | Вход выполнен / отклонен | Доступ разрешен / запрещен |
| HTTP статус | 401 Unauthorized | 403 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 с логином и паролем
- Разблокировка телефона по отпечатку пальца
- Подтверждение личности паспортом на границе
Авторизация
- Доступ к админ-панели только для администраторов
- Редактирование только своих постов в соцсети
- Просмотр приватных файлов только владельцем
Советы для собеседования
- Запомните порядок: сначала аутентификация, потом авторизация
- Различайте HTTP коды: 401 для аутентификации, 403 для авторизации
- Приводите примеры: JWT для аутентификации, RBAC для авторизации
- Понимайте связь: без аутентификации нет авторизации
- Знайте методы: OAuth, JWT, 2FA для аутентификации; RBAC, ACL для авторизации
Итог
- Аутентификация — проверка личности ("Кто вы?")
- Авторизация — проверка прав ("Что вам можно?")
- Аутентификация всегда происходит перед авторизацией
- 401 — ошибка аутентификации, 403 — ошибка авторизации
- Оба процесса критически важны для безопасности приложения