Spring Security
В servlet-приложении Spring Security — цепочка filters перед DispatcherServlet. Она извлекает данные аутентификации, создаёт Authentication, сохраняет SecurityContext и проверяет доступ.
Аутентификация и авторизация
- аутентификация отвечает «кто это?»;
- авторизация отвечает «может ли он выполнить действие?»;
Principal/Authenticationпредставляет текущего субъекта;GrantedAuthority— право, используемое в проверках.
request
→ SecurityFilterChain
→ authentication filter
→ AuthenticationManager
→ AuthenticationProvider
→ SecurityContext
→ authorization
→ DispatcherServletСовременная конфигурация
@Bean
SecurityFilterChain apiSecurity(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/health").permitAll()
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults())
.build();
}Старый WebSecurityConfigurerAdapter и переопределение configure больше не являются основным подходом. См. Метод configure Spring Security.
Session и token
Cookie с session id и bearer token — разные способы перенести учётные данные. JWT не означает автоматическую отзывчивость, шифрование или безопасность: подпись подтверждает целостность, а срок, аудитория и issuer должны проверяться.
Для браузера важно учитывать CSRF. Если браузер автоматически прикладывает cookie, state-changing запрос нуждается в защите. Для stateless API с bearer token в Authorization, который клиент добавляет явно, модель риска иная.
Защита
- пароли хранить через PasswordEncoder;
- ограничивать доступ правилом deny-by-default;
- проверять права на уровне URL и метода там, где нужно;
- не логировать токены, пароль и session id;
- очищать security context между запросами;
- различать
401и403; - тестировать негативные сценарии.
Вопросы для повторения
- Где работает Spring Security MVC-приложения? В servlet filter chain до controller.
- Чем
401отличается от403?401— нет приемлемой аутентификации,403— субъект известен, но доступ запрещён. - JWT зашифрован? Обычно нет, содержимое base64url-кодировано и подписано.
- Когда нужен CSRF? Когда браузер автоматически отправляет учётные данные, например session cookie.
- Что хранит SecurityContext?
Authenticationтекущего выполнения.
Связано: Фильтры Filters слушатели Listeners и перехватчики Interceptors, Контроллеры Spring.