Aller au contenu

Chaos Scripting

Le Chaos Scripting augmente progressivement la complexité des tokens HTTP requis sur le parcours checkout, pour former les étudiants aux compétences de scripting de tests de charge (JMeter, k6, Locust, Gatling) : corrélation de tokens, double corrélation, rotation de CSRF, séquencement strict, signature HMAC, et dérivation dynamique de clé.

L'objectif n'est pas de bloquer le parcours métier — une commande avec les bons headers aboutit toujours quel que soit le niveau actif. L'objectif est de forcer le testeur à enrichir progressivement son script pour suivre la complexité croissante du protocole.

Service et endpoint

Classe : ChaosScriptingService.java Controller : ChaosScriptingController.java Endpoint admin : POST /api/admin/chaos/scripting body {"level": 0-4}

Niveaux

Niveau Label Tokens à gérer
0 Désactivé Aucun token requis
1 Junior 1 token (X-Session-Token) à corréler depuis le login
2 Confirmé 2 tokens (Session + Action) — double corrélation
3 Expert 5 tokens — CSRF rotatif + step séquentiel + signature HMAC
4 Maestro Idem Expert + clé HMAC dérivée du sessionToken

Le niveau 4 utilise Maestro au lieu de Master — c'est la seule famille de chaos qui dévie de la nomenclature standard, pour souligner le caractère « art expert » du niveau.

Règle d'or

