Cómo Almacenar Claves de API de Forma Segura en una Aplicación Web Sin Filtrarlas

Las claves de API filtradas son uno de los errores de seguridad más evitables — y más costosos — que puede cometer un desarrollador web. Una sola credencial expuesta puede acumular miles de dólares en cargos fraudulentos en la nube de la noche a la mañana, o darle a un atacante acceso a los datos privados de tus usuarios. Este artículo explica exactamente cómo almacenar claves de API de forma segura en una aplicación web, por qué los atajos comunes fallan, y cómo es un pipeline de gestión de secretos correctamente diseñado.
La forma más segura de almacenar claves de API en una aplicación web es mantenerlas en el servidor, fuera de tu código base y cifradas en reposo. Usa variables de entorno inyectadas en tiempo de ejecución, respaldadas por un gestor de secretos como AWS KMS o HashiCorp Vault. Nunca coloques una clave directamente en el código fuente, en un bundle de JavaScript del frontend ni en un repositorio público — ni siquiera temporalmente.
¿Cuáles Son los Riesgos de Escribir Claves de API Directamente en el Código Fuente?
Cuando pegas una clave de API directamente en tu código — incluso detrás de un comentario que dice "eliminar antes de subir" — estás creando un registro permanente. El historial de Git es para siempre. Una clave confirmada a las 9 a.m. y eliminada a las 9:05 a.m. sigue siendo legible en git log durante toda la vida del repositorio. Escáneres automatizados como el escaneo de secretos de GitHub detectan muchos de estos casos, pero el daño suele ocurrir antes de que salte la alerta.
Más allá del historial de versiones, las claves escritas directamente en el código aparecen en:
- Registros de compilación — los sistemas CI/CD suelen imprimir el contexto del entorno, y una clave en el código fuente puede filtrarse en registros de texto plano accesibles para todos en el equipo.
- Bundles de JavaScript del frontend — si una clave se importa en algún lugar del código del lado del cliente, cualquier navegador que cargue tu aplicación puede leerla en DevTools → Sources en menos de 10 segundos.
- Dependencias de terceros — los ataques a la cadena de suministro contra paquetes de npm se han usado específicamente para extraer variables de entorno y código fuente que contiene secretos.
"El tiempo promedio entre que un secreto se sube a un repositorio público de GitHub y su primer uso no autorizado es inferior a cuatro minutos." — un hallazgo citado repetidamente en informes de incidentes de seguridad en la nube.
Los costos financieros y reputacionales son reales: una clave de AWS filtrada fue responsable de una factura de más de 50.000 dólares en un post-mortem ampliamente compartido, y Google Cloud ha documentado patrones similares.
¿Deberían Almacenarse las Claves de API en Variables de Entorno?
Sí — las variables de entorno son el estándar de referencia de la industria para separar los secretos del código. En lugar de escribir const apiKey = "sk-live-abc123", haces referencia a process.env.MY_API_KEY. El valor real vive en un archivo .env localmente (que añades a .gitignore y nunca confirmas) o en una configuración de entorno a nivel de plataforma que se mantiene completamente fuera del repositorio.
Cómo funciona la inyección en tiempo de ejecución
En el momento de compilación o inicio, el entorno de ejecución lee el entorno e inyecta el valor en la memoria del proceso de tu servidor. La clave está disponible para la lógica de tu aplicación, pero:
- Nunca se serializa en el bundle desplegado.
- No aparece en el control de versiones.
- Puede rotarse sin tocar una sola línea de código.
La regla crítica: las variables de entorno que comienzan con NEXT_PUBLIC_ en Next.js (o VITE_ en Vite) se incluyen en la salida del lado del cliente. Cualquier clave con esos prefijos es pública. Solo las variables de entorno del lado del servidor permanecen ocultas.
¿Cómo Se Usa un Gestor de Secretos para Almacenar Claves de API?
Un gestor de secretos va más allá de los archivos .env al añadir cifrado, versionado, políticas de acceso y registros de auditoría. AWS Secrets Manager, AWS KMS, HashiCorp Vault y Doppler son opciones comunes.
El patrón general funciona así:
- Almacena el secreto en el gestor de secretos a través de su interfaz o CLI. El valor se cifra en reposo usando una clave gestionada (KMS, AES-256).
- Otorga a tu aplicación un rol o política IAM que le permita leer ese secreto específico — y nada más.
- En tiempo de ejecución, tu aplicación llama a la API del gestor de secretos para recuperar el valor. La clave en texto plano solo se mantiene en memoria, nunca se escribe en disco ni en registros.
- Rota la clave en el gestor de secretos; tu aplicación recoge el nuevo valor sin necesidad de un redespliegue.
Este modelo significa que incluso si el código de tu aplicación es completamente público (de código abierto), el secreto no lo es — porque el código solo contiene una referencia al nombre del secreto, no a su valor.
¿Cómo Se Evita que las Claves de API Queden Expuestas en el Código del Lado del Cliente?
La regla es simple: cualquier clave de API que deba permanecer secreta solo debe llamarse desde código del lado del servidor. Esto significa:
- Coloca las llamadas a API en funciones de servidor, rutas de API o servicios de backend — no en componentes de React, manejadores de eventos del lado del navegador ni en HTML estático.
- Usa un patrón de proxy: tu frontend llama a tu propio endpoint de backend (p. ej.,
/api/weather), que autentica al usuario y luego llama a la API de terceros usando la clave secreta almacenada en el servidor. - Audita tus bundles periódicamente con herramientas como webpack-bundle-analyzer para confirmar que ningún secreto se ha colado en la salida del cliente.
Si un secreto está en un archivo JavaScript que se envía al navegador, no es un secreto. Considera cualquier clave "oculta" del lado del cliente como completamente comprometida.
¿Pueden Almacenarse las Claves de API de Forma Segura en una Base de Datos?
Técnicamente sí — una base de datos puede almacenar claves de API si se cifran antes de la inserción (usando cifrado a nivel de aplicación o un esquema de cifrado de columnas respaldado por KMS) y si el acceso a la base de datos en sí está estrictamente controlado. Sin embargo, esto es generalmente más complejo que las variables de entorno o un gestor de secretos dedicado, e introduce nuevas superficies de ataque: las credenciales de la base de datos, las cadenas de conexión y el registro a nivel de ORM pueden exponer las claves que intentas proteger.
Para la mayoría de las aplicaciones web, un gestor de secretos o una bóveda gestionada por la plataforma es la herramienta adecuada. Reserva el almacenamiento en base de datos para claves de API proporcionadas por el usuario (p. ej., cuando cada usuario almacena su propia clave para llamar a un servicio en su nombre) — e incluso en ese caso, cifra la columna en reposo con una clave KMS separada.
Paso a Paso: Añadir una Clave de API Segura a un Proyecto de FloopFloop
FloopFloop es un constructor de aplicaciones web impulsado por IA que genera y despliega aplicaciones Next.js + TypeScript. Su plataforma incluye una bóveda de secretos integrada para que ni tú ni el generador de código de IA necesitéis escribir nunca una clave sin procesar en el código de la aplicación.
Este es el flujo de trabajo para añadir, por ejemplo, una clave de API de proveedor de pagos o de clima:
- Abre tu proyecto en la plataforma FloopFloop y navega al área de configuración del proyecto.
- Encuentra el panel de Secretos / Variables de Entorno. Introduce el nombre de la clave (p. ej.,
WEATHER_API_KEY) y pega el valor. La plataforma cifra el valor en reposo usando AWS KMS antes de que se persista. - Guarda. El secreto ahora está almacenado en la bóveda cifrada de FloopFloop. Nunca aparecerá en tu código fuente generado, en los registros de compilación ni en ninguna salida visible.
- Referencia la clave en tu aplicación. Cuando describes una funcionalidad a la IA de FloopFloop (p. ej., "obtener el tiempo actual usando mi WEATHER_API_KEY"), el código generado hace referencia a
process.env.WEATHER_API_KEY— un nombre, no un valor. - En tiempo de ejecución, FloopFloop inyecta el secreto en el entorno de la función serverless. El valor en texto plano solo existe en memoria durante la ejecución.
- Para rotar la clave, regresa al panel de secretos, actualiza el valor y el cambio surte efecto de inmediato — sin necesidad de editar el código ni redesplegar.
Este diseño significa que incluso el propio proceso de generación de código nunca tiene acceso al valor en texto plano de tu secreto.
Buenas Prácticas para la Rotación, el Alcance y la Auditoría de Secretos
Complementar el almacenamiento seguro con buenos hábitos operativos cierra el ciclo:
- Rota las claves con regularidad. Muchos proveedores permiten establecer fechas de caducidad. Una cadencia de rotación de 90 días es una línea base común para las claves de producción.
- Limita el alcance de las claves a los permisos mínimos necesarios. Si tu aplicación solo lee datos, crea una clave de API de solo lectura — no una clave de administrador.
- Usa claves separadas por entorno. Tus entornos de desarrollo, staging y producción deben tener cada uno sus propias credenciales, de modo que una filtración en desarrollo no comprometa producción.
- Monitoriza el uso. La mayoría de los proveedores de API ofrecen paneles de uso. Configura alertas para picos inusuales — una clave comprometida suele manifestarse como un repentino aumento del tráfico antes que cualquier otro indicador.
- Revoca inmediatamente ante cualquier sospecha. En el momento en que sospechas que una clave ha sido expuesta, revócala primero e investiga después.
Errores Comunes que Cometen los Desarrolladores No Técnicos — y Cómo las Plataformas Gestionadas los Previenen
Los desarrolladores no técnicos se enfrentan a una curva de riesgo más pronunciada porque pueden no saber que pegar una clave en un archivo .js es peligroso. Los errores más comunes:
- Pegar claves de API directamente en el prompt de la IA mientras se construye — lo que puede incrustar el valor en los registros de conversación o en comentarios generados.
- Usar la misma clave para pruebas locales y producción.
- Compartir archivos de proyecto (o capturas de pantalla) que contienen cadenas de claves visibles.
- No darse cuenta de que un frontend desplegado públicamente expone todo el JavaScript a cualquier persona con un navegador.
Una plataforma que gestiona los secretos por diseño — donde las claves se introducen en una bóveda cifrada y se inyectan en tiempo de ejecución — elimina estos fallos de forma estructural, no solo mediante la disciplina del desarrollador.
Conclusión
Saber cómo almacenar claves de API de forma segura en una aplicación web se reduce a tres principios: mantener los secretos fuera de tu código, cifrarlos en reposo e inyectarlos en tiempo de ejecución desde una bóveda controlada y auditada. Las variables de entorno son el punto de partida; un gestor de secretos adecuado es el punto de llegada. Si estás construyendo una aplicación web y quieres que estas protecciones se gestionen automáticamente por ti, FloopFloop cifra cada secreto con KMS y lo inyecta en tiempo de ejecución — para que el problema esté resuelto antes de que pienses en preguntarte al respecto.
Preguntas frecuentes
¿Cuál es la forma más segura de almacenar claves de API en una aplicación web?
La forma más segura es almacenar las claves de API en un gestor de secretos cifrado (como AWS Secrets Manager o HashiCorp Vault), inyectarlas como variables de entorno del lado del servidor en tiempo de ejecución, y asegurarse de que nunca se incluyan en bundles de JavaScript del lado del cliente ni en repositorios de código fuente.
¿Deberían almacenarse las claves de API en variables de entorno?
Sí — las variables de entorno son el estándar de referencia de la industria. Mantienen los secretos fuera del código fuente y del historial de versiones. Sin embargo, en frameworks como Next.js, solo las variables de entorno del lado del servidor son seguras; cualquier variable con el prefijo NEXT_PUBLIC_ se incluye en la salida del navegador y es efectivamente pública.
¿Cómo se evita que las claves de API queden expuestas en el código del lado del cliente?
Nunca importes ni hagas referencia a una clave de API secreta en ningún archivo que se ejecute en el navegador. En su lugar, coloca todas las llamadas a APIs de terceros en funciones del lado del servidor o rutas de API. Tu frontend debe llamar a tu propio endpoint de backend, que luego llama al servicio externo usando la clave secreta almacenada en el servidor.
¿Cuáles son los riesgos de escribir claves de API directamente en el código fuente?
Las claves escritas directamente en el código persisten en el historial de Git incluso después de eliminarlas, pueden aparecer en registros de compilación y salida de CI/CD, y se incluyen en el JavaScript del lado del cliente donde cualquier usuario puede leerlas en las herramientas de desarrollo del navegador. Los escáneres automatizados en repositorios públicos pueden detectar y explotar claves filtradas en menos de cuatro minutos.
¿Cómo se usa un gestor de secretos para almacenar claves de API?
Almacena el valor de la clave en el gestor de secretos (no en el código), otorga a tu aplicación un rol IAM que solo pueda leer ese secreto específico, y haz que tu aplicación recupere el valor en texto plano en tiempo de ejecución mediante una llamada a la API. La clave solo se mantiene en memoria y puede rotarse sin ningún cambio en el código.
¿Pueden almacenarse las claves de API de forma segura en una base de datos?
Sí, pero solo si se cifran antes de la inserción usando cifrado a nivel de aplicación o cifrado de columnas respaldado por KMS, y si el acceso a la base de datos en sí está estrictamente controlado. Para la mayoría de las aplicaciones, un gestor de secretos dedicado es más simple y seguro. El almacenamiento en base de datos es más apropiado para claves proporcionadas por el usuario, donde la clave de cada usuario se cifra individualmente.
Suscríbete al boletín de FloopFloop
Nuevos artículos, novedades del producto y alguna que otra lección — directo a tu bandeja de entrada.
Nunca compartiremos tu correo. Date de baja cuando quieras.
