Ответ
Аутентификация (Authentication) — проверка личности пользователя ("кто ты?"). Авторизация (Authorization) — проверка прав доступа к ресурсам ("что тебе разрешено?").
Основные механизмы:
1. На основе токенов (Token-Based):
- JWT (JSON Web Token): Компактный самодостаточный токен в формате JSON. Содержит заголовок, полезную нагрузку (claims) и подпись.
// Пример создания JWT с библиотекой jjwt String token = Jwts.builder() .setSubject("user123") .claim("roles", "ROLE_ADMIN") .setExpiration(Date.from(Instant.now().plusSeconds(3600))) .signWith(SignatureAlgorithm.HS256, secretKey) .compact();Плюсы: Статус-лесс, масштабируемость. Минусы: Сложность отзыва до истечения срока.
2. Протоколы делегирования доступа:
- OAuth 2.0: Протокол авторизации, позволяющий приложению получать ограниченный доступ к данным пользователя в другом сервисе (например, "Войти через Google"). Основные потоки (grants): Authorization Code (для веб-приложений), Client Credentials (для сервис-сервисного взаимодействия), Resource Owner Password Credentials (устаревший).
- OpenID Connect (OIDC): Надстройка над OAuth 2.0 для аутентификации. Возвращает ID Token (JWT) с информацией о пользователе.
3. Фреймворки:
- Spring Security: Всеобъемлющий фреймворк для Java.
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authz -> authz .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() ) .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt); return http.build(); } }Аннотации:
@PreAuthorize("hasRole('ADMIN')"),@Secured("ROLE_USER").
4. Другие: Basic Auth (логин/пароль в заголовке, небезопасно без HTTPS), Session-Based Auth (stateful, сессия хранится на сервере).
Best Practice: Для REST API использовать JWT или OAuth 2.0 / OIDC. Никогда не хранить секретные ключи или пароли в клиентском коде.