Une API sûre n’est pas celle qui « passe les tests », c’est celle qui résiste aux idées tordues. Ce guide vous donne une trame de test actionnable, pensée pour les REST/JSON, GraphQL et gRPC, avec un focus sur les faiblesses réelles (authz, BOLA, rate limit, injections, logique métier) et des exemples concrets. Aucune dépendance à des liens externes, juste de la pratique.
1) Préparer le terrain (avant de taper une seule requête)
1.1 Inventaire & contrat
Recenser toutes les surfaces d’attaque : REST /v1/*, GraphQL /graphql, gRPC services, webhooks, fichiers (upload/download), temps réel (SSE/WebSocket), admin/ops.
Comparer l’implémentation au contrat (OpenAPI/Protobuf/SDL GraphQL). Identifier écarts (endpoints non documentés, champs exposés en plus, types permissifs).
Distinguer API publiques, partenaires, internes : les exigences diffèrent (authent, quotas, données).
Jeu de données semi-réaliste : identifiants distincts, objets appartenant à différents propriétaires, cas limites (zéros, montants négatifs, dates anciennes, très futures).
1.3 Environnement & observabilité
Activer logs corrélables (trace-id), masquage des secrets, niveau d’erreur non verbeux en prod.
Prévoir monitoring du 401/403/429/5xx pendant les tests, et quotas isolés par environnement.
JWT/OAuth : vérifier iss/aud/sub/exp/nbf/iat, tolérance d’horloge, rotation des clés, refus de alg=none.
Enforcer PKCE pour clients publics. Scopes granuleux, pas de « scope fourre-tout ».
mTLS si nécessaire (B2B/partenaires sensibles).
Rejet des tokens expirés/révoqués, replay bloqué (nonce/timestamp).
Exemples
# Token expiré
curl -H "Authorization: Bearer <jwt_expiré>" https://api.local/v1/me -i
# Changer le 'aud' et signer avec une autre clé doit échouer
# Vérifier 401/403 et message non verbeux.
3.2 Autorisation (ai-je le droit ?)
Cœur des failles API (BOLA/BFLA/IDOR) : accès à un objet qui ne m’appartient pas ou action non permise.
Cas à forcer
Changer un :id dans /users/{id}/orders.
Soumettre un objet avec ownerId d’autrui.
Essayer DELETE/PUT sur ressource d’un autre.
GraphQL : requêtes avec alias/batching pour traverser des frontières d’autorisations.
Webhooks : rejouer une notification avec vieux timestamp → doit échouer.
Logs d’une 5xx : pas de secrets, trace-id présent.
Le meilleur testeur d’API se comporte en mauvais client: il bidouille les IDs, envoie des champs inattendus, abuse des limites et observe ce que l’API révèle. Avec ce guide, vous avez une base opérationnelle pour casser avant que d’autres ne cassent—et pour reconstruire, proprement, avec des garde-fous mesurables.