# Отслеживание сессий пользователей ### Выбор хранилища - оценить объем чтения: количество запросов от залогиненых пользователей - оценить объем записи: логины/разлогины/обновление информации о сессии (например 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) - модель девайса