Security: вопросы с ответами
16 разобранных вопросов по теме «Security». Каждый — с правильным ответом и пояснением.
- CSRF — что это и как проверить?
Cross-Site Request Forgery: злоумышленник заставляет браузер отправить запрос от имени авторизованного пользователя, используя его сессионную cookie. Пример: скрытая форма на вредоносном сайте делает POST /transfer. Защита: CSRF-токен в форме/заголовке и cookie с SameSite.
- JWT — структура и как работает?
Три части через точку: header.payload.signature. Header: алгоритм (HS256). Payload: данные (userId, exp, roles) — только Base64Url-кодируется, но НЕ шифруется, поэтому пароли туда класть нельзя. Signature: HMAC(header+payload, secret), проверяется без хранения сессии на сервере.
- XSS — что это и как проверить?
Cross-Site Scripting: вставка JavaScript в данные. <script>alert(1)</script> в поле имени → если отобразится без экранирования — XSS. Stored XSS: скрипт сохраняется в БД. Reflected: в URL-параметре, выполняется при переходе по ссылке. Защита — экранирование вывода.
- Что такое Иммутабельность как способ потокобезопасности?
Immutable-объекты потокобезопасны по определению — нет shared mutable state, состояние не меняется после создания, поэтому гонок данных быть не может. Нет необходимости в synchronized/volatile. Примеры: String, Integer, LocalDate, record. Безопасность даёт именно отсутствие мутаций, а не синхронизация или копирование.
- Как реализовать потокобезопасный singleton?
Лучший вариант — enum. Альтернативы: static holder (Initialization-on-demand), double-checked locking с volatile.
- Как сделать иммутабельный список?
List.of(...) — с Java 9, неизменяемый. Collections.unmodifiableList(list) — обёртка, но если изменить оригинальный list — обёртка тоже увидит изменения. List.copyOf(list) — полноценная иммутабельная копия.
- Как сделать потокобезопасный singleton?
Лучшее — enum. Альтернативы: static holder (lazy init via classloader), double-checked locking с volatile.
- Какие потокобезопасные коллекции есть в java.util.concurrent?
ConcurrentHashMap — потокобезопасная HashMap. Не блокирует чтение, на запись — синхронизация по бакету. CopyOnWriteArrayList — копирует весь массив при записи, lock-free на чтение, хороша при редких записях и частых чтениях.
- Что такое Маскирование PII в логах?
PII (Personal Identifiable Information): номер карты, паспорт, телефон. В логах нельзя в открытом виде — только обезличенно, независимо от места хранения. Проверка: сделать запрос с номером карты → посмотреть логи → должно быть ****1234, не полный номер.
- Что такое Назови основные роли в OAuth?
Resource Owner (пользователь), Client (приложение), Authorization Server (выдаёт токены), Resource Server (хранит ресурсы).
- Чем OAuth отличается от OpenID Connect?
OAuth — про авторизацию (что можно). OIDC — надстройка над OAuth для аутентификации (кто ты), добавляет id_token с информацией о пользователе.
- Что делает Spring Security?
Защищает приложение: аутентификация (кто ты) и авторизация (что тебе можно). Работает через цепочку фильтров перед твоим контроллером.
- Что такое access token и refresh token?
Access token — короткоживущий, доступ к ресурсам. Refresh token — долгоживущий, нужен для получения нового access token без повторного входа.
- Что такое JWT?
JSON Web Token — компактный формат для передачи информации в виде подписанного JSON. Состоит из трёх частей через точку: header.payload.signature. Можно проверять валидность без обращения к серверу.
- Что такое Keycloak?
Open-source решение для аутентификации и авторизации. Реализует OAuth 2.0, OIDC, SAML. Поддерживает SSO, federation, social login. Удобен тем, что готовый — не нужно писать свой сервер авторизации.
- Что такое OAuth 2.0?
Протокол авторизации. Позволяет одному приложению получить доступ к ресурсам пользователя в другом приложении без передачи пароля. Например: «войти через Google».