Una chiave API è una stringa unica che identifica l’app che chiama un’API; la sicurezza delle chiavi API consiste nel limitarne l’ambito e proteggerla. Prima la precisione, perché la maggior parte delle definizioni la confonde: una chiave identifica l’applicazione, offre soltanto un’autenticazione debole (è una credenziale bearer – chi la detiene, la incarna) e porta un’autorizzazione grossolana (l’ambito che le è stato attaccato alla creazione). Le persone vengono autenticate dai token; le app vengono identificate dalle chiavi – e nessuna RFC definisce la chiave API. È una convenzione, ed è esattamente per questo che la sua sicurezza dipende dalla configurazione di chi la usa, non dalla garanzia di uno standard.
Punti chiave
| Domanda | Risposta |
|---|---|
| Che cosa fa una chiave | Identifica l’app · misura l’uso · ancora i rate limit |
| Le due specie | Chiavi pubblicabili (fatte per essere spedite) vs. chiavi segrete (classe password) |
| La scala dell’archiviazione | Scritta nel codice: mai → variabili d’ambiente: il minimo → gestore di segreti: lo standard |
| La legge di ferro | Tutto ciò che sta in un bundle client è pubblico – va previsto che venga estratto |
| Risposta a una fuga | Revocare → sostituire → ripulire la cronologia → verificare – in minuti, non in giorni |
La richiesta, e i due tipi di chiave
GET /v1/search?q=espresso HTTP/1.1
Host: api.example.com
X-Api-Key: pk_live_7f2c… ← in un HEADER – gli URL finiscono nei log,
nella cronologia e nei referrer
Due specie diverse condividono un solo nome:
chiave pubblicabile spedita nei bundle web/mobile · identifica l'app,
misura l'uso · progettata sapendo che SARÀ estratta
chiave segreta solo lato server · credenziale bearer tipo password ·
chi la detiene passa per il titolare
Il modello pubblicabile in pratica – chiavi che vengono spedite perché la sicurezza vive altrove:
// JavaScript / Node.js — Back4app JS SDK
// Publishable keys: safe to ship BECAUSE authorization lives server-side
Parse.initialize(APP_ID, JS_KEY); // both ship in your bundle — by design
Parse.serverURL = 'https://parseapi.back4app.com';
// What protects data isn't key secrecy — it's CLPs + ACLs checked per request
// The one key that never ships: the Master Key bypasses every ACL and CLP.
// Server-only (Cloud Code / trusted backend), read from env or secret manager. // Flutter / Dart — Back4app Flutter SDK
// Publishable keys: safe to ship BECAUSE authorization lives server-side
await Parse().initialize(
appId, // ships in the app — by design
'https://parseapi.back4app.com',
clientKey: clientKey, // publishable, extractable, NOT a secret
);
// What protects data isn't key secrecy — it's CLPs + ACLs checked per request
// The Master Key bypasses every ACL and CLP: server-only, never in the app. // iOS / Swift — Back4app Swift SDK
// Publishable keys: safe to ship BECAUSE authorization lives server-side
ParseSwift.initialize(
applicationId: appId, // ships in the IPA — by design
clientKey: clientKey, // publishable, extractable, NOT a secret
serverURL: URL(string: "https://parseapi.back4app.com")!
)
// What protects data isn't key secrecy — it's CLPs + ACLs checked per request
// The Master Key bypasses every ACL and CLP: server-only, never in the app. // Android / Kotlin — Back4app Android SDK
// Publishable keys: safe to ship BECAUSE authorization lives server-side
Parse.initialize(
Parse.Configuration.Builder(context)
.applicationId(APP_ID) // ships in the APK — by design
.clientKey(CLIENT_KEY) // publishable, extractable, NOT a secret
.server("https://parseapi.back4app.com")
.build()
)
// What protects data isn't key secrecy — it's CLPs + ACLs checked per request
// The Master Key bypasses every ACL and CLP: server-only, never in the app. Chiavi API vs. token vs. JWT
| Chiave API | Access token OAuth | JWT | |
|---|---|---|---|
| Identifica | L’applicazione | L’utente (e la concessione) | Ciò che dicono i suoi claim |
| Emissione | Una volta, da un amministratore | A ogni accesso, tramite un flusso | È un formato, non un’emissione |
| Durata | Fino alla rotazione (spesso mai) | Da minuti a ore | Ciò che dice exp |
| Ambito | Fissato alla creazione | Scope per concessione | Definito dai claim |
| Standard | Nessuno – convenzione | OAuth 2.0 | RFC 7519 |
| Uso corretto | ID da server a server, conteggio | Accesso API delegato dall’utente | Trasporto di claim firmati |
Il confronto si riduce a una frase da ricordare: le chiavi identificano le app; i token autenticano le persone. Usare una chiave dove conta l’identità di una persona equivale a ricostruire male l’autenticazione; usare token per utente per contare l’uso anonimo di un’app è macchinario senza scopo.
Dove vivono le chiavi: la scala dell’archiviazione
Scritta nel codice – mai. Il codice sorgente viene copiato, forkato e committato; git ricorda per sempre, e i bot che scansionano i segreti trovano le chiavi nei commit pubblici in pochi minuti. Le variabili d’ambiente – il minimo, con la riserva su cui il cheat sheet di OWASP non gira intorno: le variabili d’ambiente trapelano dai log di errore, dai dump dei processi e dalle definizioni dei container; tengono i segreti fuori da git, non fuori dai guai. Un gestore di segreti (secrets manager) – lo standard di squadra: cifrato a riposo, con accesso controllato per servizio, verificato a ogni lettura, con rotazione centralizzata (fra le opzioni open source ci sono Vault, SOPS e Infisical). Va aggiunta l’igiene che rende le fughe sopravvivibili: chiavi generate in modo crittograficamente casuale, con prefisso (nello stile sk_live_…) perché gli scanner le riconoscano, sottoposte a hash a riposo dal lato del provider come le password, una chiave per app e per ambiente – e una scansione dei segreti (gitleaks, trufflehog) collegata alla CI, perché il commit che fa uscire una chiave fallisca prima di atterrare.
Il problema lato client, in tutta onestà
Ogni spiegazione dice “niente chiavi segrete nel codice client”; quasi nessuna dice la seconda metà: il bundle è pubblico. Il JavaScript del web è leggibile per definizione; i binari mobile vengono scompattati e svuotati delle loro stringhe di routine; l’offuscamento alza lo sforzo da minuti a ore, una volta sola. Ne seguono due conseguenze. Primo, le uniche chiavi che hanno posto in un client sono quelle pubblicabili – progettate per identificare, non per proteggere, con l’autorizzazione vera applicata lato server a ogni richiesta. Secondo, quando un client deve usare un servizio di terze parti protetto da una chiave segreta, il segreto resta dietro il backend proprio – il pattern proxy:
Quando una chiave trapela: il runbook
L’orologio conta – i bot sorvegliano i repository pubblici e sfruttano le chiavi committate in uno a cinque minuti. Nell’ordine: 1 · Revocare la chiave presso il provider – prima di indagare, prima dello standup. 2 · Sostituire – emettere la chiave nuova e distribuirla tramite configurazione, non tramite codice. 3 · Ripulire – rimuoverla dal sorgente e dalla cronologia di git; una riga cancellata sopravvive in ogni clone. 4 · Verificare – i log del provider sulla finestra della fuga: che cosa è stato letto, creato, speso. 5 · Allargare – tutto ciò che conviveva con la chiave (lo stesso .env, lo stesso repository) si presume compromesso; va ruotato anch’esso. E la riserva che distingue una risposta vera da un rituale: la revoca ferma l’uso futuro – non annulla l’esfiltrazione dei dati. Ciò che è stato preso durante la finestra è un incidente, non una rotazione.
La rotazione senza interruzioni di servizio
La rotazione mette un tetto al valore delle fughe non rilevate – una chiave rubata a cui restano 60 giorni non è lo stesso bene di una valida per sempre. Cadenza basata sul rischio: da 30 a 90 giorni per le chiavi ad ambito ampio o condivise all’esterno, fino a un anno per quelle interne a portata ristretta, immediatamente in caso di sospetta esposizione o di uscita di chiunque l’abbia detenuta. La mossa senza interruzioni è la sovrapposizione a doppia chiave: emettere la chiave nuova mentre la vecchia resta valida, migrare i deployment con calma, poi revocare la vecchia – lo stesso trucco che i sistemi a refresh token formalizzano. I regimi di conformità richiedono sempre più quel calendario; l’argomento di sicurezza non ne ha mai avuto bisogno.
Casi d’uso tipici
- Integrazione da server a server – l’habitat naturale della chiave: un servizio che si identifica presso un altro.
- Conteggio dell’uso e fatturazione – la chiave come unità che i provider contano, limitano e fatturano.
- Identificazione pubblicabile dei client – bundle di app che portano chiavi fatte per essere esposte, con l’autorizzazione altrove.
- Separazione degli ambienti – chiavi di test e di produzione che tengono gli incidenti di staging lontani dai dati di produzione.
- Contenimento degli abusi – rate limit per chiave e revoca come leve di controllo del raggio d’impatto.
Quale credenziale conviene usare? Matrice decisionale
| Situazione | Scegliere |
|---|---|
| Un backend che chiama un’API di terze parti | Chiave segreta, in un gestore di segreti |
| Identificare l’app dal web o dal mobile | Chiave pubblicabile + autorizzazione lato server |
| Agire a nome di una persona autenticata | Token OAuth, non chiavi |
| Claim firmati fra servizi | JWT |
| Un client ha bisogno di un servizio a chiave segreta | Il backend proprio come proxy – il segreto non parte mai |
| Da macchina a macchina con auth tipo utente | Il flusso client credentials di OAuth |
Limiti e trade-off
- Le chiavi non provano il possesso. Una stringa bearer non offre alcun legame crittografico con il chiamante; per l’autenticazione di servizio ad alta garanzia, il TLS mutuo e le richieste firmate esistono per un motivo.
- Le credenziali statiche invecchiano male. Senza scadenza ogni fuga resta aperta fino a quando non viene notata; la rotazione è il sostituto manuale del ciclo di vita che i token ottengono gratis.
- Gli ambiti grossolani condividono troppo. Una chiave con permessi ampi è un passepartout; un ambito granulare costa amministrazione e rende in raggio d’impatto.
- Le chiavi identificano, non autenticano. Costruire una fiducia a livello di utente su un’identificazione a livello di app è il pattern di broken authentication che i revisori cercano per primo.
- La deriva dell’inventario è reale. Le chiavi inutilizzate di vecchie integrazioni restano valide fino alla cancellazione – le credenziali zombie, cugine degli endpoint zombie.
Le chiavi API su Back4app
Back4app è una piattaforma open-source di Backend as a Service (BaaS) che combina database gestito, API REST e GraphQL generate automaticamente, autenticazione, archiviazione di file e funzioni serverless con Cloud Code. Il suo modello di chiavi è la sezione lato client resa concreta: l’Application ID e le chiavi client vengono spediti dentro le app per progetto – la documentazione di Back4app è esplicita, le chiavi client non sono meccanismi di sicurezza – perché l’autorizzazione non dipende mai da loro: ogni richiesta viene verificata lato server rispetto ai permessi di classe e alle ACL, così una chiave estratta concede a chi attacca esattamente ciò che ottiene un utente anonimo. L’unico vero segreto è la Master Key, che aggira ogni ACL e CLP: vive solo lato server – Cloud Code, backend fidati, variabili d’ambiente o gestore di segreti – e mai in un bundle. Le schede di codice mostrano la ripartizione in pratica; il runbook si applica alla sola master key, ed è questo il punto: un solo segreto da custodire è una postura di sicurezza, quaranta sono un foglio di calcolo.
Domande frequenti
Che cos'è una chiave API?
Una stringa unica che un provider di API rilascia a un'applicazione registrata e che accompagna ogni richiesta – idealmente in un header – perché il server possa identificare il chiamante, applicarne i permessi, misurare l'uso e imporre i rate limit. Dettaglio notevole: nessuno standard la definisce. Le chiavi API sono una convenzione, non un protocollo.
Una chiave API è una password?
Una chiave segreta appartiene di fatto alla classe delle password: è una credenziale bearer, quindi chiunque la detenga passa per il titolare – stessa disciplina di archiviazione, stesse conseguenze in caso di violazione. Le differenze: le chiavi identificano applicazioni invece di persone, e molte non scadono mai fino a quando non vengono ruotate.
Qual è la differenza tra una chiave API e un token?
Le chiavi identificano le app; i token autenticano le persone. Una chiave è statica, generata da un amministratore e legata a un'applicazione; un access token OAuth viene emesso all'accesso, dura poco, è rinnovabile e porta i permessi di un utente preciso. L'identificazione da server a server si adatta alle chiavi; tutto ciò che è specifico di un utente spetta ai token.
Dove vanno conservate le chiavi API?
Mai nel codice sorgente. Le variabili d'ambiente lette da un file non versionato sono il minimo – con la riserva che trapelano attraverso i log, i dump dei processi e le definizioni dei container – e un gestore di segreti è lo standard di squadra: cifrato a riposo, con accesso controllato, verificato e compatibile con la rotazione.
Si può mettere una chiave API nel codice frontend o mobile?
Solo una chiave pubblicabile progettata per questo. Tutto ciò che sta in un bundle JavaScript o in un binario di app è pubblico: l'estrazione è una routine e l'offuscamento la rallenta soltanto. Le chiavi segrete restano lato server; quando un client ha bisogno di un servizio protetto da una chiave segreta, la chiamata va instradata attraverso il backend proprio.
Che cosa fare quando una chiave API trapela?
Subito: revocare la chiave, distribuire una sostituta, ripulirla dal codice e dalla cronologia di git, esaminare i log d'uso in cerca di abusi e ruotare tutto ciò che era conservato accanto. Conviene muoversi in fretta – i bot provano le chiavi committate nei repository pubblici in pochi minuti – e ricordare che la revoca ferma l'uso futuro, non i dati già portati via.
Con quale frequenza vanno ruotate le chiavi API?
In base al rischio: da 30 a 90 giorni per le chiavi ad ambito ampio o esposte all'esterno, più a lungo per quelle interne a rischio basso, e immediatamente in caso di sospetta esposizione o di uscita di una persona dal team. La rotazione senza interruzioni si appoggia a una finestra di sovrapposizione in cui la chiave vecchia e quella nuova sono entrambe valide, il tempo che i deployment si allineino.
Come trapelano le chiavi API?
In ordine di notorietà: committate nei repository git, spedite nei bundle client e nei binari mobile, messe negli URL dove i log del server e la cronologia del browser le catturano, stampate nei log applicativi e di CI, e incollate in chat e ticket. Ogni vettore è evitabile, ed è proprio questo a rendere l'elenco deprimente.