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