API-sleutels in uw app: welke mogen publiek zijn en welke nooit?
Bijgewerkt op · 5 minuten lezen · door Enes
In het kort
Alles wat in de browser draait, kan iedere bezoeker lezen, dus ook sleutels in de code. Een publieke sleutel zoals de Supabase anon key of de Stripe publishable key mag daar staan, mits uw databaseregels kloppen. Geheime sleutels horen alleen op de server. Denk aan de Supabase service_role, de Stripe secret key of een OpenAI-sleutel. Uitgelekt? Trek de sleutel direct in.
In dit artikel (7 delen)
Waarom is een sleutel in uw app niet geheim?
Een API-sleutel is een soort wachtwoord waarmee uw app een andere dienst gebruikt: uw database, uw betaalprovider of een AI-model. Staat die sleutel in de code die naar de browser gaat, dan kan iedere bezoeker hem vinden. Daar is geen hackerskennis voor nodig: de paginabron of de ontwikkelaarstools van de browser zijn genoeg.
Lovable zegt het in de eigen documentatie zo. De code in de browser is altijd openbaar en mag nooit beveiligingsbeslissingen nemen. Geheime sleutels en controles horen op de server.
Met AI gebouwde apps gaan hier vaak de mist in. Het patroon "zet de sleutel even in een variabele" werkt meteen. De AI ziet niet altijd het verschil tussen een openbare en een geheime sleutel. Bij het Lovable-lek van 2025 (CVE-2025-48757) waren onder meer sleutels voor Gemini, Google Maps en Stripe-instellingen op te vragen.
Welke sleutels mogen wel publiek zijn?
Supabase anon key of publishable key: bedoeld voor de browser. Supabase noemt hem de sleutel die op de voordeur geplakt zit: hij opent alleen de hal. Hij geeft alleen toegang tot wat uw Row Level Security-regels toestaan. Is die beveiliging niet goed ingesteld, dan is ook deze sleutel gevaarlijk.
Stripe publishable key, die begint met pk_live_ of pk_test_: bedoeld om in de browser betaalgegevens veilig naar Stripe te sturen. Met deze sleutel kan niemand geld van uw account afhalen of klantgegevens opvragen.
Welke sleutels mogen nooit in de browser?
Supabase service_role key of secret key: dit is de hoofdsleutel. Volgens Supabase slaat hij alle Row Level Security-regels over en geeft hij volledige toegang tot alle gegevens. Wie hem heeft, kan uw hele database lezen, wijzigen en wissen.
Stripe secret key (begint met sk_live_) en restricted key (rk_live_). Hiermee beheert iemand betalingen, terugbetalingen en klantgegevens in uw Stripe-account.
Sleutels van AI-diensten zoals OpenAI, Anthropic of Google Gemini. Wie uw sleutel heeft, gebruikt het AI-model op uw kosten. Zonder limiet kan dat een flinke rekening opleveren. OpenAI raadt zelf af om sleutels in de browser of in mobiele apps te zetten.
Verder: wachtwoorden van uw database, sleutels van uw maildienst, en geheime codes waarmee u berichten van uw betaalprovider (webhooks) controleert.
Zelf controleren
Doe dit alleen op uw eigen website of app. Open de site in Chrome of Firefox en druk op F12 om de ontwikkelaarstools te openen. Zoek in het tabblad Bronnen (Sources) met Ctrl+Shift+F (op een Mac Cmd+Option+F). Zoek naar woorden als service_role, secret, sk_live, sk- en api_key. Kijk ook in het tabblad Netwerk welke verzoeken uw app doet.
Staat uw code op GitHub? Controleer dan of de repository privé is en of er geen .env-bestand met sleutels in staat. Ook een sleutel die u later uit de code haalt, blijft in de geschiedenis van de repository staan.
Hoe beveiligt u een API-sleutel?
Een API-sleutel beveiligt u zo. Gebruik geheime sleutels alleen op de server en sla ze nooit op in de code of in Git. Beperk ze tot wat nodig is. Trek ze direct in bij een lek. Concreet: zet ze in een omgevingsvariabele op de server. Bijvoorbeeld in een serverless functie zoals een Supabase Edge Function of een Netlify Function. De browser vraagt de server om iets te doen; de server gebruikt de sleutel en stuurt alleen het resultaat terug.
Lovable geeft daarvoor deze voorbeeldprompt: "Add an API key for Stripe payments securely without exposing it in the frontend code". En om bestaande code na te lopen: "Review frontend code for exposed secrets, API keys, or sensitive information". Zo werkt ook deze website: de sleutel van onze database staat alleen op de server.
Als er een sleutel is uitgelekt
1. Trek de sleutel direct in bij de dienst zelf en maak een nieuwe aan. Alleen weghalen uit de code is niet genoeg: de oude sleutel blijft werken en kan al gekopieerd zijn. Supabase, Stripe en OpenAI hebben hier allemaal een knop voor in hun dashboard.
2. Zet de nieuwe sleutel alleen op de server. 3. Kijk in de logboeken en facturen van de dienst of de sleutel is misbruikt. Let op onbekende betalingen, veel AI-verbruik of opgevraagde gegevens. 4. Stel bij AI-diensten een limiet in op het verbruik.
5. Kon iemand met de sleutel bij persoonsgegevens, dan is het mogelijk een datalek. Is er risico voor de mensen van wie de gegevens zijn? Meld het dan binnen 72 uur bij de Autoriteit Persoonsgegevens.
Laten controleren
Een geautomatiseerde scan vindt zichtbare sleutels snel. Onze Scan (vanaf € 295 excl. btw) is een scan die wij met de hand nalopen, met een rapport in gewone taal. Het is geen pentest.
Wilt u weten wat een aanvaller met een sleutel of een te ruime databaseregel echt kan? Dan test een mens dat in een Inbraaktest (vanaf € 2.950 excl. btw). Met API’s en meerdere rollen past een Inbraaktest Totaal (vanaf € 4.950 excl. btw). Wij testen alleen na schriftelijke toestemming van de eigenaar van het systeem.
Veelgestelde vragen
Mag de Supabase anon key in mijn frontend staan?
Ja, daar is hij voor bedoeld. Hij geeft alleen toegang tot wat uw Row Level Security-regels toestaan. Controleer dus vooral of die regels kloppen.
Is het genoeg om de sleutel uit de code te verwijderen?
Nee. De sleutel blijft geldig en kan al gekopieerd zijn. Bijvoorbeeld uit een oude versie van uw site of uit de geschiedenis op GitHub. Trek hem in bij de dienst zelf en maak een nieuwe aan.
Wat gebeurt er als iemand mijn OpenAI-sleutel vindt?
Dan kan die persoon het AI-model gebruiken op uw kosten. Trek de sleutel in en maak een nieuwe aan die alleen op de server staat. Stel een limiet in op het verbruik.
Hoe weet ik of mijn bouwer sleutels goed heeft opgeslagen?
Vraag welke sleutels de app gebruikt en waar elke sleutel staat: in de browser of op de server. Alleen publieke sleutels, zoals de Supabase anon key of Stripe publishable key, mogen in de browser staan.
Verder lezen
Bronnen
- Supabase Docs: API keyssupabase.com
- Lovable Docs: security best practicesdocs.lovable.dev
- Stripe Docs: API keysdocs.stripe.com
- OpenAI: best practices for API key safetyhelp.openai.com
- OWASP: Secrets Management Cheat Sheetcheatsheetseries.owasp.org
- NVD: CVE-2025-48757nvd.nist.gov
- Autoriteit Persoonsgegevens: datalek meldenautoriteitpersoonsgegevens.nl