Ответ
Стандартный механизм включает аутентификацию (проверку личности) и последующую авторизацию (проверку прав).
Типичный flow на основе сессий или JWT:
- Логин: Пользователь отправляет
POST /loginс учетными данными (логин/пароль). - Верификация: Сервер хэширует пароль, сравнивает с хэшем из БД.
- Создание токена/сессии:
- Сессии: Сервер создает запись сессии в хранилище (Redis, БД) и отправляет ее ID в cookie (
sessionId). - JWT: Сервер генерирует подписанный токен (содержащий payload, например,
userId), который клиент хранит (часто вlocalStorage).
- Сессии: Сервер создает запись сессии в хранилище (Redis, БД) и отправляет ее ID в cookie (
- Доступ к защищенным ресурсам: Клиент отправляет токен (в заголовке
Authorization: Bearer <token>) или cookie с каждым запросом. Сервер проверяет его валидность и права пользователя.
Пример кода (Node.js/Express + JWT):
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
app.post('/login', async (req, res) => {
const { email, password } = req.body;
const user = await db.User.findOne({ where: { email } });
// 1. Проверяем, существует ли пользователь и совпадает ли пароль
if (!user || !(await bcrypt.compare(password, user.passwordHash))) {
return res.status(401).json({ error: 'Invalid credentials' });
}
// 2. Генерируем JWT-токен
const token = jwt.sign(
{ userId: user.id, role: user.role }, // payload
process.env.JWT_SECRET, // секретный ключ
{ expiresIn: '1h' } // срок жизни
);
// 3. Отправляем токен клиенту
res.json({ token });
});
// Middleware для проверки токена
const authenticate = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.sendStatus(401);
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded; // Добавляем данные пользователя в запрос
next();
} catch (err) {
return res.status(403).json({ error: 'Invalid or expired token' });
}
};
Критические аспекты для безопасности:
- HTTPS для шифрования трафика.
- Хэширование паролей с солью (bcrypt, scrypt).
- Защита от брутфорса (rate limiting).
- Для JWT — использование короткого времени жизни и secure-флагов для cookies.
- Защита от XSS (кража токена) и CSRF (для сессий).