[{"data":1,"prerenderedAt":462},["ShallowReactive",2],{"blog-fr-which-api-keys-are-safe-in-your-frontend":3},{"id":4,"title":5,"body":6,"category":418,"cover":419,"coverAlt":419,"description":420,"draft":421,"extension":422,"faq":423,"image":439,"keywords":440,"meta":449,"navigation":450,"ogTitle":451,"path":452,"published":453,"seo":454,"stem":455,"tldr":456,"updated":460,"__hash__":461},"blog_fr\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend.md","Quelles clés API sont sûres côté navigateur, et lesquelles non",{"type":7,"value":8,"toc":408},"minimark",[9,13,21,26,29,32,48,51,55,58,61,64,73,79,83,206,209,228,232,254,260,276,287,290,300,305,315,322,326,334,337,344,347,354,358,393,401],[10,11,12],"p",{},"Quand on a créé son application avec Lovable, Bolt, v0, Cursor ou Replit, il\narrive tôt ou tard que quelqu'un ouvre le site, appuie sur F12 et annonce que\nvotre clé API est « exposée ». Pour une application dont on ne lit pas le code\nsoi-même, la nouvelle a de quoi inquiéter.",[10,14,15,16,20],{},"Voici ce que guide après guide présente de travers : ",[17,18,19],"strong",{},"certaines de ces clés sont\nfaites pour être là."," Traiter chaque clé visible comme une fuite conduit soit à\npaniquer pour rien, soit, bien pire, à apprendre à ignorer l'avertissement, et\nà l'ignorer aussi le jour où il compte vraiment.",[22,23,25],"h2",{"id":24},"est-ce-grave-que-ma-clé-api-soit-visible","Est-ce grave que ma clé API soit visible ?",[10,27,28],{},"En général non. Tout dépend de la clé dont il s'agit.",[10,30,31],{},"Chaque service qui parle à un navigateur distribue deux sortes d'identifiants.\nL'une est une adresse. L'autre est un trousseau de clés du bâtiment. Les deux\ns'appellent « clé API », et c'est là l'essentiel de la confusion.",[10,33,34,35,38,39,42,43,47],{},"Une ",[17,36,37],{},"adresse"," peut être publiée sans risque. Elle indique à quel projet\nappartient une requête, rien de plus ; la vérification des droits se fait\nailleurs. Un ",[17,40,41],{},"trousseau"," ne le peut pas, parce qu'il ",[44,45,46],"em",{},"est"," la vérification des\ndroits : qui le détient peut faire tout ce qu'il autorise, depuis n'importe où.",[10,49,50],{},"Votre application a besoin de l'adresse dans le navigateur pour fonctionner. Elle\nne devrait jamais y avoir besoin du trousseau.",[22,52,54],{"id":53},"pourquoi-votre-application-envoie-des-clés-au-navigateur","Pourquoi votre application envoie des clés au navigateur",[10,56,57],{},"Parce que la requête part du navigateur de votre visiteur, pas de votre serveur.",[10,59,60],{},"Quand votre application charge la liste des commandes de vos utilisateurs, cette\nrequête part directement du navigateur du visiteur vers votre fournisseur de base\nde données. Elle doit indiquer à quel projet elle appartient, et cet identifiant\ndoit se trouver dans la page, puisque c'est de là que part la requête.",[10,62,63],{},"Il n'existe aucune version où cet identifiant reste secret. Il parvient à chaque\nvisiteur, par conception. C'est exactement pour cela que les fournisseurs coupent\nleurs identifiants en deux : ils savent que l'un des deux sera public, alors ils\nl'ont rendu inoffensif.",[10,65,66,67,72],{},"La sécurité ne vient pas du fait de cacher l'adresse. Elle vient des règles\nposées à l'autre bout : chez Supabase, Row Level Security, qui décide ligne par\nligne qui a le droit de voir quoi. Ce sont ces règles qui méritent d'être\nvérifiées, et\n",[68,69,71],"a",{"href":70},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","les activer n'est pas la même chose qu'être protégé",".",[74,75],"diagram",{"alt":76,"caption":77,"src":78},"Deux chemins vers la même table. La clé anon s'arrête à la barrière Row Level Security et n'atteint que les deux lignes autorisées par les règles. La clé service_role passe par une brèche dans la barrière et atteint les six.","C'est Row Level Security qui rend la clé anon sans danger. Une clé service_role passe outre.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fwhat-each-key-reaches-1600x820.png",[22,80,82],{"id":81},"les-deux-familles-de-clés","Les deux familles de clés",[84,85,86,105],"table",{},[87,88,89],"thead",{},[90,91,92,96,99,102],"tr",{},[93,94,95],"th",{},"Fournisseur",[93,97,98],{},"Clé",[93,100,101],{},"Sûre dans le navigateur ?",[93,103,104],{},"Ce qu'elle fait",[106,107,108,135,156,174,191],"tbody",{},[90,109,110,114,125,132],{},[111,112,113],"td",{},"Supabase",[111,115,116,120,121,124],{},[117,118,119],"code",{},"sb_publishable_…",", ou ",[117,122,123],{},"anon"," sur les anciens projets",[111,126,127],{},[128,129,131],"key-verdict",{"type":130},"safe","À sa place",[111,133,134],{},"Indique de quel projet il s'agit. Chaque requête reste filtrée par vos règles Row Level Security.",[90,136,137,139,147,153],{},[111,138,113],{},[111,140,141,120,144,124],{},[117,142,143],{},"sb_secret_…",[117,145,146],{},"service_role",[111,148,149],{},[128,150,152],{"type":151},"danger","Jamais",[111,154,155],{},"Contourne entièrement Row Level Security. Lit et écrit chaque ligne de chaque table, quelles que soient vos règles.",[90,157,158,161,167,171],{},[111,159,160],{},"Stripe",[111,162,163,166],{},[117,164,165],{},"pk_live_…"," (publiable)",[111,168,169],{},[128,170,131],{"type":130},[111,172,173],{},"Crée les formulaires de paiement. Ne peut ni déplacer d'argent ni lire les clients.",[90,175,176,178,184,188],{},[111,177,160],{},[111,179,180,183],{},[117,181,182],{},"sk_live_…"," (secrète)",[111,185,186],{},[128,187,152],{"type":151},[111,189,190],{},"Accès complet au compte : paiements, remboursements, virements, fiches clients.",[90,192,193,196,199,203],{},[111,194,195],{},"OpenAI \u002F Anthropic",[111,197,198],{},"toute clé API",[111,200,201],{},[128,202,152],{"type":151},[111,204,205],{},"Il n'existe pas de variante publiable. Chaque clé facture directement votre compte.",[10,207,208],{},"Le schéma vaut au-delà de ces trois-là. Si un fournisseur ne propose qu'une seule\nsorte de clé, considérez qu'elle est secrète et qu'elle appartient à un serveur.",[210,211,213],"callout",{"type":212},"warn",[10,214,215,218,219,221,222,224,225,227],{},[17,216,217],{},"Celle qui piège le plus de monde, c'est la clé secrète Supabase."," Sur un\nancien projet elle s'appelle ",[117,220,146],{}," et ressemble presque trait pour trait\nà la clé anon : même format, même longueur, même endroit dans le tableau de bord,\nl'une à côté de l'autre. Copier la mauvaise tient à un seul clic mal placé, et\nrien ne casse ensuite : votre application fonctionne exactement comme avant.\nC'est ce qui la rend si facile à manquer. Les projets récents sont le seul\nendroit où cela s'est amélioré : ",[117,223,143],{}," et ",[117,226,119],{}," annoncent la\ncouleur dès leurs premiers caractères.",[22,229,231],{"id":230},"les-distinguer-en-60-secondes","Les distinguer en 60 secondes",[10,233,234,237,238,241,242,245,246,249,250,253],{},[17,235,236],{},"Pour Stripe, et la plupart des fournisseurs, lisez le préfixe."," ",[117,239,240],{},"pk_"," est\npubliable et sans danger. ",[117,243,244],{},"sk_"," est secrète et ne l'est pas. Certains\nfournisseurs glissent ",[117,247,248],{},"_test_"," ou ",[117,251,252],{},"_live_"," au milieu : une clé de test divulguée\nest un problème bien plus petit qu'une clé de production, mais renouvelez les\ndeux.",[10,255,256,259],{},[17,257,258],{},"Pour Supabase, cela dépend de l'âge de votre projet."," Supabase a émis deux\nformes de clés différentes, et les deux circulent aujourd'hui dans des\napplications en service.",[10,261,262,265,267,268,270,271,275],{},[17,263,264],{},"Projets récents : lisez le préfixe, exactement comme chez Stripe.",[117,266,119],{}," est celle qui a sa place dans votre application.\n",[117,269,143],{}," est celle à renouveler aujourd'hui. Il n'y a rien à décoder : ce à\nquoi sert la clé est écrit devant.\n",[68,272,274],{"href":273},"\u002Fblog\u002Fsupabase-new-api-keys","Ce qui a changé, et ce que cela veut dire pour votre application",",\nsi vous ne les avez pas encore croisées.",[10,277,278,281,282,224,284,286],{},[17,279,280],{},"Anciens projets : il faut regarder à l'intérieur de la clé."," La paire\nd'origine, ",[117,283,123],{},[117,285,146],{},", ce sont des JWT : trois blocs de charabia\nséparés par des points, dont celui du milieu est de l'information lisible, pas du\nchiffrement. Le rôle de la clé y est écrit en clair.",[10,288,289],{},"Aucun outil n'est nécessaire dans un cas comme dans l'autre. Ouvrez\nSettings → API Keys dans le tableau de bord Supabase : il vous dit laquelle est\nlaquelle. Si vous préférez vérifier la clé que vous avez réellement trouvée dans\nvotre application, la section du milieu d'une ancienne clé se décode en quelque\nchose comme ceci.",[291,292,297],"pre",{"className":293,"code":295,"language":296},[294],"language-text","{\n  \"iss\": \"supabase\",\n  \"ref\": \"abcdefghij…\",\n  \"role\": \"anon\",          ← c'est ce mot qui compte\n  \"iat\": 1750000000\n}\n","text",[117,298,295],{"__ignoreMap":299},"",[74,301],{"alt":302,"caption":303,"src":304},"Une ancienne clé Supabase représentée en trois sections séparées par des points. Celle du milieu est mise en évidence et se décode soit en role anon, cochée comme sûre, soit en role service_role, barrée comme dangereuse.","Sur une ancienne clé, la section du milieu est du texte lisible, pas du chiffrement. Un seul mot y décide si la clé pouvait être publiée.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fread-the-role-1600x640.png",[10,306,307,310,311,314],{},[117,308,309],{},"\"role\": \"anon\""," est la bonne. ",[117,312,313],{},"\"role\": \"service_role\""," est celle à renouveler\naujourd'hui. Sur une ancienne clé, ce seul mot fait toute la différence, et\nc'est pourquoi un analyseur qui se contente de repérer des chaînes en forme de\nclé vous donne du bruit plutôt qu'une réponse : il ne peut pas vous dire laquelle\nde deux clés identiques en apparence vous avez réellement publiée.",[10,316,317,318,72],{},"Si vous préférez ne pas passer votre application clé par clé, notre scan gratuit\nlit votre site en ligne et vous dit lesquelles de ces clés se voient depuis\nl'extérieur. Cela prend une vingtaine de secondes et ne demande aucun compte :\n",[68,319,321],{"href":320},"\u002F#scan","scanner votre application",[22,323,325],{"id":324},"ce-qui-se-passe-vraiment-quand-une-clé-secrète-fuit","Ce qui se passe vraiment quand une clé secrète fuit",[10,327,328,329,120,331,333],{},"Chaque ligne de votre base de données devient lisible et modifiable par celui qui\na trouvé la clé, y compris des tables que vous n'avez jamais exposées à votre\napplication et les données personnelles de vos utilisateurs. Row Level Security\nne s'applique pas à une clé secrète Supabase (",[117,330,143],{},[117,332,146],{},"\nsur un ancien projet). C'est la raison d'être de cette clé.",[10,335,336],{},"Le dommage n'est pas théorique non plus. On le découvre généralement par un\nmessage d'assistance à propos de données qui ont changé toutes seules, ou par une\ntable soudain vide.",[10,338,339,340,343],{},"Une clé ",[117,341,342],{},"sk_live_"," Stripe divulguée signifie remboursements, paiements et fiches\nclients. Une clé de fournisseur d'IA divulguée signifie une facture, parfois très\nlourde, qui arrive avant que quiconque ne s'en aperçoive.",[10,345,346],{},"Rien de tout cela ne demande un attaquant sophistiqué. Des robots parcourent les\nsites publics à la recherche exactement de ces chaînes, et ils n'ont pas besoin\nde savoir qui vous êtes pour trouver la vôtre.",[10,348,349,350,72],{},"Si vous voulez la version propre à la plateforme de ce qu'il faut vérifier, nous\navons un guide en langage clair pour les\n",[68,351,353],{"href":352},"\u002Fis-your-supabase-app-safe","applications Supabase",[22,355,357],{"id":356},"que-faire-maintenant","Que faire maintenant",[359,360,361],"key-takeaways",{},[362,363,364,372,379,382,390],"ul",{},[365,366,367,368,371],"li",{},"Repérez chaque clé dans votre application et identifiez-la. Le préfixe pour Stripe et pour les clés Supabase récentes ; le champ ",[117,369,370],{},"role"," à l'intérieur des anciennes clés Supabase.",[365,373,374,375,378],{},"Si vous trouvez une clé secrète côté navigateur, ",[17,376,377],{},"renouvelez-la d'abord",". La supprimer de votre code ne ferme pas la porte : l'ancienne valeur existe toujours dans votre historique de versions et dans les copies en cache de votre site.",[365,380,381],{},"Déplacez sur un serveur ce qui avait besoin de cette clé : une edge function, une route serverless, n'importe quoi qui ne soit pas le navigateur.",[365,383,384,385,249,387,389],{},"Activez Row Level Security sur chaque table, puis vérifiez qu'elle fonctionne réellement. Une clé publiable (",[117,386,119],{},[117,388,123],{},") n'est sûre que grâce à ces règles ; sans elles, elle lit toute votre base.",[365,391,392],{},"Vérifiez la facturation et les journaux après toute exposition d'une clé secrète. Le renouvellement arrête la suite, pas ce qui a déjà eu lieu.",[10,394,395,396,400],{},"Si vous préférez avancer sous forme de liste, la\n",[68,397,399],{"href":398},"\u002Fchecklist","checklist sécurité en 10 minutes"," couvre ce point et les autres\nchoses à désactiver dans une application fraîchement lancée.",[10,402,403,404,72],{},"Et si une fuite finit par vider une table, la récupérer dépend entièrement de\n",[68,405,407],{"href":406},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","ce que vous sauvegardiez",{"title":299,"searchDepth":409,"depth":409,"links":410},3,[411,413,414,415,416,417],{"id":24,"depth":412,"text":25},2,{"id":53,"depth":412,"text":54},{"id":81,"depth":412,"text":82},{"id":230,"depth":412,"text":231},{"id":324,"depth":412,"text":325},{"id":356,"depth":412,"text":357},"Bases de la sécurité",null,"Votre clé anon Supabase est faite pour être publique. Votre clé service_role non, et elle ignore toutes les règles que vous posez. Comment les distinguer.",false,"md",[424,427,430,433,436],{"q":425,"a":426},"On me dit que ma clé API est exposée. Dois-je paniquer ?","Pas avant de savoir de quelle clé il s'agit. Si elle commence par pk_ ou s'il s'agit d'une clé anon Supabase, elle est faite pour être publique et tout va bien. Si elle commence par sk_ ou s'il s'agit d'une clé service_role, renouvelez-la immédiatement, puis regardez ce à quoi elle donnait accès.",{"q":428,"a":429},"Puis-je simplement cacher la clé pour que personne ne la trouve ?","Non. Tout ce que votre navigateur peut utiliser, un visiteur peut le lire : minifier, renommer ou obscurcir ne fait gagner que quelques secondes. La solution n'est jamais de cacher une clé secrète côté navigateur, mais de la déplacer sur un serveur, ou d'utiliser une clé publiable qu'il était sans danger d'exposer dès le départ.",{"q":431,"a":432},"Pourquoi Supabase me donne-t-il une clé que tout le monde peut lire ?","Parce que ce n'est pas la clé anon qui protège vos données. Elle indique seulement à quel projet vous parlez. La vraie protection, c'est Row Level Security, qui décide ligne par ligne ce que chaque visiteur a le droit de voir. C'est pourquoi une clé anon avec RLS activé ne pose aucun problème, et la même clé sans RLS est une base de données ouverte.",{"q":434,"a":435},"Ma clé Supabase commence par sb_publishable_. Est-ce la même chose que la clé anon ?","Elle joue le même rôle. Supabase a renommé ses clés : sb_publishable_ a pris la suite de la clé anon, et sb_secret_ celle de service_role. Une clé qui commence par sb_publishable_ est donc faite pour vivre dans votre application, et une clé qui commence par sb_secret_ ne l'est jamais. Les anciens projets portent toujours les clés anon et service_role d'origine, et elles fonctionnent encore ; vous pouvez même voir les deux paires côte à côte dans votre tableau de bord.",{"q":437,"a":438},"J'ai déjà collé une clé secrète dans mon application. Et maintenant ?","Renouvelez-la d'abord : dans le tableau de bord du fournisseur, générez une nouvelle clé et révoquez l'ancienne. C'est cela qui ferme réellement la porte ; la retirer de votre code ne suffit pas, car l'ancienne valeur reste dans votre historique et dans les copies en cache. Déplacez ensuite sur un serveur ce qui avait besoin de cette clé, et vérifiez votre facturation et vos journaux pour repérer ce que vous n'avez pas fait.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",[441,442,443,444,445,446,447,448],"clé anon supabase","clé service_role","clé sb_publishable","clé sb_secret","nouvelles clés api supabase","clé publiable stripe","clé api navigateur","clé api exposée",{},true,"Quelles clés API sont sûres côté navigateur ?","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","2026-08-09",{"title":5,"description":420},"blog\u002Fwhich-api-keys-are-safe-in-your-frontend",[457,458,459],"Trouver une clé API dans le code de votre application n'est pas automatiquement un problème. Certaines clés sont faites pour y être.","Les clés publiables sont sûres dans le navigateur. Les clés secrètes non : une clé secrète côté navigateur, c'est une caisse ouverte.","Deux vérifications les séparent en moins d'une minute : lire le préfixe et, sur une ancienne clé Supabase, décoder le rôle.","2026-08-12","5CcVzg2HhyrIgyhdb34EK2cb4pVG-H-OZIi1hgHoZ1A",1787826048205]