Sécurité
26 octobre 20244 min de lecture

Comment savoir si une clé API est exposée dans Next.js ?

Les clés API (Stripe, Supabase, OpenAI) exposées publiquement sont la première cause de piratage des apps vibe-codées. Voici comment les détecter et les sécuriser dans Next.js.

Une clé API est exposée si elle apparaît dans du code public envoyé au navigateur, dans les en-têtes d'une requête réseau depuis le client, ou si elle utilise le préfixe NEXT_PUBLIC_ alors qu'elle devrait être secrète. Les clés destinées au serveur ne doivent jamais être importées dans un composant marqué "use client".

Lorsque vous générez une application avec un agent IA (Cursor, Lovable, Bolt.new), la gestion des clés est souvent la première faille. Par souci de rapidité, l'IA crée un code qui expose accidentellement vos clés privées (OpenAI, Stripe) directement aux yeux de tous.

L'architecture Client / Serveur de Next.js

Next.js (App Router) permet d'exécuter du code à la fois côté Serveur (Node.js sécurisé) et côté Client (Navigateur, public).

La règle d'or de la cybersécurité web est simple : les clés API privées ne doivent jamais quitter l'environnement serveur.

La convention des variables d'environnement

Dans Next.js, seules les variables d'environnement préfixées par NEXT_PUBLIC_ sont incluses dans le JavaScript public envoyé au navigateur.

# Exposé au public (Sécurisé car conçu pour le frontend)
NEXT_PUBLIC_SUPABASE_URL=https://xyz.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGci...

# Secret et protégé côté serveur UNIQUEMENT
STRIPE_SECRET_KEY=sk_live_123456...
OPENAI_API_KEY=sk-123456...
L'illusion de sécurité

Beaucoup de développeurs pensent que si la clé n'a pas le préfixe NEXT_PUBLIC_, elle est protégée. C'est faux. Si vous l'importez au mauvais endroit dans le code, Next.js "hardcodera" sa valeur lors de la compilation.

L'erreur fatale du Vibe Coding

Souvent, une IA génère un composant "Client" ("use client") et y insère directement l'appel à une API tierce pour aller plus vite :

"use client"; // Le fichier est envoyé au navigateur

// ❌ DANGER : Ce code expose la clé OpenAI publiquement
export function ChatGenerator() {
  const generate = async () => {
    const res = await fetch("https://api.openai.com/v1/chat/completions", {
      headers: {
        Authorization: `Bearer ${process.env.OPENAI_API_KEY}`
      }
    });
  }
}

Même sans le préfixe NEXT_PUBLIC_, l'utilisation de process.env.OPENAI_API_KEY dans un fichier marqué "use client" va obliger le compilateur de Next.js à injecter la vraie clé (ex: sk-12345...) dans le code source de la page. N'importe quel visiteur, ou pire, des bots automatisés scannant le web, pourront voler votre clé.

3 méthodes pour détecter une fuite de clés API

Audit manuel

  1. Recherche de texte brut : Allez sur votre site en production. Faites clic-droit > "Afficher le code source de la page". Faites Ctrl+F et cherchez les préfixes classiques : sk_live_, sk-, ou Bearer sk-.
  2. Inspection réseau (Network) : Ouvrez les outils développeur (F12), onglet "Network" (Réseau). Cliquez sur un bouton de votre app. Si une requête part vers api.openai.com ou api.stripe.com depuis le navigateur, vérifiez les "Request Headers". S'ils contiennent votre clé secrète, vous êtes compromis.
  3. Fichiers JS compilés : Dans l'onglet "Sources", fouillez les fichiers .js générés par Webpack/Next et cherchez-y vos clés.

La solution de sécurité : Route Handlers et Server Actions

Toute interaction avec une API payante ou nécessitant des clés privées doit être isolée sur votre backend.

  1. Créez un fichier backend (ex: app/api/chat/route.ts ou une Server Action) qui s'exécute uniquement sur le serveur.
  2. Effectuez l'appel API sécurisé vers OpenAI ou Stripe depuis ce fichier.
  3. Modifiez votre composant React côté client pour appeler votre propre route interne (ex: fetch('/api/chat')).

Foire aux questions (FAQ)

Que faire si j'ai accidentellement publié (push) ma clé sur GitHub ?
Supprimer la clé du fichier ne suffit pas, car elle reste dans l'historique Git. Allez immédiatement sur le tableau de bord du fournisseur (Stripe, OpenAI) et 'Révoquez' (Revoke) la clé. Puis générez-en une nouvelle.
Est-ce que l'Analyse Express GVO détecte ces fuites ?
L'Analyse Express scanne la surface publique (les bundles JavaScript envoyés au navigateur) à la recherche de clés API. Cependant, pour vérifier si des secrets sont hardcodés en profondeur dans votre serveur ou votre repository GitHub, il faut procéder à un Audit Complet.

Si vous n'êtes pas certain que votre code généré par l'IA respecte ces règles, ou si vous vous demandez pourquoi votre SaaS consomme des API payantes sans utilisateurs, commencez par lancer une Analyse Express sur votre domaine public, puis passez à l'Audit Complet.

Passez à l'action

Vous ne savez pas si votre propre site présente ce problème ?

Faites vérifier votre application générée par l'IA en quelques secondes. C'est gratuit, sans création de compte, et vous saurez immédiatement si vous êtes vulnérable.

Lancer une Analyse Express Gratuite