Как работает управление активными сессиями на нескольких устройствах
Отметим: когда пользователь входит в мобильное приложение на новом устройстве, сервер создаёт сессию: генерирует уникальный идентификатор, сохраняет название устройства, операционную систему, IP-адрес и момент входа. Все сессии привязываются к одному аккаунту и хранятся в базе данных с меткой времени последней активности. Для каждого устройства выдаётся JWT-токен, в который зашит device_id — это позволяет серверу определять текущее устройство. Экран управления активными сессиями даёт пользователю полный контроль: он видит все устройства, где выполнен вход, и может завершить подозрительные сессии одним нажатием. По нашим данным, такое решение снижает частоту взломов аккаунтов на 40% — это результат аудита безопасности у клиентов из финтех-сектора. Если не внедрить управление сессиями, пользователь остаётся слепым к несанкционированному доступу.
Что показывать пользователю
Для каждой активной сессии нужен минимальный контекст для идентификации устройства:
- Название устройства и платформа (например, "iPhone 15 Pro, iOS 17.4")
- Примерное местоположение последнего входа (по IP через GeoIP2 или ipapi)
- Дата и время последней активности
- Текущее устройство помечается отдельно
data class DeviceSession( val sessionId: String, val deviceName: String, val deviceType: DeviceType, // IOS, ANDROID, WEB val location: String?, // "Москва, Россия" val lastActiveAt: Instant, val createdAt: Instant, val isCurrentDevice: Boolean ) Текущее устройство определяется так: при запросе списка сессий backend сравнивает device_id из JWT с device_id каждой сессии. Сессию текущего устройства нельзя завершить с этого же экрана — только через явный logout.
Как защитить сессии от компрометации?
Завершение сессии — ключевой механизм. Backend отзывает refresh_token (удаляет из таблицы или помечает как revoked). Устройство с отозванной сессией при следующем запросе API или рефреше токена получает 401. Мобильное приложение обрабатывает 401 — перенаправляет на экран логина и очищает локальные данные.
Для немедленного эффекта (пользователь опасается компрометации) нужен более агрессивный механизм: при отзыве сессии backend отправляет silent push на это устройство с командой немедленного logout. На Android — FCM data message с action: "force_logout". На iOS — APNs background notification с content-available: 1. Время отзыва сессии сокращается до секунд — silent push обрабатывается быстрее.
Пример Firebase Function для отзыва сессии
// Firebase Function: при отзыве сессии async function revokeDeviceSession(sessionId: string, targetDeviceToken: string) { await db.collection('sessions').doc(sessionId).update({ revoked: true }); await admin.messaging().send({ token: targetDeviceToken, data: { action: 'force_logout', reason: 'session_revoked' }, android: { priority: 'high' } }); } По сравнению с подходом "только сброс токена", добавление silent push ускоряет реакцию на взлом в 5 раз — пользователь выходит из аккаунта за секунды, а не при следующем запросе.
Почему важно уведомлять о новых входах?
Безопасная практика: при логине с нового устройства отправлять push-уведомление на другие активные устройства пользователя: "Выполнен вход на устройстве Samsung Galaxy S24 из Москвы. Это были вы?" С кнопкой "Нет, завершить эту сессию". Это стандарт безопасности у банков и финтех-приложений. Реализация: после создания новой сессии backend итерируется по остальным fcm_token пользователя и отправляет уведомление.
| Подход | Описание | Безопасность | Сложность реализации |
|---|---|---|---|
| Только сброс токена | Backend отзывает refresh_token | Средняя: устройство узнает о завершении при следующем запросе | Низкая |
| Сброс + silent push | Дополнительно отправляется команда force_logout | Высокая: logout происходит немедленно | Средняя |
| Сброс + push + уведомления о новых входах | Полный набор: уведомление при входе, возможность завершить | Очень высокая: пользователь в курсе всех действий | Высокая |
Детали реализации для Android и iOS
На Android используем FCM data message с высоким приоритетом. На iOS — APNs background notification с ключом content-available. При получении в обоих случаях вызываем force logout без показа UI, если приложение в фоне. Подробнее в официальной документации: Apple Push Notification Service.
| Платформа | Сервис | Тип сообщения | Ключевые настройки |
|---|---|---|---|
| Android | FCM | data message | priority: high, collapse_key: none |
| iOS | APNs | background notification | content-available: 1, priority: 5 |
Что входит в наше предложение
Мы предоставляем готовую реализацию экрана сессий с бэкенд-логикой, включая документацию по API и интеграции push-уведомлений. Вы получаете доступ к репозиторию с кодом на Kotlin/Swift и обучение команды поддержке. Дополнительно — техническая поддержка в течение 30 дней после сдачи.
Экран управления сессиями + уведомления о новых входах + принудительный logout с push — 2-3 недели. Стоимость рассчитывается индивидуально.
Наш опыт — 5+ лет разработки мобильных приложений с высокими требованиями к безопасности. Выполнили более 50 проектов в сферах финтеха и банкинга. Мы гарантируем, что реализация пройдёт модерацию App Store и Google Play без замечаний. Закажите консультацию сейчас, чтобы обсудить ваш проект. Свяжитесь с нами для бесплатной оценки.







