الأمان و OTP

OTP WhatsApp : sécurité avancée avec tokens JWT signés

12 دقيقة قراءة20 يناير 2026

Sécuriser vos OTP WhatsApp au Maroc avec des tokens JWT signés : architecture, rotation des clés et protection contre le rejeu.

OTP WhatsApp : sécurité avancée avec tokens JWT signés

L'OTP WhatsApp est devenu un standard d'authentification au Maroc. Mais un code à six chiffres n'est pas suffisant à lui seul face aux attaques modernes : phishing, SIM swap, rejeu, interception. Ajouter une couche de tokens JWT signés permet de renforcer significativement la sécurité, sans dégrader l'expérience utilisateur.

Rappel : ce qu'est un OTP WhatsApp

Un OTP WhatsApp est un code à usage unique envoyé au client via un template Meta de la catégorie Authentication. Il sert à prouver que la personne qui saisit le code contrôle bien le numéro. Le bouton "Copier le code" ou le one-tap autofill Android en font l'un des mécanismes les plus fluides du marché.

Les limites d'un OTP seul

  • Rejeu : si un attaquant intercepte le code (session compromise, écran partagé), il peut l'utiliser avant le vrai utilisateur.
  • Absence de contexte : le code ne dit pas depuis quel appareil, quelle IP ou pour quelle action il est demandé.
  • Intégrité côté serveur : le serveur doit maintenir un état (code, expiration, tentatives), avec une charge non triviale à grande échelle.

Le pattern OTP + JWT signé

L'idée : lier chaque OTP à un JWT signé côté serveur qui embarque l'ensemble du contexte de la demande. Le client reçoit deux éléments : le code (via WhatsApp) et un token opaque (via la réponse HTTP à sa demande initiale). Pour valider, il renvoie le code + le token.

Contenu du JWT

Le token embarque au minimum :

  • Identifiant unique de la demande (jti).
  • Hash du code OTP (jamais le code en clair).
  • Numéro de téléphone hashé.
  • Action demandée (login, paiement, changement de mot de passe).
  • Fingerprint navigateur ou appareil.
  • Date d'émission (iat) et d'expiration (exp), typiquement 5 minutes.
  • Nonce anti-rejeu.

Signature

Le JWT est signé avec un algorithme robuste (RS256 ou ES256) via une clé privée serveur. Le client ne peut ni modifier ni forger le token.

Architecture recommandée

Flow côté application

  1. L'utilisateur demande un OTP (login, paiement, etc.).
  2. Le serveur génère un code aléatoire, calcule son hash, construit le JWT avec tout le contexte et le signe.
  3. Le serveur envoie le code via WhatsApp Business API (template Authentication).
  4. Le serveur renvoie le JWT au client dans la réponse HTTP.
  5. L'utilisateur reçoit le code sur WhatsApp, le saisit dans l'app.
  6. L'app envoie code + JWT au serveur.
  7. Le serveur vérifie la signature, l'expiration, recalcule le hash du code, compare avec celui embarqué dans le JWT, et vérifie le nonce en base pour éviter le rejeu.
  8. Si tout est valide, l'authentification aboutit.

Gestion des nonces

Chaque JWT porte un nonce unique. Une fois consommé, il est stocké côté serveur (Redis avec TTL) pour empêcher toute réutilisation. Un même token ne peut donc servir qu'une seule fois.

Rotation des clés de signature

La clé privée utilisée pour signer les JWT doit être gérée comme un secret critique :

  • Stockage dans un HSM ou un KMS (AWS KMS, GCP KMS, Azure Key Vault).
  • Rotation régulière (par exemple tous les 90 jours).
  • Support de plusieurs clés valides simultanément (kid dans le header JWT) pour éviter les coupures pendant la rotation.
  • Journalisation des accès à la clé.

Protection contre les attaques courantes

Attaques par force brute

Malgré le JWT, un attaquant pourrait essayer les 1 000 000 combinaisons d'un code à six chiffres. Contre-mesure : limiter le nombre de tentatives par JWT (3 à 5), bloquer temporairement le numéro et l'IP au-delà, et suivre les schémas suspects (mêmes numéros essayés, mêmes IP).

Phishing

Un utilisateur peut être piégé pour communiquer son code à un tiers. Contre-mesure : rappeler dans le template WhatsApp "Ne partagez jamais ce code, pas même à un employé", et inclure dans le message le nom de l'action (par exemple "Confirmation d'un virement de 3 200 MAD").

SIM swap

Un attaquant récupère la SIM du client. Contre-mesure : détecter les changements de fingerprint appareil, exiger une re-vérification avec un facteur additionnel (biométrie, question de sécurité) sur les actions les plus sensibles.

Rejeu

Le nonce unique et l'expiration courte du JWT rendent cette attaque quasi impossible en pratique.

Bonnes pratiques d'implémentation

  • Ne jamais logger le code OTP en clair, même pour du debug.
  • Ne jamais logger le JWT complet, seulement l'identifiant de la requête.
  • Prévoir un endpoint de renvoi OTP avec cooldown (par exemple 60 secondes).
  • Prévoir un fallback SMS déclenché automatiquement si l'OTP WhatsApp n'est pas livré.
  • Surveiller le taux de succès OTP par version d'app, par pays, par opérateur (IAM, Orange, Inwi) pour détecter les anomalies.

Conclusion

Coupler l'OTP WhatsApp à des JWT signés élève significativement le niveau de sécurité, sans complexifier l'expérience utilisateur. Pour les banques, fintechs et plateformes marocaines manipulant des transactions à valeur élevée, cette architecture est aujourd'hui un standard de fait — plus robuste qu'un OTP seul, plus léger qu'une session serveur à état.

جرّب Adrixis ميتا مجانًا. سبعة أيام، بدون بطاقة.