Почему для оплаты используют POST, а не GET
Что проверяют
Умеете ли вы превратить архитектурное правило в список проверок. Формулировка про POST здесь только повод: интервьюер ждёт, что вы объясните риск и тут же назовёте негативные сценарии для платёжной ручки.
Как отвечать
Сначала коротко причина. GET считается безопасным методом, поэтому его повторяют браузер, кэш, прокси, предзагрузка ссылок и поисковый робот, без участия пользователя. Параметры оседают в истории, закладках, журналах и в заголовке Referer, а ответ может закэшироваться. Для операции, списывающей деньги, каждое из этих свойств является дефектом.
Дальше перечислить проверки:
- отправить платёж методом GET: ожидаем отказ по методу, а не проведённую операцию;
- поискать по приложению изменяющие GET вообще: подтверждение, отмена, возврат по ссылке из письма;
- заголовки ответа платёжных страниц: запрет кэширования, отсутствие чувствительных полей в строке запроса;
- повторы: тот же запрос дважды, обновление страницы после оплаты, кнопка возврата, двойной клик, обрыв сети с ретраем клиента. Ожидаем ровно одно списание и корректную работу ключа идемпотентности;
- журналы и трассировка: номер карты, код проверки и токен не должны попадать ни в строку запроса, ни в тело записи;
- защита от подделки межсайтовых запросов: запрос без токена и с чужим токеном должен отклоняться;
- повторная доставка уведомления от платёжного шлюза не должна менять баланс дважды.
Где спотыкаются
Проверяют один позитивный сценарий и закрывают задачу. Платёж это в первую очередь набор негативных сценариев: обрыв, таймаут, повтор, гонка двух вкладок, отказ шлюза на середине. Именно там живут двойные списания.
Останавливаются на интерфейсе. Кнопка заблокирована после первого нажатия, значит защита есть. Тот же запрос, посланный в обход интерфейса, проходит спокойно, поэтому проверять нужно уровень API, а не форму.
Считают, что достаточно убрать данные из URL. Чувствительное утекает в скриншот в баг-репорте, в журнал отладки, в систему аналитики и в тестовые артефакты. Отдельное правило: настоящие карты в тестах не используются, а коды проверки не хранятся нигде.