TTL (time to live) — время, в течение которого одноразовый код считается действительным. После его истечения проверка получает статус «просрочена», и код не примут, даже если он верный.
Пока код действителен, он остаётся ключом к аккаунту. Перехваченное сообщение, забытое на чужом экране уведомление, скриншот в переписке — всё это работает ровно до истечения TTL. Чем короче срок, тем уже окно, в которое код можно использовать против владельца.
С другой стороны стоит живой человек, который отвлёкся. Сценарий «пришло СМС → переключиться → прочитать → вернуться → ввести» занимает заметно больше времени, чем кажется разработчику, проверяющему его на своём телефоне. Слишком короткий TTL превращается в просроченные проверки, повторные отправки и двойной счёт за одного пользователя.
У обратного flash-call и SIM-PUSH кода нет, поэтому TTL ограничивает не «срок годности секрета», а длительность самой сессии проверки: сколько сервис ждёт звонка или ответа сети. Перехватывать там нечего, и поведение при истечении другое — проверка просто закрывается как несостоявшаяся.
Истёкшая проверка и неверный код — разные состояния, и в API они приходят разными статусами. Разделяйте их в интерфейсе: «срок истёк, отправить заново» и «код неверный» требуют от пользователя разных действий.
Для методов с вводом кода — несколько минут: хватает на переключение между приложениями и не оставляет код полезным надолго. Точное значение зависит от сценария и длины формы.
Проверка закрывается со статусом «просрочена», и верный код после этого тоже не принимается. Нужна новая проверка.
Да, в доле доведённых до результата она учитывается как недошедшая — пользователь ведь не подтвердился.