Aller au contenu principal

Protéger votre clé API : ne jamais exposer côté client

Mis à jour le 28 juillet 2026

Une clé API est un mot de passe

Votre clé API xAI est l’équivalent d’un mot de passe avec accès complet à votre compte. Toute personne qui la possède peut effectuer des appels API à vos frais, accéder à vos modèles, et potentiellement compromettre vos données. La différence avec un mot de passe classique ? Une clé volée est exploitable silencieusement : vous ne verrez rien avant la facture, ou avant l’alerte de votre équipe finance. La règle est donc simple et absolue : ne jamais exposer une clé API côté client.

Les vecteurs d’exposition courants

Le cas le plus fréquent est l’inclusion directe de la clé dans du JavaScript frontend :

// DANGER - ne JAMAIS faire cela
const response = await fetch("https://api.x.ai/v1/chat/completions", {
  headers: { "Authorization": "Bearer xai-abc123..." }
});

Ce code, une fois déployé, est visible par n’importe qui dans les outils de développement du navigateur. Il suffit d’ouvrir l’onglet Réseau pour lire la clé en clair dans les en-têtes de requête.

Un vecteur plus sournois, parce qu’il donne une fausse impression de propreté : les variables d’environnement frontend. Les variables préfixées NEXT_PUBLIC_, VITE_ ou REACT_APP_ sont intégrées dans le bundle JavaScript au moment du build, et donc publiques. Le développeur croit avoir « sorti la clé du code » ; en réalité elle est simplement compilée dedans :

# DANGER - cette variable sera dans le bundle
NEXT_PUBLIC_XAI_API_KEY=xai-abc123...

Les dépôts Git constituent le troisième vecteur classique. Même un commit supprimé reste dans l’historique Git : si vous avez committé une clé par erreur, réécrire l’historique ne suffit pas, car des clones et des forks peuvent l’avoir conservée. Considérez-la comme compromise et révoquez-la. Enfin, les clés fuient aussi par des chemins indirects, plus difficiles à imaginer et pourtant très courants : logs applicatifs qui tracent les en-têtes complets, messages d’erreur affichés à l’utilisateur, ou outils de monitoring qui capturent les requêtes sortantes.

L’architecture proxy : la solution

La seule approche sécurisée est de proxier tous les appels via votre backend :

Client (navigateur/mobile)
    ↓ requête sans clé API
Votre Backend (serveur)
    ↓ ajoute la clé API (variable d'environnement)
API xAI
    ↓ réponse
Votre Backend
    ↓ transmet la réponse (filtrée si besoin)
Client

Voici un proxy minimaliste en Python :

# Backend Python (Flask)
import os
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)
XAI_KEY = os.environ["XAI_API_KEY"]  # Variable serveur uniquement

@app.route("/api/chat", methods=["POST"])
def proxy_chat():
    user_message = request.json.get("message")

    response = requests.post(
        "https://api.x.ai/v1/chat/completions",
        headers={"Authorization": f"Bearer {XAI_KEY}"},
        json={
            "model": "grok-4.3",
            "messages": [{"role": "user", "content": user_message}]
        }
    )

    return jsonify(response.json())

Au-delà de la protection de la clé — qui n’est jamais transmise au client —, le proxy vous offre un point de contrôle que l’appel direct rend impossible. Vous pouvez filtrer les requêtes : rate limiting pour empêcher un client de vider votre quota, validation des entrées, modération des contenus. Vous contrôlez les modèles accessibles, ce qui évite qu’un client détourné n’appelle un modèle coûteux et ne génère un surcoût inattendu. Vous pouvez logger les appels pour l’audit — un besoin central pour un responsable conformité. Et vous pouvez mettre en cache certaines réponses pour réduire les coûts sur les requêtes répétitives.

Stockage sécurisé des clés

Côté serveur, la base est la variable d’environnement, chargée depuis un fichier .env qui n’est jamais committé dans Git :

# Fichier .env (JAMAIS committé dans Git)
XAI_API_KEY=xai-votre-cle-secrete

Ajoutez systématiquement ces fichiers à votre .gitignore :

# .gitignore
.env
.env.local
.env.production

Pour les environnements de production, le fichier .env posé sur un serveur reste un artisanat fragile : préférez un gestionnaire de secrets dédié. Les options éprouvées incluent AWS Secrets Manager ou SSM Parameter Store, Google Secret Manager, Azure Key Vault, HashiCorp Vault, ou encore Doppler et Infisical pour les structures plus légères. Ce que ces outils apportent par rapport au fichier plat : la rotation automatique des clés, l’audit des accès — qui a lu quel secret, quand — et le chiffrement au repos. Autant d’éléments que vous pourrez présenter tels quels lors d’un audit de sécurité, là où un fichier texte sur une machine ne prouve rien.

Que faire si votre clé est compromise

Si vous suspectez qu’une clé a été exposée, l’ordre des gestes compte autant que les gestes eux-mêmes. Révoquez la clé dans la console xAI (console.x.ai) avant toute autre chose : chaque minute où la clé compromise reste active est une minute d’exploitation possible, et la continuité de service se traite après, pas avant. Générez ensuite une nouvelle clé et mettez à jour vos backends pour rétablir le service.

L’incident n’est pas clos pour autant. Auditez l’utilisation en cherchant les appels API suspects dans votre historique de facturation — un pic sur une plage horaire inhabituelle, une consommation attribuée à un modèle que vous n’utilisez pas. Identifiez la source de la fuite, sans quoi la nouvelle clé suivra le même chemin que l’ancienne. Terminez en scannant votre code avec des outils comme gitleaks ou truffleHog, qui parcourent aussi l’historique Git et révèlent souvent d’autres secrets oubliés depuis longtemps.

Points clés à retenir

  • Une clé API est un mot de passe avec accès complet à votre compte
  • Toujours proxier les appels API via votre backend
  • Les variables NEXT_PUBLIC_, VITE_, REACT_APP_ sont publiques
  • Utilisez un gestionnaire de secrets en production
  • Si une clé est compromise, révoquez-la immédiatement et auditez l’utilisation