Вопросы для собеседования специалиста по безопасности приложений
Готовый набор для интервьюера: 36 вопросов с тезисами эталонного ответа, задача, рубрика и план встречи.
На собеседовании специалиста по безопасности приложений хорошо работает схема на 60 минут: 3-4 устных вопроса по стеку, одна задача на live coding, проектирование для middle и выше и вопросы кандидата. Ниже вопросы по грейдам из базы Техпрогона: у каждого тезисы, которые должен назвать сильный кандидат.
Всего в базе по этой роли 190 устных вопросов с чек-листом ответа.
Как построить техсобес на 60 минут
0-5 мин
Знакомство
Кто вы, формат встречи, кандидат коротко о себе и последнем проекте.
5-20 мин
Вопросы по стеку
3-4 устных вопроса из набора ниже. Сверяйте ответ с тезисами.
20-45 мин
Live coding
Одна задача. Смотрите на процесс по рубрике, а не только на ответ.
45-55 мин
Проектирование
Для middle и выше: система или решение целиком. Для junior: ещё вопросы.
55-60 мин
Вопросы кандидата
Что спросил кандидат, тоже сигнал: интерес к задачам и команде.
Junior: 12 вопросов
Основы: как устроено и зачем. Хватит 3-4 вопросов на встречу.
Расскажите, что такое IDOR (BOLA), как вы будете его искать и как предложите исправлять.
Что хотим услышать
- Суть: нет проверки прав на объект по идентификатору из запроса
- Поиск: два пользователя, подмена id во всех методах, включая экспорт и вложенные ресурсы
- Исправление: фильтр по владельцу или арендатору в запросе, централизованная проверка
- UUID не защита, ответ 404 для чужих объектов
- Регресс: автотесты на доступ в CI
Если ответил, копните глубже
Объясни, что такое CORS и как он работает.
Что хотим услышать
- Same-origin policy: скрипт не может читать ответы другого origin (схема, хост, порт)
- CORS: сервер заголовками
Access-Control-Allow-*разрешает конкретным origin читать ответы - Проверяет браузер, сервер отвечает всегда; вне браузера CORS не действует
- Простые запросы уходят сразу, остальные после preflight OPTIONS
- С куками нужен
credentials: 'include',Allow-Credentials: trueи точный origin вместо*
Если ответил, копните глубже
Объясни разницу между жёсткой и символьной ссылкой. Когда какую использовать?
Что хотим услышать
- Жёсткая ссылка: ещё одно имя того же inode, равноправное с оригиналом
- Данные живут, пока счётчик ссылок больше нуля и файл никто не держит открытым
- Жёсткую нельзя на каталог и между разными ФС
- Символьная: отдельный файл, внутри которого путь к цели
- Символьная ломается при удалении или переносе цели, зато работает с каталогами и через ФС
- Пример: symlink на текущий релиз
current -> releases/42для атомарного переключения
Если ответил, копните глубже
ls -l во второй колонке?Объясни разницу между textContent, innerText и innerHTML. Что из этого и когда использовать?
Что хотим услышать
textContentвозвращает весь текст, включая скрытый, без учёта CSSinnerTextучитывает стили, возвращает видимый текст и при чтении вызывает пересчёт layoutinnerHTMLчитает и пишет разметку, присваивание парсит HTML- Пользовательские данные через
innerHTMLвставлять нельзя: это XSS - Перезапись
innerHTMLпересоздаёт потомков и теряет обработчики и состояние полей - По умолчанию для текста выбирать
textContent
Если ответил, копните глубже
innerText медленнее textContent?insertAdjacentHTML и чем он лучше innerHTML +=?Объясните разницу между вертикальным и горизонтальным масштабированием и когда что выбирать.
Что хотим услышать
- Вертикальное: мощнее машина, код не меняется, есть предел и единая точка отказа
- Горизонтальное: больше узлов, нужен stateless или распределённое состояние
- Stateless-сервисы приложения масштабируют горизонтально в первую очередь
- БД часто сначала масштабируют вертикально и репликами, шардирование позже
- Горизонтальное даёт отказоустойчивость, но добавляет сложность
Если ответил, копните глубже
Назовите ваши сильные стороны.
Что хотим услышать
- Две-три стороны, а не список из десяти
- Каждая подкреплена примером
- Стороны связаны с вакансией
- Нет пустых слов вроде «стрессоустойчивый, коммуникабельный» без доказательств
- Уверенно, без хвастовства
Если ответил, копните глубже
Расскажите, как правильно хранить пароли пользователей и почему.
Что хотим услышать
- Не хранить открыто и не шифровать: только односторонний хеш
- Медленный алгоритм: Argon2id, bcrypt, scrypt, а не SHA-256 и MD5
- Уникальная соль на пароль, параметры вместе с хешем
- Перец как дополнительный секрет вне базы
- Миграция старых хешей при входе, сравнение за постоянное время
Если ответил, копните глубже
Чем отличаются GET и POST? Ответ «у POST есть тело» не засчитывается.
Что хотим услышать
- GET читает и безопасен, POST меняет состояние
- GET идемпотентен, POST нет: его нельзя молча повторять
- GET кешируется браузером и прокси, POST по умолчанию нет
- Параметры GET в URL: попадают в логи и историю, длина ограничена серверами
- GET можно добавить в закладки и prefetch, поэтому нельзя менять данные по GET
Если ответил, копните глубже
Расскажи, как в shell перенаправить вывод и ошибки, и приведи частые ловушки.
Что хотим услышать
- Три дескриптора: 0 stdin, 1 stdout, 2 stderr
>перезаписывает,>>дописывает,2>для ошибок,<для ввода> file 2>&1объединяет потоки, порядок важен: перенаправления слева направо- Пайп передаёт только stdout, для ошибок нужен
2>&1 | sudo cmd > /etc/xне работает: файл открывает shell без прав, используют| sudo tee/dev/nullдля выбрасывания ненужного вывода
Если ответил, копните глубже
&>?Расскажи, как событие распространяется по DOM и чем отличаются stopPropagation и preventDefault.
Что хотим услышать
- Три фазы: погружение, цель, всплытие
- Слушатели по умолчанию на всплытии,
capture: trueпереносит на погружение target- где возникло,currentTarget- где висит обработчикstopPropagationостанавливает путь по дереву, но не обработчики того же элементаpreventDefaultотменяет действие браузера и на распространение не влияет- Не все события всплывают:
focus,blur,mouseenter
Если ответил, копните глубже
stopImmediatePropagation отличается от stopPropagation?stopPropagation плохо?focus на родителе?Зачем в системе очередь сообщений? Приведите примеры.
Что хотим услышать
- Асинхронность: пользователь не ждёт долгой работы
- Сглаживание пиков: очередь копит, консьюмеры разбирают
- Развязка сервисов: продюсер не знает о получателях
- Ретраи при временных сбоях получателя
- Цена: eventual consistency, дубли, мониторинг отставания
Если ответил, копните глубже
Какие у вас слабые стороны?
Что хотим услышать
- Назвал реальную слабость, а не штамп
- Слабость не критична для роли
- Рассказал, что делает, чтобы её компенсировать
- Есть пример прогресса
- Коротко, без самобичевания
Если ответил, копните глубже
Middle: 12 вопросов
Практика: почему так, какие компромиссы, что ломается.
Вы видите в логах сотни тысяч попыток входа с разных IP, часть успешных. Что вы сделаете сейчас и в долгую?
Что хотим услышать
- Сейчас: лимиты и CAPTCHA на вход, блок явных источников, мониторинг
- Найти скомпрометированные аккаунты: успешные входы с аномалий, сбросить сессии и пароли
- Уведомить пользователей и при необходимости подготовить сообщение регулятору
- Проверка паролей по базам утечек при входе и смене
- MFA, лучше passkeys, хотя бы для чувствительных действий
- Обнаружение аномалий: новое устройство, геолокация, скорость
Если ответил, копните глубже
Чем отличаются сессии на куках и JWT? Что бы ты выбрал для обычного веб-приложения?
Что хотим услышать
- Сессия: id в куке, состояние на сервере (Redis/БД), отзыв мгновенный
- JWT: состояние в самом токене, проверка подписью без базы, сложно отозвать
- Для JWT нужна пара короткий access + отзываемый refresh
- Хранение: HttpOnly кука защищает от XSS, но нужна защита от CSRF (SameSite)
- Выбор по контексту: одно веб-приложение проще на сессиях, много сервисов и мобильные клиенты удобнее на токенах
Если ответил, копните глубже
Мониторинг сообщает: корневой раздел заполнен на 100%, сервис падает. Что делаешь по шагам?
Что хотим услышать
- Оценить:
df -hиdf -i, место или inode - Найти крупное:
du -xh / --max-depth=1 | sort -h, затем вглубь; обычно логи, кеши, дампы, docker - Проверить удалённые, но открытые файлы:
lsof +L1 - Быстро освободить безопасно: обнулить лог через
: > fileилиtruncate, а неrmоткрытого файла;journalctl --vacuum-size,docker system pruneс пониманием - Устранить причину: logrotate, лимиты журнала, алерт на 80%
- Если нужно место надолго: расширить диск или том LVM онлайн
Если ответил, копните глубже
rm лога может не помочь?Тебе говорят: «страница тормозит». Как ты будешь искать и устранять проблему?
Что хотим услышать
- Уточнить, что именно медленно: загрузка, отклик на действия или прыжки вёрстки
- Посмотреть полевые данные (CrUX, web-vitals в аналитике) и лабораторные (Lighthouse, Performance)
- Для LCP: найти LCP-элемент, проверить TTFB, приоритет загрузки, блокирующие ресурсы
- Для INP: найти длинные задачи в профиле, разбить работу, вынести в воркер, уменьшить JS
- Для CLS: размеры у медиа, резерв места, шрифты
- После правки измерить снова и следить за метриками в мониторинге
Если ответил, копните глубже
Расскажите, по какому плану вы будете вести секцию system design на 60 минут.
Что хотим услышать
- Начинаю с уточнения функциональных требований и явно фиксирую, что не делаем
- Уточняю нефункциональные требования: масштаб, задержка, доступность, консистентность
- Делаю грубую оценку RPS и объёмов и использую её в решениях
- Описываю API и модель данных, выбираю хранилище под паттерн доступа
- Рисую высокоуровневую схему и прохожу по ней путь запроса
- Оставляю время на узкие места, отказы, масштабирование и мониторинг
Если ответил, копните глубже
Почему вы ищете новую работу?
Что хотим услышать
- Причина через цель, а не через бегство
- Ни слова негатива о текущем работодателе
- Показано, что на текущем месте был рост и результаты
- Связка с этой вакансией
- Коротко: до минуты
Если ответил, копните глубже
Какие уязвимости встречаются при работе с JWT и как их предотвратить?
Что хотим услышать
- alg none и путаница алгоритмов: фиксировать алгоритм и тип ключа
- Слабый секрет HS256 перебирается офлайн: длинный случайный секрет или асимметричные ключи
- Нет проверки exp, aud, iss
- kid, jku из заголовка: ключи только из своего набора
- Payload не зашифрован; отзыв через короткий срок и ротацию refresh
- Хранение на клиенте: компромисс XSS и CSRF
Если ответил, копните глубже
Чем отличаются HTTP/1.1, HTTP/2 и HTTP/3? Какие проблемы решала каждая версия?
Что хотим услышать
- Семантика (методы, статусы, заголовки) одна, меняется транспорт
- HTTP/1.1: запросы по очереди в соединении, браузер держит около 6 соединений
- HTTP/2: бинарные фреймы, мультиплексирование, HPACK, одно соединение
- HTTP/2 упирается в head-of-line blocking TCP при потерях
- HTTP/3: QUIC поверх UDP, независимые потоки, TLS встроен, быстрее рукопожатие, миграция соединения
Если ответил, копните глубже
Расскажи, что происходит с момента включения сервера до появления приглашения входа.
Что хотим услышать
- UEFI/BIOS: POST, поиск загрузчика на ESP или в MBR, Secure Boot проверяет подпись
- GRUB: меню, загрузка ядра и initramfs, передача параметров (
root=, консоль) - Ядро: инициализация CPU, памяти, драйверов, распаковка initramfs
- initramfs: модули и утилиты, чтобы найти и смонтировать корень (LVM, RAID, LUKS), переход на настоящий корень
- systemd как PID 1: юниты по зависимостям до
default.target, монтирование fstab, сеть, сервисы - getty и sshd дают логин; диагностика через
systemd-analyzeиjournalctl -b
Если ответил, копните глубже
Что такое XSS, какие бывают виды и как защищаться во фронтенде?
Что хотим услышать
- выполнение чужого скрипта в контексте нашего домена
- хранимый, отражённый и DOM-based
- React экранирует вывод по умолчанию
- dangerouslySetInnerHTML снимает защиту - нужна санитизация
- опасны также href с javascript: и подстановка в стили
- второй рубеж - CSP и httpOnly-куки
Если ответил, копните глубже
Какие стратегии кеширования вы знаете и как выбрать подходящую?
Что хотим услышать
- Cache-aside: приложение само читает и заполняет кеш, самый частый вариант
- Read-through: кеш-слой сам загружает данные при промахе
- Write-through: синхронная запись в кеш и БД, свежий кеш, медленнее запись
- Write-behind: асинхронная запись в БД, быстро, риск потери
- Выбор зависит от соотношения чтения и записи и цены устаревших данных
Если ответил, копните глубже
Почему вы считаете себя middle-разработчиком?
Что хотим услышать
- Показал самостоятельность: вёл задачу сам от требований до прода
- Привёл пример фичи, которую довёл целиком
- Упомянул работу с неясными требованиями
- Есть результат с цифрой
- Не завысил и не принизил себя
Если ответил, копните глубже
Senior: 12 вопросов
Глубина и опыт: границы подходов, решения в продакшене.
Вы первый AppSec-инженер в компании с 30 продуктовыми командами. Как вы выстроите безопасную разработку за год?
Что хотим услышать
- Оценка: инвентаризация сервисов, данных, текущих практик и инцидентов, приоритет по риску
- Быстрые победы: сканер секретов, SCA, базовые безопасные настройки шаблонов
- SAST с точными правилами и baseline, находки в PR
- Security champions и обучение, моделирование угроз для новых крупных фич
- Процесс: SLA по критичности, исключения, метрики
- Внешняя проверка: пентест критичных систем, политика раскрытия, затем баунти
Если ответил, копните глубже
Как бы ты сделал надёжный клиент WebSocket для чата, который переживает обрывы сети?
Что хотим услышать
- Реконнект с экспоненциальной задержкой и джиттером, сброс задержки после успеха
- Heartbeat: ping/pong с таймаутом, при пропуске закрыть и переподключиться
- Нумерация сообщений: после реконнекта клиент сообщает последний id, сервер досылает пропущенное
- Очередь исходящих сообщений с клиентскими id, идемпотентность на сервере против дублей
- Реакция на
online/offlineи видимость вкладки, повторная авторизация при истёкшем токене
Если ответил, копните глубже
Пользователи жалуются, что https://api.example.com не открывается. Как будешь искать причину?
Что хотим услышать
- Воспроизвести и уточнить симптом: таймаут, refused, ошибка TLS, 5xx
- DNS:
dig +short, правильный ли IP, не истёк ли домен - Сеть и порт снаружи:
curl -v,nc -zv host 443; refused или timeout - На сервере: слушает ли процесс и на каком адресе (
ss -tlnp), отвечает ли локально - Фаервол на хосте и в облаке, балансировщик и его health checks
- Логи прокси и приложения, сертификат и его срок
Если ответил, копните глубже
Объясни, из чего складывается INP и как ты его улучшал бы в большом SPA.
Что хотим услышать
- INP складывается из задержки ввода, времени обработчиков и задержки отрисовки
- Задержку ввода создают длинные задачи, которые уже идут в момент клика
- Разбивать работу и уступать главный поток: scheduler.yield или setTimeout
- Сначала дать визуальный отклик, тяжёлое делать после
- Сокращать JS, гидрацию и ререндеры: код-сплиттинг, startTransition, мемоизация, виртуализация
- Мерить в поле с атрибуцией, чтобы знать конкретные медленные взаимодействия
Если ответил, копните глубже
Спроектируйте мессенджер с личными и групповыми чатами, доставкой в реальном времени и историей.
Что хотим услышать
- Требования: личные и групповые чаты до 1 000 участников, доставка онлайн и офлайн (push), история, статусы «доставлено» и «прочитано»; порядок сообщений в чате; медиа и сквозное шифрование вне рамок
- Оценка нагрузки: 50 млн DAU по 40 сообщений ≈ 2 млрд в сутки ≈ 20 000 RPS записи, в пике ~60 000; 10 млн одновременных соединений, ~100 000 на gateway → ~100 gateway; 2 млрд × 200 байт ≈ 400 ГБ в сутки, ~150 ТБ в год без реплик
- API: WebSocket: send {chat_id, client_msg_id, text}, ack {msg_id}, события new_message, read; HTTP: GET /chats/{id}/messages?before=...
- Данные: чаты и участники в PostgreSQL, сообщения в Cassandra/ScyllaDB с ключом партиции chat_id и сортировкой по msg_id, реестр user_id → gateway в Redis с TTL
- Компоненты: gateway-серверы с соединениями, сервис сообщений (сохранить, присвоить id, разослать), сервис присутствия, push-сервис для офлайн, очередь для фан-аута в группах
- Узкие места: большие группы (фан-аут через очередь), дубли при переотправке (client_msg_id для идемпотентности), переподключения и догрузка пропущенного, горячие чаты, падение gateway
Если ответил, копните глубже
Вы претендуете на senior. Расскажите о себе.
Что хотим услышать
- Назван масштаб: команда, нагрузка, пользователи или деньги
- Есть решения, которые повлияли дальше своего кода
- Есть метрики результата
- Упомянуто влияние на команду: менторинг, процессы, ревью
- Уложился в 2 минуты, не утонул в деталях
Если ответил, копните глубже
Команда делает SPA с API на поддомене и спорит: хранить токен в localStorage или в cookie. Что вы порекомендуете и почему?
Что хотим услышать
- Сравнить риски: XSS крадёт токен из localStorage, cookie требует защиты от CSRF
- Рекомендация: сессия или refresh-токен в cookie HttpOnly Secure SameSite, короткий access в памяти
- CSRF-защита для cookie: SameSite, токен или проверка Origin
- Учесть поддомены: SameSite считает их одним сайтом
- CORS: точный allowlist origin, credentials только где нужно
- В любом случае строгая защита от XSS и CSP
Если ответил, копните глубже
Первая загрузка сайта занимает 4 секунды у пользователей из регионов. Как бы ты искал, где теряется время, и что делал?
Что хотим услышать
- Измерить: Navigation Timing и RUM по этапам (DNS, connect, TLS, TTFB, загрузка, рендер), Lighthouse и WebPageTest
- Сеть: CDN ближе к пользователю, HTTP/2 или HTTP/3, preconnect к сторонним доменам
- Сервер: медленный TTFB → кеширование, отдача статики с CDN, 103 Early Hints
- Ресурсы: Brotli, меньше JS, code splitting, оптимизированные картинки с размерами
- Рендер: критический CSS, defer для скриптов, без блокирующих сторонних скриптов
Если ответил, копните глубже
Как правильно останавливать процесс сервиса и что должно делать приложение, чтобы остановка была корректной?
Что хотим услышать
- Сначала SIGTERM, затем ожидание (таймаут), и только потом SIGKILL
- Приложение ловит SIGTERM: перестаёт принимать новые запросы, дожидается текущих, закрывает соединения с БД
- SIGKILL нельзя перехватить, поэтому после него остаются lock-файлы и незавершённые операции
- systemd делает так же:
KillSignal,TimeoutStopSec, затем SIGKILL - В контейнере процесс должен быть PID 1 или запускаться через init (tini), иначе сигнал не дойдёт
- Код выхода 143 после SIGTERM и 137 после SIGKILL помогают понять, как завершился процесс
Если ответил, копните глубже
Как бы ты выстроил защиту от XSS в большом фронтенд-приложении?
Что хотим услышать
- Экранирование по умолчанию: фреймворк с автоэкранированием, запрет innerHTML в линтере
- Пользовательский HTML только через санитайзер (DOMPurify)
- Проверка протокола у пользовательских URL в href и src
- Строгая CSP с nonce и strict-dynamic, сначала в Report-Only
- Trusted Types, чтобы все вставки HTML шли через одну политику
- HttpOnly-куки для сессии, SRI для сторонних скриптов
Если ответил, копните глубже
Спроектируйте ленту новостей соцсети: пользователь подписан на других и видит их посты, новые сверху.
Что хотим услышать
- Требования: публикация поста, подписка, лента с пагинацией; порядок по времени (ранжирование вне рамок или упрощённо); лента грузится < 200 мс, допустима задержка появления поста в секунды
- Оценка нагрузки: 100 млн DAU, 10 открытий ленты в день ≈ 10 000 RPS чтения, в пике ~30 000; 10 млн постов в сутки ≈ 100 RPS записи; при 200 подписчиках в среднем ≈ 20 000 вставок в ленты в секунду
- API: POST /posts; GET /feed?cursor=...&limit=20; POST /users/{id}/follow
- Данные: посты в шардированной БД по author_id, граф подписок отдельно, готовые ленты как списки id постов в Redis (последние ~500), медиа в S3
- Компоненты: сервис постов, очередь событий публикации, fan-out воркеры, сервис ленты, кеш постов, CDN для медиа
- Узкие места: аккаунты-звёзды (гибрид on write + on read), неактивные пользователи (не раскладывать, собирать при входе), пагинация курсором, память Redis, удаление и редактирование постов
Если ответил, копните глубже
Чем, по-вашему, резюме senior должно отличаться от резюме middle?
Что хотим услышать
- Акцент на масштаб и влияние, а не на список фич
- Метрики бизнес-эффекта
- Лидерство: менторинг, процессы, архитектурные решения
- Компактность: старый опыт свёрнут
- Понимание, что резюме под роль, а не под всё сразу
Если ответил, копните глубже
Задача для live coding
Ограничение частоты попыток входа
Напишите rateLimit(events, limit, windowSec). events массив [время в секундах, ключ] в порядке возрастания времени (ключ, например, логин или IP). Для каждого события верните true, если попытка разрешена, иначе false.
Попытка разрешена, если для этого ключа число разрешённых попыток в окне (t - windowSec, t] меньше limit. Отклонённые попытки не учитываются.
- Подсказка, если застрял: Храните для каждого ключа список времён разрешённых попыток.
- Подсказка, если застрял: Перед проверкой выбросьте времена, вышедшие из окна.
Эталон, тесты и таймер открываются интервьюеру в живом моке
Рубрика оценки: 1-4 балла
Те же критерии процесса, что в живом моке Техпрогона. Ставьте балл по каждому пункту, сумма показывает картину лучше, чем «понравился или нет».
Уточнил условие
Ограничения, формат входа, что вернуть при пустом вводе
Привёл примеры до кода
Обычный случай и хотя бы один краевой
Проговорил алгоритм словами
До того как писать код
Назвал сложность
По времени и по памяти
Написал рабочий код
Тесты прошли
Сам проверил краевые случаи
Прогнал в голове пустой ввод, один элемент, дубликаты
Нашёл и исправил ошибку сам
Или ошибок не было с первого раза
Мок-собес без регистрации для интервьюера
Хотите проверить кандидата на задаче с эталоном и рубрикой? Так работает живой мок в Техпрогоне.
Кандидат готовится в Техпрогоне и на задаче открывает ступень «Живой мок».
Он присылает вам ссылку. Вы открываете её без регистрации.
У вас условие, эталон, рубрика, уточняющие вопросы и таймер.
Вы ставите оценки и вердикт, кандидат сразу видит результат.
Для интервьюера бесплатно. Ссылку создаёт кандидат на тарифе Рывок
Наборы для других ролей
Готовитесь к собесу сами? Подготовка к собеседованию: Специалист по безопасности приложений