Gymterview
middle

Какие способы аутентификации используются в REST API?

Аутентификация в REST API — процесс проверки личности клиента, выполняемый при каждом запросе в силу stateless-природы REST.

1. Basic Authentication

Логин и пароль передаются в заголовке Authorization в кодировке Base64.

Пример
GET /api/users HTTP/1.1
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
  • Простота реализации.
  • Обязательно использовать только по HTTPS.
  • Учётные данные передаются при каждом запросе.
  • Не рекомендуется для публичных API.

2. Token-based (Bearer Token / JWT)

Клиент получает токен при аутентификации и использует его в последующих запросах.

Пример
POST /api/auth/login
{"username": "user", "password": "pass"}

Ответ:
{"accessToken": "eyJhbGciOiJIUzI1NiJ9...", "refreshToken": "..."}
Пример
GET /api/users HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

JWT (JSON Web Token) состоит из трёх частей: Header.Payload.Signature.

Пример
Header:    {"alg": "HS256", "typ": "JWT"}
Payload:   {"sub": "42", "name": "Иван", "role": "ADMIN", "exp": 1700000000}
Signature: HMACSHA256(base64(header) + "." + base64(payload), secret)

Преимущества JWT: stateless (сервер не хранит сессии), содержит информацию о пользователе (claims), легко масштабируется.

3. API Key

Ключ передаётся в заголовке или query-параметре.

Пример
GET /api/users HTTP/1.1
X-API-Key: abcdef123456

Используется для межсервисного взаимодействия и публичных API с ограниченным доступом.

4. OAuth 2.0

Протокол авторизации, позволяющий приложению получить ограниченный доступ к ресурсам пользователя без передачи его учётных данных. Подробнее см. следующий вопрос.

Пример конфигурации Spring Security для JWT
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
            .csrf(csrf -> csrf.disable())
            .sessionManagement(session ->
                session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/auth/**").permitAll()
                .requestMatchers("/api/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated())
            .addFilterBefore(jwtAuthenticationFilter(),
                             UsernamePasswordAuthenticationFilter.class)
            .build();
    }
}

На собеседовании: нужно знать все четыре способа и понимать, когда какой использовать. Частая ошибка — не упомянуть, что JWT — stateless, а Basic Auth обязателен только по HTTPS.