Опишите базовый механизм авторизации пользователя на веб-сайте

«Опишите базовый механизм авторизации пользователя на веб-сайте» — вопрос из категории Веб-тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Стандартный механизм включает аутентификацию (проверку личности) и последующую авторизацию (проверку прав).

Типичный flow на основе сессий или JWT:

  1. Логин: Пользователь отправляет POST /login с учетными данными (логин/пароль).
  2. Верификация: Сервер хэширует пароль, сравнивает с хэшем из БД.
  3. Создание токена/сессии:
    • Сессии: Сервер создает запись сессии в хранилище (Redis, БД) и отправляет ее ID в cookie (sessionId).
    • JWT: Сервер генерирует подписанный токен (содержащий payload, например, userId), который клиент хранит (часто в localStorage).
  4. Доступ к защищенным ресурсам: Клиент отправляет токен (в заголовке 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 (для сессий).