Bases de la sécurité
Les nouvelles clés API Supabase : laquelle va dans votre app ?
Supabase a remplacé anon et service_role par des clés publiables et secrètes. Laquelle a sa place dans votre app, et laquelle jamais ?

En bref
- Supabase délivre désormais des clés sb_publishable_ et sb_secret_. Elles remplacent anon et service_role et font exactement les deux mêmes métiers.
- La clé publiable a sa place dans votre application. La clé secrète jamais, et vous les distinguez maintenant aux premiers caractères.
- Vos anciennes clés fonctionnent encore aujourd'hui. Supabase a annoncé que tous les projets devront en changer fin 2026.
Si vous avez ouvert votre tableau de bord Supabase récemment et trouvé des clés
qui commencent par sb_publishable_ et sb_secret_ là où se trouvaient anon
et service_role, rien n'est cassé. Supabase a renommé ses clés API, et la
paire que vous connaissiez est en train de sortir.
Le changement est petit dans ce qu'il fait et grand dans ce qu'il évite. Les deux clés remplissent toujours exactement les deux mêmes rôles. Ce qui est nouveau, c'est que vous voyez désormais laquelle est laquelle sans rien ouvrir.
Ce que Supabase a réellement changé
Supabase a annoncé les nouvelles clés en juillet 2025, en même temps qu'un changement dans la façon dont il signe les jetons d'authentification. Deux choses en ont remplacé deux autres :
- La clé publiable,
sb_publishable_…, remplace la cléanon. - Les clés secrètes,
sb_secret_…, remplacent la cléservice_role.
Les droits sont inchangés. Une clé publiable identifie toujours votre projet et ne porte aucun droit propre ; une clé secrète contourne toujours toutes les règles que vous avez écrites. Si vous savez déjà quelles clés sont sûres dans un frontend, rien de cette intuition n'est devenu faux.
Deux différences pratiques valent d'être connues. Vous pouvez détenir plusieurs clés secrètes à la fois et les révoquer une par une : faire tourner une clé ne signifie donc plus un moment où tout ce qui l'utilisait est cassé. Et les anciennes clés avaient une propriété que presque personne n'avait remarquée : c'étaient des JWT qui expirent dix ans après la création du projet. Les nouvelles ne portent pas d'expiration en elles.
La clé anon est-elle la même que la clé publiable ?
Oui pour ce qu'elle fait, non pour ce qu'elle est.
sb_publishable_… fait exactement le travail de la clé anon : elle nomme votre
projet pour qu'une requête sache où aller, elle ne porte aucune permission
propre, et elle est faite pour rester dans votre appli où n'importe qui peut la
lire. Tout ce que vous aviez compris de la clé anon reste vrai. Si vous
remplacez l'une par l'autre, aucune table ne devient plus ou moins lisible, car
aucune des deux n'a jamais protégé vos lignes. C'est le rôle de Row Level
Security.
Ce qui change, c'est la valeur elle-même. Ce sont des chaînes différentes dans des formats différents, émises séparément, et un projet peut détenir les deux paires en même temps pendant la migration. « La même clé sous un nouveau nom » est donc la mauvaise image. C'est une nouvelle clé pour un ancien travail, et votre appli doit en être informée.
Une conséquence surprend souvent : activer les nouvelles clés ne bascule pas votre appli. Supabase les émet et laisse votre appli tourner avec ce que vous lui avez donné. Le changement est une modification d'une ligne que vous faites vous-même, là où votre appli crée son client Supabase.
Laquelle des deux a sa place dans votre application
La clé publiable, et elle seule.
Votre application tourne dans le navigateur de votre visiteur, et la requête
vers votre base part de là. Elle doit dire à quel projet elle appartient, et cet
identifiant parvient à chaque visiteur par conception. sb_publishable_… est la
clé construite pour cela : la trouver dans votre application n'est pas un
problème, et ne l'a jamais été.
sb_secret_… est l'inverse. Elle lit et écrit chaque ligne de chaque table
depuis n'importe où, en ignorant entièrement vos politiques, et c'est toute sa
raison d'être. Sa place est sur un serveur, dans une edge function, dans un
worker : nulle part où un navigateur peut aller. Si l'une a déjà été collée dans
du code frontend, renouvelez-la dans le tableau de bord avant de modifier quoi
que ce soit : supprimer la ligne ne ferme pas la porte.
À quoi ressemble une clé sb_publishable_ ?
Une seule chaîne continue qui commence par le littéral sb_publishable_, suivi
d'un milieu aléatoire. Aucun point dedans, et rien à l'intérieur que vous
puissiez décoder. Sa contrepartie secrète se lit pareil, avec sb_secret_
devant.
L'ancienne paire ne ressemble en rien à cela. anon et service_role sont des
JWT : trois blocs séparés par des points, longs de quelques centaines de
caractères, commençant par eyJ. Le bloc du milieu n'est pas chiffré, seulement
encodé, donc n'importe qui peut le coller dans un décodeur et lire le champ
role à l'intérieur. C'est ainsi qu'on distinguait les deux avant, et c'est
pourquoi tant de gens ne l'ont jamais fait.
Lire les quinze premiers caractères, c'est toute la vérification aujourd'hui. La clé dangereuse s'annonce dans la partie de la chaîne où votre œil se pose en premier, plutôt qu'au milieu de quelque chose qu'il faut ouvrir.
Comment savoir laquelle vous avez
Lisez les premiers caractères. C'est désormais toute la vérification.
| Ce que vous voyez | Ce que c'est | Sûre dans le navigateur ? |
|---|---|---|
sb_publishable_… | clé publiable actuelle | À sa place |
sb_secret_… | clé secrète actuelle | Jamais |
eyJ… avec anon | ancienne clé publiable | À sa place |
eyJ… avec service_role | ancienne clé secrète | Jamais |
Une clé actuelle est une longue chaîne en deux moitiés : un milieu aléatoire et
une courte somme de contrôle à la fin. Une ancienne clé est faite de trois blocs
séparés par des points, et celui du milieu est du texte lisible plutôt que du
chiffrement, ce qui est la raison pour laquelle distinguer l'ancienne paire supposait de la décoder
et de lire le champ role.
Si vous trouvez une clé dans votre application sans savoir laquelle c'est, notre scan gratuit lit votre site en ligne depuis l'extérieur et nomme ce qu'il voit. Cela prend une vingtaine de secondes et ne demande aucun compte : scanner votre application.
Mes anciennes clés anon et service_role fonctionnent-elles encore ?
Aujourd'hui, oui. Supabase a publié un calendrier, pas un interrupteur :
| Quand | Ce qui se passe |
|---|---|
| 1er novembre 2025 | Les projets restaurés après cette date n'obtiennent plus du tout anon ni service_role. |
| Fin 2026, date non fixée | Tous les projets devront utiliser les nouvelles clés. |
Il n'y a donc pas d'urgence cette semaine, et il y a une échéance cette année. Si votre application a été construite avant le renommage et n'a pas été touchée depuis, elle tourne en ce moment sur d'anciennes clés et continuera un moment.
L'argument pour bouger tôt n'est pas l'échéance. C'est le jour où quelqu'un
colle la mauvaise clé dans un prompt : sb_secret_ s'annonce, eyJ… non.
Que sont les clés API legacy de Supabase ?
Legacy est le nom que Supabase donne aujourd'hui à la paire d'origine, anon et
service_role, avec le secret JWT qui les signe. Tout projet créé avant
mi-2025 a démarré avec elles, ce qui couvre la plupart des applis vibe-codées.
Elles diffèrent de la nouvelle paire sur des points qui méritent d'être connus. Étant des JWT, elles portent une expiration dix ans après la création du projet, logée dans la clé là où personne ne regarde. Elles ne peuvent pas être renouvelées du tout : Supabase a indiqué que renouveler les secrets legacy anon, service_role et JWT n'est plus possible, donc invalider une clé fuitée revient à passer aux nouvelles clés et à désactiver l'ancienne paire. Et un projet restauré après le 1er novembre 2025 ne les reçoit tout simplement pas.
Si l'une des vôtres a déjà fuité, cette migration est le seul moyen de l'invalider, et l'ordre dans lequel la mener dépend de si la clé se trouve déjà dans un bundle que vos visiteurs téléchargent.
Comment changer sans casser votre application
Le guide de migration de Supabase est la référence. La version courte, pour une application que vous n'avez pas écrite à la main, en supposant que vous sachiez déjà trouver la page où vivent vos clés :
- Dans le tableau de bord, ouvrez Settings → API Keys et créez les nouvelles clés. Cela les ajoute ; cela ne retire pas les anciennes, et les deux paires fonctionnent en même temps.
- Trouvez l'endroit où votre application crée son client Supabase et remplacez la clé publiable. Dans un builder comme Lovable ou Bolt, c'est en général une valeur dans les réglages du projet plutôt qu'une ligne de code.
- Remplacez la clé secrète partout où elle est utilisée sur un serveur : edge functions, webhooks, tâches planifiées, tout ce qui n'est pas le navigateur.
- Chargez votre application et parcourez les parties qui lisent et écrivent des données. Une mauvaise clé publiable échoue immédiatement et bruyamment, ce qui est le bon cas.
- Une fois seulement que tout marche, désactivez les anciennes clés.
L'étape 5 est celle à garder pour la fin, et elle mérite d'être faite
délibérément plutôt que jamais : les projets à moitié migrés, où l'application
transporte encore une ancienne clé anon à côté d'une sb_publishable_ active,
sont fréquents et déroutants à déboguer.
Que faire cette semaine
Que faire
- Ouvrez Settings → API Keys et regardez quelles paires possède votre projet. Cela prend une minute et vous dit où vous en êtes.
- Si vous trouvez
sb_secret_…ouservice_rolequelque part dans du code frontend, renouvelez la clé aujourd'hui. C'est le seul point urgent ici. - Créez les nouvelles clés et basculez votre application quand vous aurez une demi-heure, pas à cause de l'échéance, mais parce que le préfixe rend la prochaine erreur évidente.
- Profitez-en pour regarder Row Level Security. La nouvelle clé ne change rien à ce que vos politiques autorisent, et activer RLS n'est pas la même chose qu'être protégé.
Si vous voulez la version propre à la plateforme de ce qu'il faut vérifier, nous avons un guide en langage clair pour les applications Supabase, et la checklist sécurité en 10 minutes couvre ce point à côté des autres choses à désactiver dans une application fraîchement lancée.
FAQ
sb_publishable_ est-elle la même chose que la clé anon ?
Elle fait le même métier. Elle nomme votre projet pour qu'une requête sache où aller, elle ne porte aucun droit propre, et elle est faite pour vivre dans votre application où n'importe qui peut la lire. Dans les deux cas, ce qui protège vos données est Row Level Security, pas la clé.
Mes clés anon et service_role fonctionnent-elles encore ?
Oui, aujourd'hui. Supabase les a laissées en service pendant la migration et vous pouvez détenir les deux paires en même temps. L'annonce est que fin 2026 tous les projets devront passer aux nouvelles clés, sans que la date exacte soit fixée.
J'ai les deux paires dans mon tableau de bord. Laquelle mon app doit-elle utiliser ?
La clé publiable, sb_publishable_. Le changement tient en une ligne : remplacez la clé que votre application passe au moment où elle crée le client Supabase. Rien ne change pour vos tables ni vos politiques, puisque la nouvelle clé a exactement les droits qu'avait la clé anon.
Le nouveau format rend-il mon application plus sûre à lui seul ?
Non. Il rend la clé dangereuse plus facile à repérer, ce qui vaut de l'argent en erreurs évitées, mais une clé publiable lit toujours tout ce que vos politiques l'autorisent à lire. Si Row Level Security est désactivé, la nouvelle clé ouvre votre base exactement aussi grand que l'ancienne.
Qu'est-ce qu'une clé publiable Supabase ?
C'est la clé que votre appli est censée embarquer : sb_publishable_ suivi d'une chaîne aléatoire, émise par Supabase pour identifier votre projet à chaque requête. Elle ne porte aucun privilège propre, donc ce qu'elle peut lire est exactement ce que vos règles de Row Level Security autorisent, et rien de plus. Elle remplace la clé anon, fait le même travail, et peut rester dans du code que tout le monde peut lire.
Que sont les clés API legacy de Supabase ?
Legacy est le nom que Supabase donne aujourd'hui à la paire d'origine, anon et service_role, avec le secret JWT qui les signe. Ce sont des JWT plutôt que des chaînes opaques, elles portent une expiration dix ans après la création du projet, et les projets restaurés après le 1er novembre 2025 ne les reçoivent plus du tout. Les projets existants les gardent fonctionnelles jusqu'à la bascule de fin 2026.