Как Spring Security обнаруживает и извлекает JWT-токен из HTTP-запроса?

«Как Spring Security обнаруживает и извлекает JWT-токен из HTTP-запроса?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring Security извлекает JWT (JSON Web Token) с помощью специального фильтра, который проверяет стандартные места в HTTP-запросе. Чаще всего для этого используется BearerTokenAuthenticationFilter или его кастомная реализация.

Стандартный процесс извлечения:

  1. Фильтр ищет токен в заголовке Authorization по схеме Bearer:
    Authorization: Bearer <your_jwt_token>
  2. Если токен не найден в заголовке, фильтр может проверить параметр запроса (например, ?token=<value>), хотя это менее безопасно.

Пример настройки с использованием Spring Security OAuth2 Resource Server (рекомендуемый способ):

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); // Включает JWT-обработку
        return http.build();
    }
}

Как это работает внутри? Конфигурация jwt() автоматически регистрирует JwtAuthenticationProvider и фильтр, который:

  • Извлекает токен из заголовка Authorization.
  • Валидирует его подпись и срок действия.
  • Создает объект JwtAuthenticationToken и помещает его в SecurityContextHolder.

Почему Bearer-схема? Это стандарт (RFC 6750), который четко отделяет тип токена и позволяет серверу его корректно интерпретировать.