Atelier gratuit : construire avec l'IA sans perdre la maîtrise du projet Voir l'atelier →
vibebusters

← Tout le glossaire

// glossaire

Clé secrète Supabase (service_role) : le passe-partout de ta base

En bref

La clé secrète Supabase, appelée service_role dans l'ancien système de clés, donne un accès administrateur à la base et contourne toutes les règles Row Level Security. Elle sert aux traitements côté serveur et ne doit jamais apparaître dans le code exécuté par le navigateur.

Supabase fournit deux familles de clés. La première, publique, peut circuler dans le navigateur parce que les règles Row Level Security la filtrent. La seconde, secrète, passe outre toutes ces règles. C'est un outil d'administration, très utile côté serveur, et c'est la clé qui ne doit jamais quitter le serveur.

Deux générations de clés

Supabase a introduit un nouveau système de clés, qui remplace progressivement l'ancien :

Usage Nouveau nom Ancien nom Peut aller dans le navigateur
Accès public, filtré par le RLS sb_publishable_... anon Oui
Accès administrateur, contourne le RLS sb_secret_... service_role Non

La documentation Supabase précise que la clé secrète passe par le rôle Postgres service_role, qui possède l'attribut bypassrls. Supabase annonce la dépréciation des anciennes clés anon et service_role d'ici fin 2026. Créer les nouvelles clés ne révoque pas les anciennes : elles restent actives tant que tu ne les désactives pas dans Settings, puis API Keys.

Supabase ajoute une protection utile : une clé secrète utilisée depuis un navigateur est refusée avec une erreur 401, détectée grâce à l'en-tête User-Agent. C'est un bon garde-fou pour les nouvelles clés, qui ne couvre pas une ancienne clé service_role ni une clé copiée dans un script ou une app mobile.

À quoi sert la clé secrète

Elle est faite pour les traitements que personne ne déclenche directement depuis l'écran, ou qui doivent agir au-delà des droits d'un utilisateur :

  • Un webhook de paiement qui met à jour l'abonnement d'un client après un paiement Stripe
  • Une tâche planifiée qui archive les anciennes données ou envoie un rapport
  • Une fonction d'administration qui crée un compte, réinitialise un accès ou fusionne des doublons
  • Une migration ou un import de données en masse

Dans une app Supabase, ces traitements vivent dans des Edge Functions. Supabase met à leur disposition les clés du projet sous forme de variables d'environnement (SUPABASE_SECRET_KEYS, ou l'ancienne SUPABASE_SERVICE_ROLE_KEY), lues avec Deno.env.get. La clé reste sur le serveur et n'apparaît jamais dans les fichiers envoyés au navigateur.

Comment elle se retrouve au mauvais endroit

Le scénario le plus courant dans une app construite avec l'IA est très simple. Une fonctionnalité bute sur une règle RLS : la liste reste vide, l'enregistrement échoue. L'outil cherche à faire passer la fonctionnalité et trouve une solution qui marche immédiatement, en utilisant la clé qui ne connaît aucune règle. L'écran fonctionne, le problème semble résolu, et la clé administrateur se retrouve dans le code livré à chaque visiteur.

Deux autres chemins existent : une clé collée dans un fichier .env envoyé sur GitHub, et une clé écrite en dur dans un script de test resté dans le dépôt. Dans les trois cas, la clé devient un secret exposé.

Comment vérifier ton app

  1. Cherche les noms dans le code exporté : service_role, sb_secret_, SERVICE_ROLE. Notre guide sur l'export du code explique comment récupérer le dépôt si ce n'est pas déjà fait
  2. Regarde le code servi dans le navigateur : outils de développement, onglet Sources ou Réseau. Une clé administrateur ne doit apparaître dans aucun fichier JavaScript ni dans aucune requête
  3. Inspecte l'historique Git, pas seulement la version actuelle. Une clé supprimée du code reste lisible dans les anciens commits
  4. Liste les fonctions serveur qui utilisent la clé secrète et vérifie que chacune contrôle elle-même qui l'appelle. Une Edge Function ouverte à tous qui utilise la clé secrète équivaut à une table sans règle
  5. Fais l'inventaire des clés actives dans le tableau de bord, anciennes comprises

Un exemple concret

Une app de gestion de stock construite avec Bolt affiche le tableau de bord des fournisseurs. La règle RLS empêche un fournisseur de voir les commandes d'un autre, et l'écran récapitulatif de l'administrateur reste vide. La correction proposée remplace la clé publique par la clé service_role dans le client du navigateur. L'écran se remplit.

Six mois plus tard, un fournisseur curieux ouvre les outils de développement de son navigateur, copie la clé et peut lire, modifier ou supprimer toutes les données. La bonne correction aurait pris une heure : une règle RLS dédiée au rôle administrateur, ou une fonction serveur qui calcule le récapitulatif. Le Scan de vibebusters cherche précisément ce type de raccourci, dans le code actuel et dans son historique.

Les erreurs les plus fréquentes

  • La clé secrète dans le client Supabase du navigateur, pour contourner une règle
  • L'ancienne clé service_role jamais désactivée après le passage aux nouvelles clés
  • La clé dans un fichier .env versionné sur GitHub, parfois dans un dépôt public
  • Une Edge Function sans contrôle d'appelant qui utilise la clé secrète
  • La même clé partagée entre l'environnement de test et la production

Ce qu'il faut retenir

La clé secrète est un outil légitime et souvent nécessaire. Elle se gère comme la clé d'un coffre : un seul endroit, côté serveur, avec une liste claire des fonctions qui l'utilisent et un plan pour la remplacer. Le Scan dresse cet inventaire et, si une clé a circulé, l'Intervention organise son remplacement sans interrompre l'app.

// faq

Les questions qui reviennent

Quelle différence entre la clé publishable et la clé secrète Supabase ?

La clé publishable (anciennement anon) est publique par conception et reste soumise aux règles RLS. La clé secrète (anciennement service_role) utilise un rôle qui contourne le RLS : elle donne accès à toutes les données et ne doit servir que côté serveur.

Les clés anon et service_role vont-elles disparaître ?

Supabase indique déprécier les clés anon et service_role d'ici fin 2026, au profit des clés sb_publishable_ et sb_secret_. Les deux systèmes fonctionnent en parallèle, et les anciennes clés restent valides tant qu'elles ne sont pas désactivées dans le tableau de bord.

Que faire si ma clé secrète a été exposée ?

La considérer comme compromise : créer une nouvelle clé, mettre à jour les fonctions serveur qui l'utilisent, puis révoquer l'ancienne. Ensuite, retirer la clé du code et de l'historique Git, et vérifier dans les journaux si des accès inhabituels ont eu lieu.

Vérifier où vivent les clés de ton app

Le Scan recherche les clés dans le code, l'historique Git et la configuration, puis indique celles à remplacer et comment le faire sans coupure.

Voir le contenu du Scan