Structure d'un JWT (JSON Web Token)
Un JWT est compose de 3 parties separees par des points : header.payload.signature
Header
{
"alg": "RS256", // Algorithme de signature
"typ": "JWT", // Type de token
"kid": "abc123..." // Key ID pour trouver la cle publique
}
Payload (Claims)
{
"exp": 1700000000, // Expiration
"iat": 1699999700, // Emis a (Issued At)
"sub": "user-uuid-123", // Sujet (ID utilisateur)
"iss": "http://localhost:8080/realms/mon-application", // Emetteur
"aud": "mon-backend", // Audience (client destinataire)
"typ": "Bearer",
"azp": "mon-frontend", // Client qui a demande le token
"realm_access": {
"roles": ["admin", "user"]
},
"resource_access": {
"mon-backend": {
"roles": ["read", "write"]
}
},
"scope": "openid email profile",
"email": "jean@example.com",
"name": "Jean Dupont"
}
Signature
La signature garantit l'integrite du token. Keycloak signe avec sa cle privee (RS256 par defaut).
Types de tokens dans Keycloak
- Access Token : Utilise pour acceder aux ressources protegees. Courte duree de vie (5 min par defaut).
- Refresh Token : Utilise pour obtenir un nouvel access token sans re-authentification. Longue duree (30 min par defaut).
- ID Token : Contient les informations d'identite de l'utilisateur (OIDC). Utilise cote frontend uniquement.
Decoder un token
# Methode 1 : avec jq et base64
echo $ACCESS_TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .
# Methode 2 : via l'endpoint d'introspection
curl -s -X POST "http://localhost:8080/realms/mon-application/protocol/openid-connect/token/introspect" \
-d "client_id=mon-backend" \
-d "client_secret=mon-secret-securise" \
-d "token=$ACCESS_TOKEN" | jq .
# Methode 3 : site jwt.io (NE PAS utiliser avec des tokens de production !)
Verifier la signature d'un token
# Recuperer les cles publiques de Keycloak (JWKS)
curl -s "http://localhost:8080/realms/mon-application/protocol/openid-connect/certs" | jq .
# En production, votre application doit :
# 1. Telecharger les cles JWKS au demarrage
# 2. Verifier la signature de chaque token recu
# 3. Verifier les claims (exp, iss, aud)
# 4. Mettre en cache les cles et les rafraichir periodiquement