Secretos y claves de API: la trampa de la clave expuesta
Un es cualquier cosa que otorga acceso: claves de (Application Programming Interface, Interfaz de Programación de Aplicaciones), contraseñas de bases de datos, tokens de proveedores de pago, claves de firma. El error de vibe coding más común — y más caro — es filtrar uno.
Dos trampas atrapan a la gente constantemente:
- Secretos en el código del cliente. Todo lo que está en tu (el JavaScript que se ejecuta en el navegador) es público. Los usuarios pueden abrir las herramientas de desarrollador y leerlo. La IA, cuando se le pide que llame a una API desde un componente de React, pegará alegremente tu clave secreta ahí mismo — y ahora cualquiera que visite tu sitio puede copiarla y disparar tu factura. Las claves secretas pertenecen al servidor, nunca al código que se envía al navegador.
- Secretos en el repositorio. Una clave escrita directamente en un archivo se termina subiendo a . Aunque la borres más tarde, sigue viva para siempre en el historial de git, y hay bots que escanean repositorios públicos buscando justo esto a los pocos minutos de un push.
El lugar correcto para un secreto es una — un valor que se le suministra a la app en tiempo de ejecución, mantenido completamente fuera del código:
// VULNERABLE: key is in the source, will be committed to git
const stripe = new Stripe("sk_live_51H8xQ2eZvK...");
// SAFE: key is read from the environment, never written in code
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
Un secreto tiene exactamente un hogar seguro: del lado del servidor, leído desde el entorno. El navegador es un lugar público: cualquier cosa enviada ahí puede leerla cualquiera que abra las herramientas de desarrollador.
┌──────────────────────────────────────────┐
│ .env (gitignored, never committed) │
│ STRIPE_SECRET_KEY=sk_live_... │
└───────────────────┬──────────────────────┘
│ injected at runtime
▼
┌──────────────────────┐ ┌──────────────────────┐
│ SERVER │ │ BROWSER (client) │
│ process.env.KEY ✓ │ ✗──────│ anyone can read │
│ calls Stripe here │ NEVER │ dev tools · "view │
│ │ send │ source" · network │
└──────────────────────┘ here └──────────────────────┘
safe: stays private public: = leaked
Añade .env (y .env.local, etc.) a tu .gitignore antes de escribir un solo secreto. Si alguna vez una clave termina en tu código o en tu historial, trátala como quemada: rótala (genera una nueva y revoca la vieja) — borrar la línea no basta, porque la clave vieja sigue siendo válida y sigue estando ahí fuera.