🔐 Что это
Этот skill — сборник лучших практик безопасности для Java-сервисов на Spring Boot. Он охватывает все ключевые аспекты: аутентификацию (JWT, OAuth2, session-based), авторизацию на уровне методов, валидацию входных данных, защиту от CSRF, XSS и SQL-инъекций, управление секретами, настройку CORS, rate limiting, безопасность зависимостей и логирование. Skill предназначен для разработчиков, которые хотят внедрить или проверить защиту в своих Spring Boot-приложениях.
⚙️ Как работает
Skill описывает практики в виде конкретных примеров кода и рекомендаций, которые можно сразу применить в проекте.
🔑 Аутентификация
- Stateless JWT: рекомендуется использовать фильтр
OncePerRequestFilter для извлечения и валидации токена. Skill показывает пример JwtAuthFilter, который проверяет заголовок Authorization со схемой Bearer, парсит токен через JwtService и устанавливает аутентификацию в SecurityContextHolder.
- Session-based: для сессий следует применять httpOnly, Secure, SameSite=Strict cookie, чтобы защитить их от межсайтовых атак.
- Opaque tokens: поддерживаются через настройку Spring Security Resource Server.
🛡️ Авторизация
- Включается аннотацией
@EnableMethodSecurity в конфигурации.
- Для защиты endpoint'ов используется
@PreAuthorize с SpEL-выражениями. Skill приводит пример controlle'ра для администраторов, где метод listUsers доступен только роли ADMIN, а deleteUser — только владельцу ресурса (через метод бина #authz.isOwner).
- Принцип: запрещено всё по умолчанию, разрешение даётся только под конкретные роли или условия.
✅ Валидация входных данных
- На уровне DTO используются Bean Validation-аннотации (
@NotBlank, @Email, @Size, @Min, @Max).
- В контроллере DTO помечается
@Valid, чтобы Spring автоматически проверял данные перед выполнением метода.
- Для защиты от XSS skill рекомендует очищать HTML через whitelist-проверки перед отображением.
- Пример: плохой вариант — метод
createUser без валидации; хороший — record CreateUserDto с ограничениями и use ResponseEntity.
🗄️ Защита от SQL-инъекций
- Главное правило — никогда не конкатенировать строки в SQL. Вместо этого использовать:
- Spring Data JPA derived query methods (безопасны автоматически).
- @Query с параметрами:
:name для named параметров.
- Skill показывает плохой пример с конкатенацией и правильный — с параметризованным запросом.
🔒 Хранение паролей
- Пароли должны хэшироваться с помощью BCrypt (рекомендуется
BCryptPasswordEncoder с cost-фактором 12) или Argon2.
- Вместо ручного шифрования используется бин
PasswordEncoder, который инжектится в сервисы.
- Пример:
passwordEncoder.encode(...) при регистрации пользователя.
🧩 CSRF и CORS
- CSRF: для браузерных приложений с сессиями CSRF должен быть включён; для stateless API (с Bearer token) — можно отключить через
csrf.disable().
- CORS: конфигурацию задают на уровне бин
CorsConfigurationSource, где указывают разрешённые origin'ы (setAllowedOrigins), методы и заголовки. Skill запрещает использовать * в production.
🔐 Управление секретами
- Пароли, токены и ключи нельзя хранить в коде или в
application.yml. Вместо этого используются переменные окружения (${DB_PASSWORD}) или Spring Cloud Vault.
- Регулярная ротация секретов упоминается как обязательная.
🛡️ HTTP-заголовки и Rate Limiting
- Настройка заголовков безопасности (Content-Security-Policy, X-Frame-Options, XSS-Protection, Referrer-Policy) через
http.headers(...).
- Для rate limiting skill предлагает библиотеку Bucket4j с фильтром
RateLimitFilter, который ограничивает запросы по IP (например, 100 запросов в минуту). При превышении лимита возвращается статус 429 Too Many Requests.
📦 Безопасность зависимостей
- В CI/CD рекомендуется запускать OWASP Dependency Check или Snyk для поиска уязвимостей (CVE).
- Spring Boot и Spring Security должны быть на поддерживаемых версиях; build должен падать, если обнаружены известные CVE.
🔍 Логирование PII
- Запрещено логировать пароли, токены, номера кредитных карт и другие персональные данные. Skill рекомендует настроить маскировку в логах и отдавать предпочтение структурированному JSON-логированию.
🧪 Когда использовать
Этот skill уместно применять:
- При старте нового Spring Boot-проекта: чтобы заложить безопасную архитектуру с нуля.
- При добавлении аутентификации или авторизации: JWT, OAuth2, session-based, role-based access.
- При настройке взаимодействия с клиентами: CORS, CSRF, security headers.
- При работе с секретами: настройка Vault, интеграция с env-переменными.
- При защите от атак: SQL injection, XSS, brute-force (rate limiting).
- Перед релизом: как чеклист для аудита безопасности.
⚠️ Важно знать
- Всегда придерживайтесь принципов запрещено всё по умолчанию, минимальные привилегии, валидация на входе.
- Skill не заменяет глубокого аудита безопасности — это набор типовых практик. Для сложных сценариев (например, fine-grained authorization, многопоточность) требуются расширенные настройки.
- Примеры кода — это каркас, который нужно адаптировать под свою бизнес-логику и используемые версии зависимостей.
- Rate limiting на уровне IP — начальный уровень; в production лучше использовать gateway (например, Spring Cloud Gateway) или более продвинутые решения для распределённых систем.
Комментарии
Комментариев пока нет. Будьте первым.