Какие способы аутентификации используются в 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.