Omgevingsvariabelen voor API-sleutels uitgelegd voor niet-technische makers: houd sleutels uit prompts en repos, koppel dev/staging/prod en roteer veilig.

Een API-sleutel is als een wachtwoord voor een dienst waar je app mee praat (betalingen, e-mail, kaarten, AI, analytics). Het vertelt die dienst: "dit verzoek komt van mijn account", zodat de dienst je kan belasten, limieten kan toepassen en toegang kan verlenen.
Sleutels lekken omdat ze vaak ontstaan als een snelle copy-paste. Je plakt ze in een chat, een instellingenbestand of een notitie "even voor nu", en dan wordt het ergens opgeslagen waar je het niet bedoeld had te delen.
Veelvoorkomende per ongeluk-lekpaden zijn chatprompts (vooral als je snel bouwt in een vibe-coding tool), een sleutel committen naar een repo of een zip uploaden "voor review", een sleutel in een screenshot of schermopname zetten, het laten staan in een gedeeld document of teamchat, of het hardcoderen in front-end code die elke browser kan lezen.
Het risico is niet abstract. De snelste pijn is onverwachte rekeningen: iemand gebruikt je sleutel om duizenden API-aanroepen te doen. Het volgende risico is dat iemand bij data kan: als de sleutel klantgegevens kan lezen of e-mails kan versturen, kan een aanvaller hetzelfde doen. In het ergste geval kan een sleutel met brede rechten leiden tot accountovernames (bijvoorbeeld als hij nieuwe sleutels kan aanmaken).
Je hoeft geen security-expert te zijn om het meeste voordeel te halen. Een kleine gedragsverandering helpt al veel: behandel sleutels als "geheimen" en houd ze uit prompts en repos. Dat is precies waar omgevingsvariabelen voor zijn: bewaar het geheim op een beschermde plek en laat je app het bij runtime lezen, zonder het in je code of screenshots te bakken.
Als je één regel onthoudt, gebruik deze: code is wat je app doet, config is hoe hij zich gedraagt, en geheimen zijn wat hij nooit mag onthullen.
Code is de logica die je bouwt en uitbrengt (schermen, knoppen, berekeningen, API-aanroepen). Het moet veilig zijn om met teamgenoten te delen en komt vaak in een repo terecht.
Config is een instelling die openbaar kan zijn zonder schade. Denk aan je app-naam, welke regio je draait, featureflags of de basis-URL van een dienst. Als iemand het ziet, zouden ze je geld niet moeten kunnen uitgeven, privédata niet moeten kunnen benaderen en je niet moeten kunnen imiteren.
Geheimen zijn de sleutels tot het koninkrijk: API-sleutels, databasewachtwoorden, private tokens, signing keys. Als een vreemde ze krijgt, kunnen ze handelen alsof ze jouw app zijn.
Een omgevingsvariabele is gewoon een gelabelde plek die je app leest wanneer die draait. Je code zoekt naar een label (zoals STRIPE_SECRET_KEY) en gebruikt welke waarde daar op dat moment staat. Deze scheiding is waarom omgevingsvariabelen zo goed werken voor API-sleutels: de code kan hetzelfde blijven, terwijl de geheime waarde buiten je prompts, bestanden en repo blijft.
Code en geheimen op verschillende plekken houden maakt fixes ook eenvoudiger. Als je per ongeluk een geheim blootstelt, kun je de waarde vervangen zonder de code aan te passen.
Een praktische manier om aan omgevingen te denken is: zelfde labels, verschillende waarden.
Voorbeeld: je gebruikt overal het label PAYMENTS_KEY, maar dev gebruikt een testkey, staging een beperkte key en prod de volledige live key. Als je deployt met een platform als Koder.ai, past dit netjes omdat je dezelfde app naar verschillende omgevingen kunt deployen met verschillende environment-instellingen.
Een geheim is elke waarde die iemand macht geeft die hij niet zou moeten hebben. Als een vreemde het krijgt, kan die inloggen, je geld uitgeven, je data lezen of zich als jouw app voordoen.
Veelvoorkomende geheimen zijn API-sleutels, databasewachtwoorden, private access tokens, signing keys en webhook-secrets. Als iets kan aanmaken, verwijderen, afrekenen, privégegevens lezen of verzoeken ondertekenen, behandel het als een geheim.
Sommige waarden voelen onschuldig maar zijn toch gevoelig. Write-tokens zijn een klassieke val: ze lijken misschien geen "wachtwoorden", maar ze laten een aanvaller wijzigingen pushen, bestanden uploaden, e-mails verzenden of in je database schrijven. Hetzelfde geldt voor admin-keys, service account JSON-bestanden en elk token dat op een lange willekeurige string lijkt.
Niet alles vereist geheime behandeling. Meestal geen geheimen: featureflags (die alleen UI of gedrag veranderen, geen toegang), publieke URL's, UI-tekst, analytics-meet-ID's en interne ID's die op zichzelf geen data kunnen ontsluiten. Als iets zichtbaar hoort te zijn in de front-end of docs, is het waarschijnlijk geen geheim.
Een snelle test: als je boos zou zijn als je het in een openbare chat geplakt of in een publieke repo gecommit zou zien, is het een geheim.
Houd een korte, geschreven lijst bij van de geheimen die je app gebruikt. Noteer voor elk wat het doet (betalingen, e-mail, database, opslag), waar het hoort te leven (dev, staging, prod), wie het bezit (jij, een collega, een vendor-account) en of het lees-only of schrijf-toegang moet zijn. Deze lijst wordt je kaart wanneer je later sleutels roteert zonder te moeten gissen.
De meeste lekken zijn geen "hackers." Het zijn normale momenten waarop iemand een waarde kopieert om verder te kunnen, en daarna vergeet dat het later nog zichtbaar is. Een goede vuistregel: als het doorzoekbaar, gesynchroniseerd, doorgestuurd of gedeeld kan worden, behandel het als publiek.
Chat is een grote bron. Mensen plakken volledige API-sleutels in prompts, teamchats of supportberichten omdat het snel voelt. Maar chats worden opgeslagen en gedeeld. Als je hulp nodig hebt, plak dan alleen de laatste 4–6 tekens en de sleutelnaam, zoals STRIPE_SECRET_KEY ...9f2a.
Git is de klassieke val. Je voegt een sleutel toe aan een bestand "even voor nu", commit het en verwijdert het later. Het geheim zit nog steeds in de commitgeschiedenis. Het kan zich ook verspreiden via forks, gekopieerde snippets of pull request-diffs.
Screenshots en schermopnames lekken meer dan mensen verwachten. Een demovideo kan een instellingenpaneel, een terminalcommando of een foutmelding vastleggen met een token. Zelfs vervagen kan riskant zijn als andere delen zichtbaar zijn.
Issue-trackers en notitie-apps zijn een andere stille bron. Tickets, checklists en gedeelde docs worden gekopieerd tussen teams en vendors. Behandel ze als openbare logs.
Een paar gewoonten voorkomen de meeste lekken:
Als je bouwt in Koder.ai, gebruik dan dezelfde mindset: houd gevoelige waarden in environment-instellingen, niet in de chat die je app definieert.
Het doel is simpel: je app moet geheimen uit de omgeving lezen, niet uit je prompt, niet uit je code en niet uit bestanden die in Git terechtkomen.
Een .env-bestand is een platte tekstfile op je machine die sleutel-waardeparen opslaat. Het maakt lokale setup makkelijk, maar het lekt ook makkelijk, dus behandel het als een portemonnee.
Maak een .env-bestand lokaal en zorg dat het door Git wordt genegeerd (meestal via .gitignore). Als je de namen van variabelen met teamgenoten moet delen, deel dan een voorbeeldbestand zoals .env.example dat alleen placeholders bevat, nooit echte waarden.
Kies heldere namen zodat het duidelijk is wat ze zijn en waar ze horen:
OPENAI_API_KEYSTRIPE_SECRET_KEYDATABASE_URLSENDGRID_API_KEYS3_ACCESS_KEY_IDGoede namen verminderen fouten wanneer je later dev, staging en productie instelt.
Wanneer de app start, vraagt hij het besturingssysteem: "Heb je een waarde voor OPENAI_API_KEY?" Als de waarde bestaat, gebruikt de app die. Als hij ontbreekt, moet de app vroeg falen met een duidelijke foutmelding, in plaats van door te draaien met gebroken gedrag.
Een praktische gewoonte: log dat een variabele aanwezig is (ja/nee), maar print nooit het geheim zelf.
Plak geen sleutels in chatthreads of tickets. Gebruik een wachtwoordmanager (gedeelde kluis) of een ander veilig kanaal en deel alleen wat iemand nodig heeft. Als iemand het team verlaat, roteer dan de sleutel.
Voorbeeld: een oprichter exporteert een Koder.ai-project en draait het lokaal. Ze houden .env op hun laptop, committen alleen .env.example en geven teamgenoten toegang tot de echte sleutels via een gedeelde wachtwoordmanager.
Denk aan omgevingen als drie aparte kamers.
Dev is je laptop of een persoonlijke sandbox waar je snel dingen verandert. Staging is een veilige kopie van productie waar je de volledige app test met realistische instellingen, maar zonder echte klantimpact. Prod is wat klanten gebruiken.
De eenvoudige regel: houd de variabelennamen identiek overal en verander alleen de waarden. Je code leest STRIPE_SECRET_KEY in elke omgeving, maar elke omgeving levert een andere sleutel.
Een kleine mappingtabel (zelfs een simpele notitie) helpt:
| Variable name (same everywhere) | Dev value | Staging value | Prod value |
|---|---|---|---|
PAYMENTS_API_KEY | test key | staging key | live key |
APP_BASE_URL | localhost URL | staging domain | custom domain |
DATABASE_URL | local DB | staging DB | prod DB |
Prod mag geen dev-sleutels hergebruiken. Dev-sleutels worden vaak gedeeld tussen teamgenoten en hebben soms brede rechten.
Om environmentwaarden met een klein team georganiseerd te houden, spreek een paar regels af:
STRIPE_KEY vs STRIPE_API_KEY).Als je een gehoste builder gebruikt zoals Koder.ai, behandel elk deployment target (dev, staging, prod) als een aparte omgeving met eigen geheime waarden, ook al is de code gelijk.
Een rotatie van een geheim betekent het doelbewust vervangen van een API-sleutel op je eigen schema. Goed uitgevoerd is rotatie saai: je verwisselt de sleutel, controleert of alles werkt en deactiveert dan de oude.
Het veiligste mentaal model is "twee sleutels voor korte tijd." Veel providers laten meer dan één actieve sleutel toe. Die overlap zorgt ervoor dat je app blijft draaien terwijl je de configuratie verandert.
Een simpele rotatieprocedure ziet er zo uit:
Als de provider geen meerdere actieve sleutels ondersteunt, kies dan een laag-verkeer tijdstip en verwacht een korte onderbreking. Het doel blijft hetzelfde: verander het geheim op één plek zonder de code aan te raken.
Als je denkt dat een sleutel gelekt is, reageer eerst en onderzoek later. Intrek of disable de sleutel onmiddellijk, maak een nieuwe aan en update je omgevingsvariabele. Nadat je app weer stabiel is, zoek waar het ontsnapte: chatprompts, buildlogs, screenshots, oude commits of gedeelde documenten.
Voorbeeld: je maakte een kleine CRM in Koder.ai die een e-mail-API gebruikt. Je genereert een nieuwe e-mailsleutel, zet die in de app's environment-instellingen, stuurt een testmail en intrekt dan de oude sleutel.
CI/CD is een geautomatiseerde pijplijn die je app bouwt en deployt wanneer je wijzigingen pusht, en vaak heeft het dezelfde geheimen nodig als je app.
De hoofdregel: smokkel API-sleutels niet in buildlogs, sourcecode of chatprompts. Behandel de pipeline als een andere machine die geheimen op gecontroleerde wijze moet ontvangen.
Probeer geheimen te scheiden die nodig zijn tijdens het builden van die welke nodig zijn tijdens het draaien.
Build-time secrets zijn alleen nodig tijdens de buildstap (bijvoorbeeld om een private package te downloaden). Runtime secrets zijn nodig na deploy (bijvoorbeeld voor Stripe of e-mail). Als je sleutels runtime-only kunt houden, verklein je de kans dat ze in een bundle terechtkomen, in artifacts gecachet worden of in build-output geprint worden.
Een snelle zelfcheck: als het geheim nodig is in de browser van de gebruiker, is het geen geheim. Browser-zichtbare "publieke keys" kunnen oké zijn, maar server-API-sleutels horen op de server te blijven.
Gebruik de omgevingsspecifieke geheime opslag van je hostingplatform zodat dev, staging en prod verschillende waarden kunnen hebben.
Als je deployt met Koder.ai hosting, zet geheimen als omgevingsvariabelen per omgeving in plaats van sleutels in code of config-bestanden te plakken. Dan leest je app ze bij runtime (bijv. PAYMENTS_API_KEY in production vs een testkey in staging).
Om productie veilig te houden, beperk wie prod-geheimen mag bekijken of veranderen. Houd de groep die "secrets kan bekijken" klein en scheid deployrechten van secret-edit rechten waar mogelijk. Gebruik aparte sleutels per omgeving zodat staging geen prod-data kan benaderen.
De meeste lekken zijn alledaagse snelkoppelingen die blijven hangen en zich naar het volgende project verplaatsen.
Als een sleutel in je bronbestanden staat, kan hij in backups, screenshots, gedeelde zips en git-geschiedenis terechtkomen.
Fix:
.env toe aan je ignore-file vóór je eerste commit.Als je een echte sleutel in een chat plakt, verlies je controle over waar die tekst wordt opgeslagen of gekopieerd. Als je een vibe-coding tool zoals Koder.ai gebruikt, is het verleidelijk alles in de chat te droppen. Gebruik in plaats daarvan placeholders zoals PAYMENTS_API_KEY=REDACTED en beschrijf het symptoom.
Een goede gewoonte: kopieer foutmeldingen, niet credentials.
Één sleutel die in dev, staging en prod wordt gebruikt betekent dat één lek een veel groter incident wordt. Als meerdere teamleden dezelfde sleutel delen, kun je ook niet zien wie hem gebruikte.
Fix: maak aparte sleutels per omgeving en, als je provider het ondersteunt, aparte sleutels per persoon of per app.
Een veelvoorkomende val is het printen van "alle config" bij startup. Dat bevat vaak tokens.
Fix: log alleen wat je nodig hebt (bijv. "Stripe key geladen: ja") en masqueer waarden (toon de laatste 4 tekens) wanneer je moet identificeren welke sleutel actief is.
Voorbeeld: als staging faalt, print niet de volledige sleutel. Print STRIPE_KEY ending in 9K2P zodat je kunt bevestigen dat je de juiste key hebt gedeployed zonder hem bloot te geven.
Voordat je live gaat, doe één rustige ronde gericht op geheimen.
api_key, secret, token en provider-namen. Check ook gedeelde docs, screenshots en geplakte chatlogs. Als een sleutel ooit in git of een doc verscheen, ga ervan uit dat hij verbrand is en vervang hem.Een kort voorbeeld: als je app een payments-API en een e-mail-API gebruikt, moet je twee aparte sets sleutels hebben voor dev, staging en prod en een duidelijke eigenaar voor elk. Bij deploy (via je hosting of een platform als Koder.ai) map je de juiste env-vars naar de juiste omgeving, in plaats van ze in prompts, code of repos te kopiëren.
Maya is een niet-technische oprichter die een eenvoudige webapp bouwt: gebruikers kunnen zich abonneren en de app stuurt bewijzen en wachtwoordresets per e-mail. Ze houdt haar prompts en repo schoon door geheimen als instellingen te behandelen die buiten de code leven en bij runtime via omgevingsvariabelen worden geïnjecteerd.
Hier is een klein, praktisch setje env-vars dat ze definieert (namen blijven overal hetzelfde; alleen waarden veranderen):
APP_ENV = development / staging / productionAPP_BASE_URL = http://localhost:3000 / https://staging.example.com / https://example.comPAYMENTS_PROVIDER_SECRET_KEY = test key (dev) / test key (staging) / live key (prod)EMAIL_PROVIDER_API_KEY = sandbox key (dev) / restricted key (staging) / full key (prod)DATABASE_URL = local DB (dev) / staging DB (staging) / production DB (prod)Een eenvoudige regel helpt: dev en staging moeten testmodi en gescheiden data gebruiken. Productie gebruikt live sleutels en echte data. Zo zorgt een fout in staging er niet voor dat echte kaarten worden belast of echte klanten e-mails krijgen.
Nu een realistische rotatiegebeurtenis: een aannemer met toegang vertrekt. Maya gaat ervan uit dat oude sleutels mogelijk gecompromitteerd zijn. Ze maakt nieuwe sleutels in de betalingen- en e-maildashboards, updatet de omgevingswaarden voor elke omgeving. Ze roteert productie eerst tijdens een rustig moment, verifieert dat aanmeldingen, betalingen en e-mails blijven werken en roteert daarna staging en dev. Als iets breekt, rolt ze snel terug door de vorige known-good config te herstellen.
Volgende stappen die het later overzichtelijk houden:
Schrijf een één-pagina "Env Var List" voor je app (naam, waarvoor het is, waar het ingesteld wordt en wie er toegang toe heeft). Zet een maandelijkse 10-minuten review in de agenda om ongebruikte sleutels te verwijderen en hoog-risico sleutels te roteren.
Als je al met Koder.ai bouwt (koder.ai), helpt dat om dit georganiseerd te houden omdat je deployments en environment-instellingen op één plek kunt beheren. Snapshots en rollback zijn ook handig als een configwijziging een outage veroorzaakt en je snel moet herstellen.
Een API-sleutel kan snel onverwachte kosten veroorzaken en geeft soms toegang tot privégegevens of acties zoals het verzenden van e-mails. Behandel het als een wachtwoord: als iemand anders het heeft, kunnen ze vaak handelen namens je app.
Zet geheimen in omgevingsvariabelen zodat de waarde buiten je code en buiten alles wat je zou kunnen plakken, committen of screenshotten blijft. Je app leest het geheim op runtime op basis van de naam (bijv. STRIPE_SECRET_KEY), terwijl de code veilig is om te delen.
Een geheim is alles wat een vreemde zou laten betalen, privédata laten zien of je app laten imiteren. API-sleutels, databasewachtwoorden, private tokens, signing keys en webhook-secrets zijn geheimen; publieke ID's en UI-only instellingen meestal niet.
De meest voorkomende lekken gebeuren via chatprompts, teamchats, tickets, screenshots en git-commits (inclusief commitgeschiedenis). Een goede gewoonte is aan te nemen dat alles wat doorzoekbaar, gesynchroniseerd, doorgestuurd of gedeeld kan worden, mogelijk publiek wordt.
Houd een lokale .env-file voor gemak, maar commit deze nooit. Commit in plaats daarvan een .env.example met placeholders zodat teamgenoten de variabelennamen kennen zonder echte waarden te zien.
Gebruik in elke omgeving dezelfde variabelenaam en verander alleen de waarde. Bijvoorbeeld: PAYMENTS_API_KEY bestaat in dev, staging en prod, maar dev gebruikt een testkey en prod de live key.
Nee. Server-API-sleutels mogen nooit in front-end code staan omdat iedereen ze in de browser kan lezen. Routeer verzoeken via je backend en houd het geheim op de server.
Maak eerst een nieuwe sleutel, update de omgevingsvariabele, herstart of redeploy en verifieer dat de echte workflow werkt. Als alles goed werkt, draai je de oude sleutel terug (revoke).
Draai of disable de blootgestelde sleutel onmiddellijk en maak een nieuwe aan, update je omgevingsinstellingen en deploy. Als alles stabiel is, zoek dan waar het gelekt is (chatlogs, commits, screenshots) zodat je de bron kunt opruimen.
Bewaar geheimen in omgevingsinstellingen per omgeving en houd ze uit de projectchat en broncode. Gebruik snapshots en rollback om snel terug te gaan naar een bekende goede staat zonder gelekte sleutels opnieuw in te voeren.