---
# System prepended metadata

title: Отслеживание сессий пользователей

---

# Отслеживание сессий пользователей

### Выбор хранилища
- оценить объем чтения: количество запросов от залогиненых пользователей
- оценить объем записи: логины/разлогины/обновление информации о сессии (например ip)
- оценить число записей: количество событий логина по user_sessions сгруппированные по месяцам даст хорошее представление о динамике роста
- поговорить с админами: если mysql — ок, можно рассмотреть вариант подселения к user_sessions, если не ок, искать альтернативы schemaless kv

### Вопросы

#### ? Какая длина истории / максимальное количество сессий

На примере gitlab у каждого пользователя может быть не больше 100 устройств. Для контроля размера датасета нам нужно свое разумное ограничение. Если решим хранить и отозванные токены, ограничение будет распространяться и на них.

Ratio такое: мошенник может залогиниться, чего-то там поделать, и удалить свою сессию в UI. Артефактом того, что кто-то заходил останется только отправленное письмо.

В протухших по времени сессиях толку нет, такие можно спокойно удалять.

#### ? Каким должен быть ID сессии

В первом приближении была идея собрать с девайса некий "отпечаток", которого будет достаточно для генерации ID сессии. На деле, у данных которые мы можем собрать нет достаточной кардинальности. Что важнее, смысла в этом тоже нет.

Проще всего в качестве id сессии использовать случано сгенерированный UID. А при создании сессии сохранять доступную инфу: ip, браузер, вид устройства и т.п.

ID должен быть уникальным только для конкретного ID пользователя, и при этом достаточно коротким чтобы шифроваться внутри boobs. Можно использовать случайный 8-символьный короткий UID. GUID (если такой, вообще, потребуется) вычислять как хэш от (user_id, uid).

#### ? Обновления информации о сессии / валидация сессии

Положим я делаю реквест и передаю валидные авторизационные данные. Но бэкэнд видит, что параметры текущего запроса отличаются от тех, что были в момент генерации сессии, например:

- изменился IP: в 4/3/2/1 октете, или IP принадлежит другой автономной сети;
- изменился агент: было приложение, стал браузер. Был chrome, стал FF.

Что делать с таким запросом: пропустить? если да то обновить ли инфу в сессии? если нет, то отозвать ли сессию вообще, видимо она скомпрометирована?

*В текущих условиях ответ на этот вопрос важен только в разрезе оценки объема записи. Саму логику можно менять по ходу развития событий*

#### ? Время жизни сессии

Отталкиваемся от текущей жизни boobs - 120 дней.
Каждый новый запрос на сайт должен обновлять время жизни (имеет смысл заморочиться и обновлять время не каждый раз, а только при первом заходе в день).

#### ? Как быть с su

У нас есть `suboobs`

#### ? Политика уведомлений

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

*Как часто встречаются такие персонажи можно прикинуть по user_sessions.*

В будущем можно рассмотреть способы борьбы с подобным спамом:
- переиспользовать существующую сессию, если все ее параметры совпадают (в рамках разумного временного периода) — это если предполагать, что кука потерялась;
- оживлять разлогиненную (но не отозванную) сессию (в рамках разумного временного периода) — если предполагать, что пльзователь разлогинился

#### ? Миграция boobs

Нужен механизм плавной миграции со старых boobs на новые, содержащие id сессии, чтобы массово не разлогинивать народ.

Видимо, при миграции сессии будут создаваться не в момент логина, а при первом авторизованном запросе со старыми boobs. Вряд ли при этом стоит рассылать письма.

#### ? Как оповещать

Email есть не у всех, Sms? telegram? push? Как исключать канал доставки? если я только что установил приложение и залогинился в нем — нельзя сюда же слать пуш, что я залогинлся.


#### ? Какую инфу собирать

- вендор + версия браузера
- мобильный/десктоп
- ip клиента
- платформа (bitness)
- модель девайса