Session Token в разработке приложений — что это такое, принцип работы и отличия от JWT

Автор: IT Sectr Опубликовано: 2026-04-05 Время чтения: 9 мин

Session Token — это уникальный идентификатор, который сервер создаёт после успешной аутентификации пользователя и использует для идентификации последующих запросов. В отличие от самодостаточных токенов (JWT), session token — это случайная строка, которая сама по себе не содержит данных: вся информация о сессии хранится на сервере в оперативной памяти или базе данных. По данным OAuth.com, 2025, session token остаётся наиболее распространённым механизмом аутентификации в серверных веб-приложениях и гибридных мобильных архитектурах.

Главное

  • Session Token — случайный идентификатор, ссылающийся на серверные данные сессии
  • Stateful — сервер хранит состояние сессии в Redis, Memcached или базе данных
  • Простой отзыв — достаточно удалить запись сессии на сервере, и токен становится недействительным
  • Безопасность — данные не хранятся в токене, что исключает их утечку через декодирование
  • Cookie — традиционный способ передачи session token в веб-приложениях с флагами HttpOnly, Secure и SameSite

Что такое Session Token?

Session Token (идентификатор сессии) — это уникальная строка, которую сервер генерирует и связывает с данными сессии после аутентификации пользователя. Токен не содержит никакой информации о пользователе — это просто ключ к данным, хранящимся на сервере. Такой подход называется stateful аутентификацией: сервер хранит состояние каждой активной сессии и проверяет его при каждом запросе.

Данные сессии включают: идентификатор пользователя, время входа, IP-адрес, user-agent, список разрешений (permissions), время последней активности. Когда клиент отправляет запрос с session token, сервер находит соответствующую запись в хранилище сессий, проверяет её валидность и извлекает данные для обработки запроса. Если запись сессии отсутствует или истекла, сервер возвращает ошибку аутентификации и требует повторного входа.

По данным OWASP, 2025, session token остаётся стандартом для приложений, где требуется немедленный отзыв доступа — например, в банковских системах и корпоративных порталах, где администратор должен иметь возможность завершить сессию пользователя мгновенно. В таких системах session token обеспечивает полный контроль над доступом, недостижимый для stateless-токенов без дополнительных механизмов блокировки.

Как работает Session Token

Процесс работы начинается с того, что клиент отправляет учётные данные на сервер аутентификации. Сервер проверяет логин и пароль, создаёт запись сессии в хранилище (обычно 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 при каждом запросе, что позволяет реализовать таймаут неактивности — автоматическое завершение сессии после периода бездействия.

Cookie vs Header

Session Token может передаваться двумя способами: через HTTP cookie или через HTTP-заголовок Authorization. Cookie — традиционный способ для веб-приложений: сервер устанавливает cookie с флагами HttpOnly (недоступна JavaScript), Secure (только HTTPS) и SameSite (защита от CSRF). Для мобильных приложений чаще используется заголовок Authorization: Bearer <session_token>, так как cookie-механизм не всегда удобен в нативных клиентах.

Жизненный цикл Session Token

Жизненный цикл 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 vs JWT

Session Token и JWT представляют два разных подхода к аутентификации. Session Token — stateful (сервер хранит состояние), JWT — stateless (данные внутри токена). Выбор между ними зависит от архитектуры приложения и требований к безопасности.

КритерийSession TokenJWT
МодельStateful (данные на сервере)Stateless (данные в токене)
ОтзывМгновенный — удалить сессию из RedisТребует blacklist или короткого TTL
Размер16–64 байта500–2000 байт
Хранение данныхТолько на сервере (безопасно)Внутри токена (base64, не шифровано)
МасштабированиеТребует shared storage (Redis)Не требует — токен валидируется локально
CSRF защитаТребует SameSite cookie + CSRF tokenНе требуется (токен в заголовке)

Когда выбрать Session Token

Session Token предпочтителен, когда: требуется мгновенный отзыв сессий (банкинг, админ-панели), приложение работает на одном или нескольких серверах с общим Redis, данные сессии большие и не помещаются в JWT, или когда команда хочет минимизировать риск утечки данных через декодирование токена. В таких сценариях session token обеспечивает немедленную блокировку доступа при подозрительной активности — достаточно удалить одну запись из Redis, и все сессии пользователя становятся недействительными.

По данным Redis, 2025, использование TTL на уровне ключей сессии (команда EXPIRE) автоматически очищает просроченные сессии без накладных расходов на фоновые задачи. Для сессий с TTL 1 час и нагрузкой 10 000 одновременных пользователей Redis потребляет около 1 GB оперативной памяти при размере сессии 1 KB, что делает его экономически эффективным для большинства приложений.

Безопасность Session Token

Безопасность 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 (что известно серверу). При несовпадении этих факторов сервер должен завершить сессию и потребовать повторную аутентификацию.

Пример реализации на Kotlin

Ниже приведён пример серверной реализации session token на Kotlin с использованием Spring Boot и Redis. Сервер генерирует криптостойкий токен через SecureRandom, сохраняет сессию в Redis с TTL и проверяет её при каждом запросе. Код демонстрирует три основные операции: создание сессии, валидацию и инвалидацию.

kotlin
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 отличается от access token?

Session token — это идентификатор серверной сессии (stateful). Access token — это учётные данные для доступа к API (может быть JWT или opaque). Session token обычно используется для веб-сессий, access token — для API-запросов в мобильных и SPA-приложениях. Они могут сосуществовать: session token для веба, access token для API.

Как защитить session token от XSS-атак?

Основная защита — установка флага HttpOnly на cookie с сессионным токеном. Этот флаг запрещает доступ к cookie из JavaScript, что делает XSS-атаку бесполезной для кражи токена. Дополнительно — флаг SameSite=Strict предотвращает отправку cookie с cross-site запросов, защищая от CSRF.

Сколько должен жить session token?

Рекомендуется два таймаута: абсолютный (8–24 часа — максимальное время жизни сессии) и относительный (15–30 минут неактивности — после этого сессия завершается). Для банковских приложений абсолютный таймаут сокращается до 1–2 часов, для email-клиентов может достигать 7 дней.

Что такое session fixation?

Session fixation — атака, при которой злоумышленник заставляет пользователя использовать известный идентификатор сессии. Защита: после успешной аутентификации сервер должен создавать новый session token, а не продолжать использовать переданный клиентом. Старый токен должен инвалидироваться независимо от его происхождения.

Можно ли использовать session token в REST API?

Да, session token подходит для REST API, если клиент передаёт его в заголовке Authorization (не cookie). Для мобильных приложений это распространённая практика. Недостаток: при масштабировании на несколько серверов потребуется общее хранилище сессий (Redis), что добавляет точку отказа в архитектуру.

Итоги

  • Session Token — stateful идентификатор, ссылающийся на серверные данные сессии
  • Преимущество — мгновенный отзыв и полный контроль над сессиями на сервере
  • Хранилище — Redis, Memcached или БД с TTL для автоматической очистки
  • Безопасность — SecureRandom генерация, HTTPS, HttpOnly + SameSite cookie
  • Session vs JWT — Session проще отозвать, JWT проще масштабировать
  • Таймауты — абсолютный (8–24ч) и относительный (15–30 мин неактивности)
  • Session fixation — предотвращается созданием нового токена после логина

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также