Какую систему аутентификации и авторизации вы применяли в проекте?

«Какую систему аутентификации и авторизации вы применяли в проекте?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основным механизмом была аутентификация на основе JWT (JSON Web Tokens) с использованием Spring Security для авторизации.

Архитектурный выбор JWT:

  • Stateless: Сервер не хранит состояние сессии, что упрощает масштабирование.
  • Самоописываемость: Токен содержит claims (утверждения) с данными пользователя и ролями.
  • Микросервисы: Идеально подходит для распределенных систем, так как токен можно проверять на любом сервисе.

Ключевые этапы работы:

  1. Аутентификация: Пользователь логинится, сервер проверяет учетные данные и генерирует JWT.
  2. Хеширование паролей: Для хранения паролей использовался алгоритм bcrypt.
  3. Авторизация: Spring Security проверяет JWT и права доступа (роли) для защиты эндпоинтов.

Пример генерации и валидации JWT с использованием библиотеки jjwt:

// Генерация токена после успешного входа
String token = Jwts.builder()
    .setSubject(username) // Идентификатор пользователя
    .claim("roles", roles) // Список ролей пользователя
    .setExpiration(new Date(System.currentTimeMillis() + 86400000)) // Срок жизни 24 часа
    .signWith(SignatureAlgorithm.HS512, secretKey) // Подпись секретным ключом
    .compact();

// Валидация и извлечение данных из токена в фильтре
Claims claims = Jwts.parser()
    .setSigningKey(secretKey)
    .parseClaimsJws(token)
    .getBody();
String username = claims.getSubject();
List<String> roles = claims.get("roles", List.class);