Session Token — это уникальный идентификатор, который сервер создаёт после успешной аутентификации пользователя и использует для идентификации последующих запросов. В отличие от самодостаточных токенов (JWT), session token — это случайная строка, которая сама по себе не содержит данных: вся информация о сессии хранится на сервере в оперативной памяти или базе данных. По данным OAuth.com, 2025, session token остаётся наиболее распространённым механизмом аутентификации в серверных веб-приложениях и гибридных мобильных архитектурах.
Главное
Session Token (идентификатор сессии) — это уникальная строка, которую сервер генерирует и связывает с данными сессии после аутентификации пользователя. Токен не содержит никакой информации о пользователе — это просто ключ к данным, хранящимся на сервере. Такой подход называется stateful аутентификацией: сервер хранит состояние каждой активной сессии и проверяет его при каждом запросе.
Данные сессии включают: идентификатор пользователя, время входа, IP-адрес, user-agent, список разрешений (permissions), время последней активности. Когда клиент отправляет запрос с session token, сервер находит соответствующую запись в хранилище сессий, проверяет её валидность и извлекает данные для обработки запроса. Если запись сессии отсутствует или истекла, сервер возвращает ошибку аутентификации и требует повторного входа.
По данным OWASP, 2025, session token остаётся стандартом для приложений, где требуется немедленный отзыв доступа — например, в банковских системах и корпоративных порталах, где администратор должен иметь возможность завершить сессию пользователя мгновенно. В таких системах session token обеспечивает полный контроль над доступом, недостижимый для stateless-токенов без дополнительных механизмов блокировки.
Процесс работы начинается с того, что клиент отправляет учётные данные на сервер аутентификации. Сервер проверяет логин и пароль, создаёт запись сессии в хранилище (обычно Redis или база данных) и возвращает клиенту уникальный session token. Клиент сохраняет токен и передаёт его с каждым последующим запросом, а сервер каждый раз проверяет существование и валидность сессии.
Redis — самое популярное хранилище сессий благодаря in-memory хранению и поддержке TTL (time-to-live). Каждая сессия хранится как ключ-значение, где ключ — session token, а значение — JSON-объект с данными сессии. TTL автоматически удаляет просроченные сессии. Альтернативы: Memcached (только память, без сохранения на диск), PostgreSQL/MySQL (персистентность, но медленнее) и DynamoDB (для AWS-инфраструктуры).
Пример структуры сессии в Redis: session:{token} → {"userId": 42, "role": "admin", "createdAt": 1812345678, "lastAccess": 1812345678}. Сервер обновляет lastAccess при каждом запросе, что позволяет реализовать таймаут неактивности — автоматическое завершение сессии после периода бездействия.
Session Token может передаваться двумя способами: через HTTP cookie или через HTTP-заголовок Authorization. Cookie — традиционный способ для веб-приложений: сервер устанавливает cookie с флагами HttpOnly (недоступна JavaScript), Secure (только HTTPS) и SameSite (защита от CSRF). Для мобильных приложений чаще используется заголовок Authorization: Bearer <session_token>, так как cookie-механизм не всегда удобен в нативных клиентах.
Жизненный цикл session token включает три этапа: создание, поддержание активной сессии и завершение. Каждый этап требует правильной настройки безопасности для предотвращения утечки или перехвата токена.
Создание — сервер генерирует криптостойкую случайную строку длиной 128–256 бит (например, через SecureRandom в Java или os.urandom в Python). Токен должен быть не предсказуем — использование UUID или timestamp без энтропии недопустимо. Хранение на клиенте: в iOS — Keychain, в Android — EncryptedSharedPreferences, в вебе — HttpOnly cookie. Удаление происходит при logout: клиент удаляет токен из хранилища, сервер удаляет запись сессии из Redis. После logout session token становится бесполезным — сервер не найдёт соответствующей записи.
По данным SANS Institute, 2025, правильная реализация завершения сессии (logout с очисткой на сервере) предотвращает до 70% атак с использованием украденных токенов. Критически важно не просто удалять токен на клиенте, но и аннулировать сессию на сервере.
Session Token и JWT представляют два разных подхода к аутентификации. Session Token — stateful (сервер хранит состояние), JWT — stateless (данные внутри токена). Выбор между ними зависит от архитектуры приложения и требований к безопасности.
| Критерий | Session Token | JWT |
|---|---|---|
| Модель | Stateful (данные на сервере) | Stateless (данные в токене) |
| Отзыв | Мгновенный — удалить сессию из Redis | Требует blacklist или короткого TTL |
| Размер | 16–64 байта | 500–2000 байт |
| Хранение данных | Только на сервере (безопасно) | Внутри токена (base64, не шифровано) |
| Масштабирование | Требует shared storage (Redis) | Не требует — токен валидируется локально |
| CSRF защита | Требует SameSite cookie + CSRF token | Не требуется (токен в заголовке) |
Session Token предпочтителен, когда: требуется мгновенный отзыв сессий (банкинг, админ-панели), приложение работает на одном или нескольких серверах с общим Redis, данные сессии большие и не помещаются в JWT, или когда команда хочет минимизировать риск утечки данных через декодирование токена. В таких сценариях session token обеспечивает немедленную блокировку доступа при подозрительной активности — достаточно удалить одну запись из Redis, и все сессии пользователя становятся недействительными.
По данным Redis, 2025, использование TTL на уровне ключей сессии (команда EXPIRE) автоматически очищает просроченные сессии без накладных расходов на фоновые задачи. Для сессий с TTL 1 час и нагрузкой 10 000 одновременных пользователей Redis потребляет около 1 GB оперативной памяти при размере сессии 1 KB, что делает его экономически эффективным для большинства приложений.
Безопасность session token основана на двух принципах: токен должен быть непредсказуемым и защищённым при передаче и хранении. Основные угрозы — перехват токена (man-in-the-middle, XSS), его предсказание (слабая генерация) и фиксация сессии (session fixation).
Защита включает: использование HTTPS для всех запросов с токеном, установку короткого TTL сессии (15–60 минут неактивности), привязку сессии к IP и user-agent (дополнительная проверка при каждом запросе), использование Secure и HttpOnly флагов для cookie, регулярную ротацию session token после чувствительных операций (смена пароля, повышение прав). OWASP рекомендует также реализовать Session Management с инвалидацией старой сессии при создании новой после логина — это предотвращает session fixation.
По данным OWASP ASVS, 2025, сессия должна быть привязана минимум к двум факторам: сам токен (что есть у клиента) и IP/user-agent (что известно серверу). При несовпадении этих факторов сервер должен завершить сессию и потребовать повторную аутентификацию.
Ниже приведён пример серверной реализации session token на Kotlin с использованием Spring Boot и Redis. Сервер генерирует криптостойкий токен через SecureRandom, сохраняет сессию в Redis с TTL и проверяет её при каждом запросе. Код демонстрирует три основные операции: создание сессии, валидацию и инвалидацию.
data class Session(
val userId: Long,
val role: String,
val createdAt: Long,
val lastAccess: Long
)
object SessionManager {
private val redis = JedisPool("localhost", 6379)
fun createSession(userId: Long, role: String): String {
val token = generateSecureToken()
val session = Session(userId, role, now(), now())
redis.resource.use { conn ->
conn.setex("session:$token", 3600, toJson(session))
}
return token
}
fun validateSession(token: String): Session? {
redis.resource.use { conn ->
val json = conn.get("session:$token") ?: return null
return fromJson(json)
}
}
fun invalidateSession(token: String) {
redis.resource.use { it.del("session:$token") }
}
private fun generateSecureToken(): String {
val bytes = ByteArray(32)
SecureRandom().nextBytes(bytes)
return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes)
}
}
Данная реализация использует JedisPool для потокобезопасного подключения к Redis. Метод createSession устанавливает TTL 1 час (3600 секунд) — после этого срока Redis автоматически удалит запись. Метод validateSession возвращает null для несуществующих или истёкших сессий, что позволяет серверу корректно обработать запрос с невалидным токеном и вернуть HTTP 401.
Часто задаваемые вопросы
Session token — это идентификатор серверной сессии (stateful). Access token — это учётные данные для доступа к API (может быть JWT или opaque). Session token обычно используется для веб-сессий, access token — для API-запросов в мобильных и SPA-приложениях. Они могут сосуществовать: session token для веба, access token для API.
Основная защита — установка флага HttpOnly на cookie с сессионным токеном. Этот флаг запрещает доступ к cookie из JavaScript, что делает XSS-атаку бесполезной для кражи токена. Дополнительно — флаг SameSite=Strict предотвращает отправку cookie с cross-site запросов, защищая от CSRF.
Рекомендуется два таймаута: абсолютный (8–24 часа — максимальное время жизни сессии) и относительный (15–30 минут неактивности — после этого сессия завершается). Для банковских приложений абсолютный таймаут сокращается до 1–2 часов, для email-клиентов может достигать 7 дней.
Session fixation — атака, при которой злоумышленник заставляет пользователя использовать известный идентификатор сессии. Защита: после успешной аутентификации сервер должен создавать новый session token, а не продолжать использовать переданный клиентом. Старый токен должен инвалидироваться независимо от его происхождения.
Да, session token подходит для REST API, если клиент передаёт его в заголовке Authorization (не cookie). Для мобильных приложений это распространённая практика. Недостаток: при масштабировании на несколько серверов потребуется общее хранилище сессий (Redis), что добавляет точку отказа в архитектуру.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также