Токены сессий
Пассворк использует модель аутентификации на основе токенов с парой Access Token / Refresh Token.
Обзор системы токенов
| Токен | Назначение | Время жизни |
|---|---|---|
| Access Token | Аутентификация API-запросов | ~2.8 часа |
| Refresh Token | Обновление Access Token | 36 часов |
Почему не JWT?
Токены Пассворка — это случайные строки, а не JWT. Для менеджера паролей такой подход обеспечивает более высокий уровень безопасности:
| Характеристика | Токены Пассворка | JWT |
|---|---|---|
| Формат | Случайная Base64 строка | JSON с подписью |
| Информация в токене | Нет | Payload с данными |
| Валидация | Поиск в базе данных | Проверка подписи |
| Отзыв токена | Мгновенный (удаление из БД) | Требует blacklist |
Преимущества для безопасности:
-
Мгновенный отзыв сессии. При подозрении на компрометацию администратор или пользователь может немедленно завершить любую сессию — токен удаляется из базы и сразу становится недействител ьным. JWT продолжает работать до истечения срока действия.
-
Полный контроль над сессиями. Все активные сессии хранятся на сервере, что позволяет отслеживать устройства, IP-адреса и время последней активности. Администратор видит полную картину и может управлять доступом.
-
Отсутствие чувствительных данных в токене. JWT содержит payload с информацией о пользователе, которая может быть прочитана (Base64 — это не шифрование). Токены Пассворка — просто случайные идентификаторы без какой-либо информации.
-
Устойчивость к компрометации ключа. При утечке секретного ключа JWT злоумышленник может создавать валидные токены для любого пользователя. В случае с сессионными токенами такой вектор атаки отсутствует.
-
Отсутствие секретного ключа подписи. JWT требует хранения приватного ключа на сервере для подписи токенов — это дополнительный секрет, который нужно защищать, ротировать и контролировать. Сессионные токены Пассворка — просто случайные строки, для их генерации не требуется никаких секретных ключей.
Access Token
Характеристики
| Параметр | Значение |
|---|---|
| Длина | 256 бит |
| Формат | Base64 |
| Длина строки | ~44 символа |
| Энтропия | 256 бит |
| Время жизни по умолчанию | 10 000 секунд (~2.8 часа) |
Генерация
Access Token генерируется криптографически стойким генератором случайных чисел:
token = base64(random_bytes(32))
Валидация
При каждом запросе сервер:
- Извлекает токен (из cookie или заголовка, в зависимости от режима)
- Ищет токен в базе данных
- Проверяет время жизни
- Связывает запрос с пользователем
Режимы передачи токена
Пассворк использует два режима передачи Access Token в зависимости от типа клиента:
Browser Mode (веб-приложение)
Для веб-приложения Access Token передаётся через HttpOnly Cookie:
| Параметр | Значение |
|---|---|
| HttpOnly | Да — недоступен для JavaScript (защита от XSS) |
| Secure | Да — только по HTTPS |
| SameSite | Strict — защита от CSRF |
В этом режиме браузер автоматически прикрепляет cookie к каждому запросу. Access Token не возвращается в теле ответа при аутентификации — только в Set-Cookie заголовке.
API Mode (desktop, extension, mobile)
Для API-клиентов Access Token передаётся в заголовке Authorization:
Authorization: Bearer {access_token}
В этом режиме Access Token возвращается в теле ответа при аутентификации, и клиент самостоятельно управляет его хранением.
Сравнение режимов
| Параметр | Browser Mode | API Mode |
|---|---|---|
| Клиенты | Веб-приложение | Desktop, Extension, Mobile |
| Передача токена | HttpOnly Cookie | Authorization header |
| Защита от XSS | ✓ (HttpOnly) | Зависит от клиента |
| Управление токеном | Браузер (автоматически) | Клиент (вручную) |
Refresh Token
Характеристики
| Параметр | Значение |
|---|---|
| Длина | 256 бит |
| Формат | Base64 |
| Длина строки | ~44 символа |
| Энтропия | 256 бит |
| Время жизни по умолчанию | 129 600 секунд (36 часов) |
Назначение
Refresh Token используется для получения нового Access Token без повторной аутентификации. Подробнее о процессе обновления — в разделе Ротация токенов.
Настройка времени жизни
По ролям пользователей
Время жизни токенов настраивается на уровне роли пользователя:
| Настройка | Значение по умолчанию |
|---|---|
| Время жизни Access Token | 10 000 сек (~2.8 часа) |
| Время жизни Refresh Token | 129 600 сек (36 часов) |
Примеры конфигураций
| Сценарий | Access TTL | Refresh TTL |
|---|---|---|
| Стандартный пользователь | 10 000 сек | 129 600 сек |
| Высокая безопасность | 1 800 сек (30 мин) | 14 400 сек (4 часа) |
| Удобство | 28 800 сек (8 часов) | 604 800 сек (7 дней) |
Жизненный цикл сессии
Полный жизненный цикл
T=0: Аутентификация. Пользователь вводит учётные данные. Сервер создаёт Access Token (TTL: 2.8 часа) и Refresh Token (TTL: 36 часов).
T=2.8h: Access Token истёк. Клиент отправляет Refresh Token. Сервер выдаёт новые токены. Старый Refresh Token инвалидируется.
T=36h: Refresh Token истёк. Требуется повторная аутентификация. Пользователь вводит учётные данные заново.
Альтернативный сценарий — Выход. Пользователь нажимает «Выйти». Оба токена инвалидируются. Сессия завершена.
Инвалидация токенов
Все токены сессии инвалидируются при:
- Выходе пользователя из системы
- Смене мастер-пароля
- Сбросе мастер-пароля администратором
Ротация токенов
Стандартный режим (приложения)
Для веб-приложения, браузерного расширения, мобильного и desktop приложений действует строгая политика ротации токенов.
При обновлении сессии клиент отправляет Access Token и Refresh Token одновременно, и в ответ получает новую пару токенов. Таким образом происходит постоянная ротация обоих токенов, что предотвращает повторное использование украденного токена.
Режим для автоматизации (API)
Для DevOps-задач и автоматизации строгая ротация часто неудобна. Поэтому для сессий, созданных через генерацию API-токенов, предусмотрен альтернативный режим:
- Обновление только Access Token без смены Refresh Token
- Отдельное обновление Refresh Token при необходимости
Это позволяет использовать долгоживущие Refresh Token в скриптах и CI/CD пайплайнах.
HTTP-эндпоинты ротации описаны в документации API-токенов.
Безопасность токенов
Защита от перехвата
| Угроза | Защита |
|---|---|
| Перехва т в сети | HTTPS/TLS обязателен |
| XSS-атака | HttpOnly cookies (Browser Mode) |
| CSRF | CSRF Token + SameSite cookies |
CSRF Token
Назначение
CSRF Token защищает от атак межсайтовой подделки запросов. Обязателен для всех модифицирующих операций.
Характеристики
| Параметр | Значение |
|---|---|
| Размер | 256 бит |
| Формат | Hexadecimal (64 символа) |
| Энтропия | 256 бит |
| Генератор | Криптографически стойкий |
Использование
CSRF Token передаётся в заголовке каждого запроса:
X-CSRF-Token: {csrf_token}
Требования по типам клиентов
| Тип клиента | CSRF Token |
|---|---|
| Веб-приложение (Browser Mode) | ✓ Обязателен (генерируется и проверяется автоматически) |
| Браузерное расширение | Опционально (по запросу клиента) |
| Mobile приложение | Опционально (по запросу клиента) |
| API | — (не используется) |