Le panier reste toujours libre. Seuls le login et les 4 étapes de checkout sont protégés. Les endpoints /api/products et /api/cart/* ne sont jamais validés par ChaosScriptingService quel que soit le niveau actif.

Parcours protégé

sequenceDiagram
    participant C as Client (script)
    participant L as "POST /api/auth/login"
    participant A as "POST /api/checkout/address"
    participant S as "POST /api/checkout/shipping"
    participant P as "POST /api/checkout/payment"
    participant O as "POST /api/orders"
    C->>L: step1 — credentials
    L-->>C: tokens (Session, Action, CSRF, Step=step2, Sig)
    C->>A: step2 — address + tokens
    A-->>C: tokens rotés (CSRF, Step=step3, Sig)
    C->>S: step3 — shipping + tokens rotés
    S-->>C: tokens rotés (CSRF, Step=step4, Sig)
    C->>P: step4 — payment + tokens rotés
    P-->>C: tokens rotés (CSRF, Step=step5, Sig)
    C->>O: step5 — order + tokens rotés
    O-->>C: 200 OK

À chaque étape Expert/Maestro, les tokens CSRF, Step et Signature sont régénérés et retournés au client. Le testeur doit les capturer dans la réponse et les réutiliser dans la requête suivante — c'est le cœur de l'exercice de scripting avancé.

Bundles de tokens

ChaosScriptingService stocke un TokenBundle par session HTTP dans une ConcurrentHashMap<String, TokenBundle> (clé = session.getId()). Chaque bundle contient :

Champ Mutabilité Description
sessionToken final UUID généré au login, jamais modifié
actionToken final UUID généré au login, jamais modifié
email final Email du compte loggé
csrfToken volatile Roté à chaque étape (24 octets base64)
stepToken volatile step1 → step2 → … → step5
signature volatile HMAC recalculé après rotation
hmacKey volatile (Maestro) Clé dérivée du sessionToken

Niveau 1 — Junior

Compétence visée : corrélation basique d'un token depuis une réponse HTTP.

Étape Endpoint Headers requis
Login POST /api/auth/login (génère les tokens en réponse)
Address POST /api/checkout/address X-Session-Token, X-Request-ID
Shipping POST /api/checkout/shipping X-Session-Token, X-Request-ID
Payment POST /api/checkout/payment X-Session-Token, X-Request-ID
Order POST /api/orders X-Session-Token, X-Request-ID

Le X-Request-ID est généré côté client (un UUID différent par requête), le X-Session-Token doit être extrait de la réponse de /api/auth/login et réutilisé tel quel dans toutes les étapes suivantes.

Niveau 2 — Confirmé

Compétence visée : double corrélation, gestion du re-login en charge.

Le login génère trois headers au lieu de deux : X-Session-Token, X-Action-Token, X-Request-ID. Les deux premiers doivent être propagés sur les 4 étapes du checkout. Le testeur doit aussi gérer le re-login périodique pour rafraîchir les tokens en cas de session longue.

Niveau 3 — Expert

Compétence visée : corrélation multi-tokens rotatifs, séquencement strict, signature HMAC-SHA256.

À ce niveau, cinq headers supplémentaires apparaissent et trois d'entre eux tournent à chaque étape :

  • X-Session-Token — fixe (login)
  • X-Action-Token — fixe (login)
  • X-CSRF-Tokenroté à chaque étape checkout (nouveau base64 24 octets)
  • X-Step-Tokenséquentiel : step2step3step4step5
  • X-Signaturerecalculé à chaque rotation (HMAC-SHA256)

Calcul de la signature

La signature HMAC est calculée selon la formule :

signature = base64url(HMAC-SHA256(payload, key))
payload   = sessionToken + ":" + csrfToken + ":" + stepToken
key       = HMAC_SECRET (Expert) | hmacKey (Maestro)

Au niveau Expert, la clé est statique :

HMAC_SECRET = "perfshop-chaos-expert-secret-2025"

Le testeur doit recalculer la signature à chaque étape avec les nouvelles valeurs de csrfToken et stepToken extraites de la réponse précédente.

Niveau 4 — Maestro

Compétence visée : dérivation dynamique de clé HMAC, reverse engineering partiel.

Identique à Expert, mais la clé HMAC n'est plus statique : elle est dérivée du sessionToken au moment du login :

hmacKey = base64url(HMAC-SHA256(sessionToken, HMAC_SECRET))

Chaque session a donc sa propre clé HMAC, et le testeur doit recalculer cette clé après chaque login. Pour aider à vérifier la dérivation, le login retourne un header X-Key-Hint contenant les 8 premiers caractères de la clé dérivée — le testeur compare son calcul local à ce hint avant de signer la première étape.

Codes d'erreur

Code HTTP Code d'erreur Cause
400 400 Header obligatoire manquant (Session, Request-ID, Action)
401 401 X-Session-Token ne correspond à aucun bundle
401 E-TKN-99 Aucun bundle actif — relogin nécessaire
401 E-SIG-07 Signature manquante ou invalide (Expert)
401 E-HMAC-03 Signature invalide (Maestro)
403 E-CSRF-01 X-CSRF-Token manquant ou invalide
409 E-STEP-04 X-Step-Token manquant ou hors séquence
422 422 X-Action-Token ne correspond pas au bundle

Les codes E-* sont PerfShop-specific — ils permettent au testeur de diagnostiquer rapidement quel élément du protocole a échoué sans ambiguïté.

Métriques Prometheus

Métrique Type Description
chaos_scripting_level Gauge Niveau courant (0–4)
chaos_scripting_bundles_active Gauge Nombre de bundles actifs (sessions loggées)

Le compteur bundles_active est utile pour observer la pression mémoire des sessions sous test de charge — chaque login crée un bundle qui n'est nettoyé qu'à l'expiration de session HTTP.

API — endpoints admin

# Activer le niveau Expert
curl -X POST https://perfshop-api.perfshop.io/api/admin/chaos/scripting \
  -H "X-Admin-Token: $TOKEN" -H "Content-Type: application/json" \
  -d '{"level": 3}'

# Statut courant
curl https://perfshop-api.perfshop.io/api/admin/chaos/scripting/status \
  -H "X-Admin-Token: $TOKEN"

# Reset (niveau 0 + tous les bundles effacés)
curl -X POST https://perfshop-api.perfshop.io/api/admin/chaos/scripting/reset \
  -H "X-Admin-Token: $TOKEN"

API — logs admin

# Récupérer les 100 derniers événements (login, validations OK, rejets)
curl https://perfshop-api.perfshop.io/api/admin/chaos/scripting/logs \
  -H "X-Admin-Token: $TOKEN"

# Vider les logs
curl -X DELETE https://perfshop-api.perfshop.io/api/admin/chaos/scripting/logs \
  -H "X-Admin-Token: $TOKEN"

L'activity log conserve les 100 derniers événements, plus récent en premier. Chaque entrée contient : ts, type (LOGIN/OK/REJECT/RESET/LEVEL), session (8 premiers caractères du session ID), email, token (token complet pour l'admin), detail, ok (booléen).

Endpoints publics

curl https://perfshop-api.perfshop.io/api/chaos/public/scripting/status
curl https://perfshop-api.perfshop.io/api/chaos/public/scripting/logs

Ces endpoints sont délégués à ChaosScriptingPublicController et exposent l'état + les logs sans authentification, pour alimenter le monitoring temps réel.

Activation par l'étudiant

POST /api/chaos/student/scripting body {"level": N} — exige le mode étudiant. Le niveau est plafonné à 1 sans licence (freemium), 4 avec licence valide.

Pertinence pédagogique

Niveau Compétence JMeter / k6 démontrée
Junior Regular Expression Extractor sur la réponse de login
Confirmé Double extracteur, gestion du re-login périodique
Expert Extracteur multi-tokens, calcul HMAC via JSR-223 / crypto.hmac
Maestro Dérivation de clé en pré-processeur, vérification du X-Key-Hint