Tout formulaire public finit par attirer les robots : spam commercial, injections de liens, inscriptions bidon. La réponse réflexe, c'est d'ajouter un captcha, et neuf fois sur dix, ce captcha s'appelle Google reCAPTCHA. Ce réflexe a un coût que peu de sites mesurent : à chaque affichage du formulaire, c'est votre visiteur qui est envoyé chez un tiers américain, avec son adresse IP, son navigateur et son comportement. Voici pourquoi nous avons remplacé tout ça par ALTCHA, un anti-spam open source auto-hébergé, et ce que ça donne en production sur nos formulaires.

Ce qu'un captcha classique fait vraiment
Un captcha moderne ne vous demande plus de recopier des lettres tordues : il observe. reCAPTCHA v3 attribue un score de confiance en analysant l'adresse IP, les cookies Google déjà présents dans le navigateur, les mouvements de souris, la vitesse de frappe, l'empreinte du navigateur. Pour distinguer un humain d'un robot, il faut profiler l'humain : c'est le principe même du produit.
Toutes ces informations partent chez l'éditeur du captcha. Le formulaire de contact d'une PME alsacienne devient ainsi, sans que personne ne l'ait vraiment décidé, un point de collecte pour une plateforme publicitaire américaine. Et contractuellement, cet éditeur devient un sous-traitant au sens du RGPD : il doit figurer dans votre politique de confidentialité, avec un transfert de données hors Union européenne à encadrer.
reCAPTCHA : le problème juridique est documenté
Ce n'est pas une inquiétude théorique. Dans sa délibération Cityscoot de mars 2022 (SAN-2022-003), la CNIL a retenu que reCAPTCHA lit et écrit des informations sur le terminal de l'utilisateur à des fins qui ne sont pas strictement nécessaires au service, donc qu'il requiert le consentement préalable du visiteur, comme un cookie publicitaire. Concrètement : un reCAPTCHA déployé sans recueil de consentement met le site en défaut, et un reCAPTCHA avec consentement pose une question absurde : que fait-on du visiteur qui refuse ? On lui interdit le formulaire de contact ?
S'ajoutent les griefs classiques : l'accessibilité (les puzzles d'images sont un calvaire pour les personnes malvoyantes), la friction (sélectionner des passages piétons pour envoyer un message), et le modèle économique : la version gratuite de reCAPTCHA est plafonnée à 10 000 évaluations par mois depuis 2024, au-delà c'est payant. Le « gratuit » de Google se paie deux fois : en données de vos visiteurs, puis en facture.
Turnstile : mieux, mais toujours pas chez vous
Cloudflare Turnstile est la réponse « privacy » du marché : pas de puzzle, pas de cookie publicitaire, et c'est gratuit. C'est objectivement mieux que reCAPTCHA : nous l'avions d'ailleurs retenu dans un premier temps sur ce site. Mais le problème structurel demeure : Cloudflare est une société de droit américain, donc dans le champ du Cloud Act. Le script se charge depuis leurs serveurs, la vérification passe par leur infrastructure, et Cloudflare reste un sous-traitant à déclarer, dont vous ne contrôlez ni les conditions, ni les évolutions, ni la télémétrie réelle.
La question n'est pas « ce tiers est-il vertueux aujourd'hui ? » mais « pourquoi un tiers, tout court ? ». Un anti-spam n'a aucune raison technique de faire sortir la moindre donnée de votre serveur.
ALTCHA : la preuve de travail à la place du profilage
ALTCHA (licence MIT, code source public) prend le problème à l'envers. Plutôt que de prouver que le visiteur est humain en l'espionnant, il rend le spam coûteux pour une machine : c'est le mécanisme de preuve de travail (proof of work), le même principe qui protège d'autres systèmes distribués contre l'abus.
- Votre serveur émet un challenge : un condensat cryptographique (SHA-256) construit à partir d'un sel aléatoire et d'un nombre secret, le tout signé HMAC avec une clé que seul votre serveur connaît.
- Le navigateur du visiteur cherche le nombre par force brute, en arrière-plan, pendant que le visiteur remplit tranquillement le formulaire. Aucune interaction : pas de case à cocher, pas de feu tricolore à identifier.
- La solution accompagne l'envoi du formulaire ; le serveur la vérifie par HMAC en quelques millisecondes, marque le challenge comme consommé (anti-rejeu), et traite le message.
// GET /api/altcha/challenge : ce que reçoit le navigateur
{
"algorithm": "SHA-256",
"challenge": "af5c…", // le condensat à inverser
"salt": "a3d8…", // sel aléatoire + expiration
"signature": "9b1f…" // HMAC : le serveur reconnaîtra son propre challenge
}Un visiteur légitime paie ce coût une fois, sans s'en apercevoir. Un spammeur qui arrose dix mille formulaires doit le payer dix mille fois : c'est son modèle économique qu'on attaque, pas sa capacité à cliquer sur des vélos.
Ce que ça change pour la conformité
- Zéro requête vers un tiers : challenge émis et vérifié par votre serveur. Rien ne sort.
- Zéro cookie, zéro fingerprinting : pas de consentement à recueillir, pas de bandeau à rallonger.
- Un sous-traitant de moins dans la politique de confidentialité : chez nous, la bascule a retiré Cloudflare de la liste.
- Accessible : aucune énigme visuelle, rien à résoudre pour le visiteur ; le widget est conforme WCAG et traduit en français.
- Auditable : le code est open source, le mécanisme tient en une page ; comparez avec un score opaque renvoyé par une boîte noire.
En production chez nous : les chiffres
Nous avons déployé ALTCHA sur les formulaires que nous opérons, ce site compris, où il a remplacé Turnstile. Deux réglages méritent d'être partagés, parce que la documentation ne les met pas assez en avant.
Le coût du proof-of-work se dose. Le travail demandé au navigateur croît de façon quadratique avec le paramètre de coût. La valeur des exemples officiels (5 000) impose autour de dix secondes de calcul mono-thread, inacceptable sur un mobile d'entrée de gamme. Nous l'avons mesurée puis abaissée à 1 000 : environ 430 ms en médiane, réparties sur plusieurs Web Workers, et le calcul démarre au chargement du formulaire. Le temps que le visiteur écrive son message, la preuve est faite depuis longtemps.
Un challenge est à usage unique et daté. Le nôtre expire après 30 minutes (assez pour rédiger un long message sans le voir périmer), et une solution déjà consommée est refusée (anti-rejeu). Côté secrets, une seule clé HMAC à faire vivre dans le gestionnaire de secrets : pas de compte chez un prestataire, pas de clé de site, pas de tableau de bord tiers.
reCAPTCHA, Turnstile, ALTCHA : le tableau de décision
- Données visiteur envoyées à un tiers. reCAPTCHA : oui, chez Google (US) · Turnstile : oui, chez Cloudflare (US) · ALTCHA auto-hébergé : non.
- Consentement RGPD requis. reCAPTCHA : oui (position CNIL) · Turnstile : zone grise, sous-traitant à déclarer · ALTCHA : non, aucune donnée personnelle traitée.
- Interaction demandée au visiteur. reCAPTCHA : parfois des puzzles · Turnstile : rarement · ALTCHA : jamais.
- Dépendance de disponibilité. reCAPTCHA et Turnstile : leur panne casse vos formulaires · ALTCHA : tout est chez vous.
- Coût. reCAPTCHA : gratuit jusqu'à 10 000 évaluations/mois · Turnstile : gratuit (tant que Cloudflare le décide) · ALTCHA : gratuit, pour toujours (c'est votre serveur).
Le verdict
Un captcha tiers, c'est un morceau de votre site que vous ne possédez pas, branché sur la donnée de vos visiteurs. ALTCHA prouve qu'on peut protéger un formulaire sans profiler personne, sans sous-traitant supplémentaire et sans facture qui attend son heure, au prix d'une demi-seconde de calcul invisible. C'est la même logique que nous appliquons au reste de la chaîne : analytics sans cookie avec Matomo auto-hébergé, hébergement souverain en France, et maintenant l'anti-spam.
Vous voulez retirer Google ou Cloudflare de vos formulaires sans ouvrir la porte au spam ? On l'a fait sur nos sites et ceux de nos clients : parlons du vôtre.


