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 — най-популярното хранилище за сесии благодарение на съхранението в паметта и поддръжката на 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 или времеви отпечатък без ентропия не е позволено. Съхранение на клиента: в iOS — Keychain, в Android — EncryptedSharedPreferences, в уеб — HttpOnly cookie. Изтриване става при излизане: клиентът изтрива токена от хранилището, сървърът изтрива записа на сесията от Redis. След излизане session token става безполезен — сървърът няма да намери съответния запис.
Според данни на SANS Institute, 2025, правилната имплементация на прекратяване на сесия (излизане с почистване на сървъра) предотвратява до 70% от атаките с използване на откраднати токени. Критично важно е не само да изтриете токена на клиента, но и да анулирате сесията на сървъра.
Session Token и JWT представляват два различни подхода към удостоверяването. Session Token — stateful (сървърът съхранява състоянието), JWT — stateless (данните вътре в токена). Изборът между тях зависи от архитектурата на приложението и изискванията за сигурност.
| Критерий | Session Token | JWT |
|---|---|---|
| Модел | Stateful (данни на сървъра) | Stateless (данни в токена) |
| Отзоваване | Мигновено — изтриване на сесията от Redis | Изисква черен списък или кратък TTL |
| Размер | 16–64 байта | 500–2000 байта |
| Съхранение на данни | Само на сървъра (безопасно) | Вътре в токена (base64, некриптирано) |
| Мащабиране | Изисква споделено хранилище (Redis) | Не изисква — токенът се валидира локално |
| CSRF защита | Изисква SameSite cookie + CSRF token | Не се изисква (токен в заглавката) |
Session Token е за предпочитане, когато: се изисква незабавно отзоваване на сесии (банкиране, админ панели), приложението работи на един или повече сървъри със споделен Redis, данните на сесията са големи и не се побират в JWT, или когато екипът иска да минимизира риска от изтичане на данни чрез декодиране на токена. В такива сценарии session token осигурява незабавно блокиране на достъпа при подозрителна активност — достатъчно е да изтриете един запис от Redis и всички сесии на потребителя стават невалидни.
Според данни на Redis, 2025, използването на TTL на ниво ключове за сесия (команда EXPIRE) автоматично почиства изтеклите сесии без допълнителни разходи за фонови задачи. За сесии с TTL от 1 час и натоварване от 10 000 едновременни потребители при размер на сесията от 1 KB, Redis консумира около 1 GB RAM, което го прави икономически ефективен за повечето приложения.
Сигурността на session token се основава на два принципа: токенът трябва да бъде непредвидим и защитен при предаване и съхранение. Основните заплахи — прихващане на токена (man-in-the-middle, XSS), неговото предвиждане (слабо генериране) и фиксация на сесия (session fixation).
Защитата включва: използване на HTTPS за всички заявки с токен, задаване на кратък TTL на сесията (15–60 минути неактивност), обвързване на сесията с IP и user-agent (допълнителна проверка при всяка заявка), използване на Secure и HttpOnly флагове за cookie, редовна ротация на session token след чувствителни операции (смяна на парола, повишаване на права). OWASP също препоръчва имплементиране на Управление на сесии с инвалидиране на старата сесия при създаване на нова след влизане — това предотвратява фиксация на сесия.
Според данни на 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 часа, за имейл клиенти може да достигне 7 дни.
Session fixation — атака, при която нападателят принуждава потребителя да използва познат идентификатор на сесия. Защита: след успешно удостоверяване сървърът трябва да създаде нов session token, а не да продължи да използва изпратения от клиента. Старият токен трябва да бъде инвалидиран независимо от неговия произход.
Да, session token е подходящ за REST API, ако клиентът го предава в заглавката Authorization (а не cookie). За мобилни приложения това е често срещана практика. Недостатък: при мащабиране на няколко сървъра ще е необходимо споделено хранилище за сесии (Redis), което добавя точка на отказ в архитектурата.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също