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-Token— roté à chaque étape checkout (nouveau base64 24 octets)X-Step-Token— séquentiel :step2→step3→step4→step5X-Signature— recalculé à 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 :
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 :
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 |