Tokens et securite 22 min de lecture

Structure des JWT et types de tokens

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