Principes

  1. Une clé par service / environnement. Pas une clé partagée entre dev et prod, ni entre microservices indépendants. Si une clé fuite, vous révoquez uniquement le service impacté.
  2. Scopes minimum. Un service qui ne fait que créer des PaymentIntents → payment_intents:write uniquement. Pas payouts:write.
  3. IP allowlist pour les serveurs avec IP statique (AWS NAT, OVH, Hetzner).
  4. Rotation périodique : tous les 6-12 mois minimum.
  5. 2FA active sur le compte du membre qui gère les clés.

Stockage

TypeRecommandation
Vercel / NetlifyEnvironment Variables (chiffrées au repos)
AWSSecrets Manager ou Parameter Store (KMS encrypted)
GCPSecret Manager
Self-hostedHashiCorp Vault, sops, Doppler
Local dev.env.local dans .gitignore, JAMAIS commiter
Si une clé est accidentellement commitée :
  1. Révoquez immédiatement depuis le dashboard (TOTP requis)
  2. Créez une nouvelle clé
  3. Rotez dans tous vos environnements
  4. Si la fuite est publique (GitHub public), faites un git filter-repo pour purger l’historique, mais traitez d’abord la clé comme compromise

Format

sk_live_a1b2c3d4...  (64 caractères hexadécimaux après le préfixe — 72 au total)
sk_test_a1b2c3d4...
Le format est validé côté serveur : sk_live_ ou sk_test_ suivi de 64 caractères hexadécimaux. Toute autre forme renvoie 401 Invalid API key.

Granularité avancée

Pour un setup avec backend multi-tenant (vous opérez plusieurs marchands IzichangePay), gérez une clé par tenant côté votre app et utilisez-la pour les appels à ce tenant. Pas de risque de cross-contamination.
Les sessions dashboard sont indépendantes des clés API. Une fuite de clé n’expose pas votre compte au login dashboard : le mot de passe et la 2FA restent requis.

Audit

Chaque action de gestion (create, rotate, révoque, IP change) est tracée dans Paramètres → Audit log avec :
  • Qui (membre + IP)
  • Quoi (action + ID de la clé)
  • Quand (timestamp)
  • Avant / après (pour les modifications)