Session Token est un identifiant unique que le serveur crée après l’authentification réussie de l’utilisateur et utilise pour identifier les requêtes suivantes. Contrairement aux jetons autonomes (JWT), le session token est une chaîne aléatoire qui ne contient pas de données en elle-même : toutes les informations de session sont stockées sur le serveur dans la RAM ou une base de données. Selon OAuth.com, 2025, le session token reste le mécanisme d’authentification le plus répandu dans les applications web côté serveur et les architectures mobiles hybrides.
Points clés
Session Token (identifiant de session) est une chaîne unique que le serveur génère et associe aux données de session après l’authentification de l’utilisateur. Le jeton ne contient aucune information utilisateur — c’est simplement une clé vers les données stockées sur le serveur. Cette approche est appelée authentification stateful : le serveur stocke l’état de chaque session active et le vérifie à chaque requête.
Les données de session incluent : identifiant utilisateur, heure de connexion, adresse IP, user-agent, liste d’autorisations, heure de dernière activité. Lorsque le client envoie une requête avec un session token, le serveur trouve l’enregistrement correspondant dans le stockage de sessions, vérifie sa validité et récupère les données pour traiter la requête. Si l’enregistrement de session est manquant ou a expiré, le serveur renvoie une erreur d’authentification et demande une nouvelle connexion.
Selon OWASP, 2025, le session token reste la norme pour les applications nécessitant une révocation immédiate d’accès — par exemple, dans les systèmes bancaires et les portails d’entreprise où un administrateur doit pouvoir mettre fin à la session d’un utilisateur instantanément. Dans ces systèmes, le session token offre un contrôle total de l’accès qui est inaccessible aux jetons stateless sans mécanismes de blocage supplémentaires.
Le processus commence lorsque le client envoie les identifiants au serveur d’authentification. Le serveur vérifie le nom d’utilisateur et le mot de passe, crée un enregistrement de session dans le stockage (généralement Redis ou une base de données) et renvoie un session token unique au client. Le client conserve le jeton et l’envoie avec chaque requête suivante, et le serveur vérifie à chaque fois l’existence et la validité de la session.
Redis est le stockage de sessions le plus populaire grâce au stockage en mémoire et au support TTL (durée de vie). Chaque session est stockée comme une paire clé-valeur, où la clé est le session token et la valeur est un objet JSON contenant les données de session. Le TTL supprime automatiquement les sessions expirées. Alternatives : Memcached (mémoire seulement, sans persistance sur disque), PostgreSQL/MySQL (persistants mais plus lents) et DynamoDB (pour l’infrastructure AWS).
Exemple de structure de session dans Redis : session:{token} → {“userId”: 42, “role”: “admin”, “createdAt”: 1812345678, “lastAccess”: 1812345678}. Le serveur met à jour lastAccess à chaque requête, ce qui permet d’implémenter un délai d’inactivité — une terminaison automatique de la session après une période sans activité.
Session Token peut être transmis de deux manières : via un cookie HTTP ou via l’en-tête HTTP Authorization. Les cookies sont la méthode traditionnelle pour les applications web : le serveur définit un cookie avec les drapeaux HttpOnly (inaccessible depuis JavaScript), Secure (HTTPS uniquement) et SameSite (protection CSRF). Pour les applications mobiles, l’en-tête Authorization: Bearer <session_token> est plus couramment utilisé, car le mécanisme de cookie n’est pas toujours pratique dans les clients natifs.
Le cycle de vie du session token comprend trois étapes : la création, le maintien de la session active et la terminaison. Chaque étape nécessite une configuration de sécurité appropriée pour éviter la fuite ou l’interception du jeton.
Création — le serveur génère une chaîne aléatoire cryptographiquement sûre de 128 à 256 bits (par exemple, via SecureRandom en Java ou os.urandom en Python). Le jeton doit être imprévisible — l’utilisation d’UUID ou d’horodatage sans entropie n’est pas acceptable. Stockage côté client : sur iOS — Keychain, sur Android — EncryptedSharedPreferences, sur le web — cookie HttpOnly. Suppression se produit à la déconnexion : le client supprime le jeton du stockage, le serveur supprime l’enregistrement de session de Redis. Après la déconnexion, le session token devient inutile — le serveur ne trouve pas d’enregistrement correspondant.
Selon SANS Institute, 2025, une implémentation correcte de la terminaison de session (déconnexion avec nettoyage côté serveur) prévient jusqu’à 70 % des attaques utilisant des jetons volés. Il est crucial non seulement de supprimer le jeton côté client, mais aussi d’invalider la session sur le serveur.
Session Token et JWT représentent deux approches différentes de l’authentification. Session Token est stateful (le serveur stocke l’état), JWT est stateless (les données à l’intérieur du jeton). Le choix entre eux dépend de l’architecture de l’application et des exigences de sécurité.
| Critère | Session Token | JWT |
|---|---|---|
| Modèle | Stateful (données sur le serveur) | Stateless (données dans le jeton) |
| Révocation | Instantanée — supprimer la session de Redis | Nécessite une liste noire ou un TTL court |
| Taille | 16–64 octets | 500–2000 octets |
| Stockage des données | Serveur uniquement (sécurisé) | À l’intérieur du jeton (base64, non chiffré) |
| Passage à l’échelle | Nécessite un stockage partagé (Redis) | Non requis — le jeton est validé localement |
| Protection CSRF | Nécessite un cookie SameSite + jeton CSRF | Non requis (jeton dans l’en-tête) |
Session Token est préférable lorsque : une révocation immédiate des sessions est requise (services bancaires, panneaux d’administration), l’application fonctionne sur un ou plusieurs serveurs avec un Redis partagé, les données de session sont volumineuses et ne tiennent pas dans un JWT, ou l’équipe souhaite minimiser le risque de fuite de données par décodage du jeton. Dans ces scénarios, le session token fournit un blocage immédiat de l’accès en cas d’activité suspecte — il suffit de supprimer un enregistrement de Redis pour que toutes les sessions de l’utilisateur deviennent invalides.
Selon Redis, 2025, l’utilisation de TTL au niveau des clés de session (commande EXPIRE) nettoie automatiquement les sessions expirées sans surcharge sur les tâches d’arrière-plan. Pour des sessions avec un TTL d’une heure et une charge de 10 000 utilisateurs simultanés, Redis consomme environ 1 Go de RAM pour une taille de session de 1 Ko, ce qui le rend rentable pour la plupart des applications.
La sécurité du session token repose sur deux principes : le jeton doit être imprévisible et protégé lors de la transmission et du stockage. Les principales menaces sont l’interception du jeton (man-in-the-middle, XSS), sa prédiction (génération faible) et la fixation de session (session fixation).
La protection comprend : l’utilisation de HTTPS pour toutes les requêtes avec jeton, la définition d’un TTL court de session (15–60 minutes d’inactivité), la liaison de la session à l’IP et au user-agent (vérification supplémentaire à chaque requête), l’utilisation des drapeaux Secure et HttpOnly pour les cookies, et la rotation régulière du session token après des opérations sensibles (changement de mot de passe, élévation de privilèges). OWASP recommande également d’implémenter une Gestion de Sessions avec invalidation de l’ancienne session lors de la création d’une nouvelle après connexion — cela empêche la fixation de session.
Selon OWASP ASVS, 2025, une session doit être liée à au moins deux facteurs : le jeton lui-même (ce que le client possède) et l’IP/user-agent (ce que le serveur sait). Si ces facteurs ne correspondent pas, le serveur doit mettre fin à la session et demander une ré-authentification.
Ci-dessous un exemple d’implémentation côté serveur d’un session token en Kotlin avec Spring Boot et Redis. Le serveur génère un jeton cryptographiquement sûr via SecureRandom, enregistre la session dans Redis avec TTL et la vérifie à chaque requête. Le code démontre trois opérations principales : la création de session, la validation et l’invalidation.
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)
}
}
Cette implémentation utilise JedisPool pour une connexion thread-safe à Redis. La méthode createSession définit un TTL d’une heure (3600 secondes) — après cette période, Redis supprimera automatiquement l’enregistrement. La méthode validateSession renvoie null pour les sessions inexistantes ou expirées, ce qui permet au serveur de traiter correctement une requête avec un jeton invalide et de renvoyer HTTP 401.
Questions fréquentes
Session token est un identifiant de session côté serveur (stateful). L’access token est un identifiant pour l’accès à l’API (peut être JWT ou opaque). Le session token est généralement utilisé pour les sessions web, tandis que l’access token est utilisé pour les requêtes API dans les applications mobiles et SPA. Ils peuvent coexister : session token pour le web, access token pour l’API.
La protection principale consiste à définir le drapeau HttpOnly sur le cookie contenant le jeton de session. Ce drapeau interdit l’accès au cookie depuis JavaScript, rendant les attaques XSS inutiles pour voler le jeton. De plus, le drapeau SameSite=Strict empêche l’envoi du cookie avec des requêtes cross-site, protégeant ainsi contre CSRF.
Deux délais sont recommandés : un délai absolu (8–24 heures — durée maximale de la session) et un délai relatif (15–30 minutes d’inactivité — après quoi la session se termine). Pour les applications bancaires, le délai absolu est réduit à 1–2 heures ; pour les clients de messagerie, il peut atteindre 7 jours.
Session fixation est une attaque où un attaquant force un utilisateur à utiliser un identifiant de session connu. Protection : après une authentification réussie, le serveur doit créer un nouveau session token plutôt que de continuer à utiliser celui fourni par le client. L’ancien jeton doit être invalidé quelle que soit son origine.
Oui, le session token convient à une API REST si le client l’envoie dans l’en-tête Authorization (pas dans un cookie). Pour les applications mobiles, c’est une pratique courante. Inconvénient : lors du passage à l’échelle sur plusieurs serveurs, un stockage de sessions partagé (Redis) est nécessaire, ce qui ajoute un point de défaillance unique dans l’architecture.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi