Каков типовой flow обработки запроса на endpoint аутентификации (login)?

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

Ответ

Типовой flow обработки POST-запроса на /login включает следующие шаги:

  1. Валидация входных данных: Проверка формата и обязательных полей (username, password).
  2. Аутентификация: Сверка учётных данных с хранилищем (БД, LDAP, etc.).
    • В Spring Security это делает AuthenticationManager и UserDetailsService.
  3. Генерация токена доступа: Создание сессии или JWT-токена для аутентифицированного пользователя.
  4. Формирование ответа: Возврат токена и, опционально, основных данных пользователя клиенту.

Пример реализации на Spring Security с JWT:

@PostMapping("/login")
public ResponseEntity<AuthResponse> login(@Valid @RequestBody LoginRequest request) {
    // 1. Аутентификация
    Authentication authentication = authenticationManager.authenticate(
        new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())
    );
    SecurityContextHolder.getContext().setAuthentication(authentication);

    // 2. Генерация JWT
    String jwt = jwtUtils.generateJwtToken(authentication);
    UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal();

    // 3. Ответ
    return ResponseEntity.ok(new AuthResponse(
        jwt,
        userDetails.getId(),
        userDetails.getUsername(),
        userDetails.getEmail()
    ));
}

Дополнительные меры безопасности:

  • Логирование попыток входа (успешных и неудачных).
  • Rate Limiting для предотвращения брутфорса.
  • Установка secure флагов (HttpOnly, Secure) для токенов в cookies.