Jwt Spring

Тема дорожной карты · Spring Boot

JWT в Spring Security — стандартный паттерн для защиты бесстатусных Spring Boot REST API: JSON Web Token, подписанный HMAC-SHA256 или RSA, несёт идентификатор аутентифицированного пользователя и его права, устраняя необходимость в серверном хранилище сессий. Spring Security 6 (Spring Boot 3) реализует JWT через поддержку OAuth2 Resource Server: достаточно добавить spring-boot-starter-oauth2-resource-server и настроить spring.security.oauth2.resourceserver.jwt.jwk-set-uri или spring.security.oauth2.resourceserver.jwt.public-key-location, чтобы Spring Boot автоматически валидировал входящие JWT. Бин SecurityFilterChain включает валидацию JWT через .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())), а JwtAuthenticationConverter сопоставляет утверждения токена (как правило, roles или scope) с экземплярами GrantedAuthority, используемыми выражениями @PreAuthorize и hasAuthority(). Для выпуска JWT в собственном сервере авторизации библиотека nimbus-jose-jwt предоставляет классы JWTClaimsSet и SignedJWT, а сгенерированный токен возвращается login-эндпоинтом Spring Boot @RestController. JWT в Spring Security интегрируется с Spring Boot Actuator для метрик, Spring Cloud Gateway для ретрансляции токенов на уровне API и конфигурацией CSRF/CORS, поскольку API, защищённые JWT, по своей природе бесстатусны.

Как это работает

Jwt Spring (Spring Security 6.x): SecurityFilterChain (Java config заменяет старый WebSecurityConfigurerAdapter) конфигурирует HTTP security. AuthenticationManager + UserDetailsService для username/password. AuthorizationManager + method security (@PreAuthorize("hasRole('ADMIN')")) гейтят доступ. JWT через spring-security-oauth2-resource-server. OAuth 2.0 клиент + resource server для SSO. CSRF on для state-changing запросов; CORS конфигурируется per SecurityFilterChain. Самый часто misconfigured компонент Spring.

Когда применять

Не пишите свой auth — у Spring Security есть security-review, у вас нет. OAuth 2.0 / OIDC для SSO; resource server + JWT для stateless API. Валидируйте tokens централизованно (фильтр, не в каждом контроллере). @PreAuthorize-правила tight + audited. Отключайте CSRF только для stateless JWT API — не для browser sessions.

Типичные ошибки

Ловушки Jwt Spring: глобальное отключение CSRF, потому что "мешает" (security инцидент ждёт); валидируют JWT signature но не exp/iss/aud (просроченные/forged токены принимаются); используют deprecated WebSecurityConfigurerAdapter (Spring Security 6 удалил); хардкод role names без ROLE_ prefix не соответствует hasRole-семантике.

Связанные понятия

Полезные ресурсы