Как следует хранить SMS-коды?

В процессе реализации системы регистрации и авторизации, где код отправляется на номер телефона, я сохраняю этот код в базе данных в течение 5 минут. При каждой отправке нового кода я очищаю базу от всех ранее сохранённых кодов, чтобы избежать их дублирования для пользователя. Кроме того, у меня предусмотрены настройки, позволяющие пользователю сменить номер телефона, для чего также будет использоваться SMS-код. 

В связи с этим у меня возник вопрос: нужно ли каждому коду присваивать тип (например, для смены номера, для авторизации и так далее)? Следует ли удалять все коды или только коды определённого типа при каждом новом запросе? Я также рассматривал возможность отправки первоначального кода, если он ещё не истёк. В чём заключается разница между этими подходами? Кажется, различий нет.
  • 9 апреля 2025 г. 9:15
Ответы на вопрос 2
Хранение SMS-кодов требует внимательного подхода, особенно с точки зрения безопасности и удобства для пользователей. Рассмотрим ваши вопросы по порядку.

### Присвоение типа кода
1. **Тип кода**: Присвоение типу кода (например, для авторизации, для смены номера телефона) может помочь в управлении кодами и повышении безопасности. Это позволяет вам управлять кодами более гибко, например, вы можете удалить только коды определённого типа, если пользователь запрашивает новый код авторизации, не уничтожая другие активные коды.

2. **Преимущества**:
   - Легче отслеживать, какой код для какой операции.
   - Меньше путаницы и возможность избежать подтверждений ненужных операций.
   - Можно установить отдельные таймауты для различных типов кодов, если это будет необходимо.

### Удаление кодов
1. **Удалять все коды или только определенного типа**: Если вы будете удалять только коды определенного типа, это обеспечит большую гибкость. Например, если пользователь запрашивает код для авторизации, вы можете удалить только коды для авторизации и оставить другие активные коды, например, для смены номера телефона.

2. **Удобство для пользователя**: Если пользователь запрашивает новый код для одной операции, и если предыдущий код ещё действителен, вам стоит сообщить об этом пользователю, предоставив возможность использовать уже отправленный код.

### Повторная отправка неистекшего кода
1. **Отправка первоначального кода**: Если код ещё не истек, вы можете его отправить повторно, что может быть полезно, если у пользователя возникли проблемы с его получением. Однако с точки зрения безопасности рекомендуется не отправлять код повторно без особой необходимости и ограничения на операции (например, только после определенного времени или числа попыток).

2. **Разница между подходами**: 
   - Если вы решите не отправлять код, если старый ещё действителен, это может повысить безопасность, предотвращая потенциальные атаки. Однако это может ухудшить пользовательский опыт, если пользователь не получил код, но все еще ждёт его.

### Резюме
- Рекомендуется присваивать кодам типы для лучшего управления и повышения безопасности.
- Удаляйте только коды определенного типа, если это возможно.
- Будьте осторожны с отправкой неистекших кодов, учитывая соотношение безопасности и удобства для пользователя.

Каждый подход имеет свои преимущества и недостатки, и выбор зависит от специфики вашего проекта и желаемого баланса между удобством и безопасностью.
Да, у кода должен быть тип (auth, change_phone, reset_password и т.п) иначе будут коллизии, один процесс может перетереть код другого, удаляй коды конкретного типа (не все подряд) 

Всегда создавай новый код при запросе, даже если старый ещё жив, юзер может потерять смску или просто передумал и начал делать чето еще что тоже требует смску

Что бы не долбили смсками, делаешь throttle
Похожие вопросы