¿Tu API Key de Firebase es segura en el frontend? Hablemos claro

Muchos desarrolladores se preguntan si exponer la API Key de Firebase en el frontend es un riesgo de seguridad. La respuesta corta es no, pero hay matices.

La pregunta de si tu apiKey de Firebase es segura en el frontend sale cada cierto tiempo. De hecho, me pasó con un cliente hace poco y su duda era totalmente válida. La respuesta directa es: sí, es segura. Al menos, por sí sola, exponerla no es un riesgo de seguridad mayor.

¿Por qué podemos estar tan tranquilos? Simple. La apiKey de Firebase no es para autorización. Su propósito es únicamente identificar tu proyecto en los servidores de Google. Es como el número de tu casa; la gente necesita saber dónde vives para visitarte, pero eso no les da permiso para entrar y hacer lo que quieran sin tu autorización.

La seguridad real y efectiva viene de las reglas de seguridad de Firebase. Estas reglas controlan quién puede leer, escribir o modificar datos en tu base de datos o almacenamiento. Lo crucial es que se aplican directamente en los servidores de Firebase.

No importa si alguien consigue tu apiKey o no; si las reglas dicen "no puedes hacer esto", entonces simplemente no puedes. Son el verdadero guardián. Para mí, esto fue algo que no tuve 100% claro al principio y me costó entenderlo bien.

Durante mis primeros años con Firebase, yo mismo me complicaba demasiado con esto. Pensaba que debía ocultarla a toda costa. Pero el punto es que cualquier aplicación —sea web, iOS o Android— necesita esa llave para saber con qué proyecto específico de Firebase conectarse y empezar a interactuar.

Hay quienes intentan añadir capas de restricción, como limitar la apiKey a un dominio específico. Esto se hace desde la consola de Google Cloud, en la sección de "Credenciales", donde puedes añadir los HTTP referrers permitidos de tu aplicación.

Esto, ojo, no es una medida de seguridad infalible. Un atacante con algo de conocimiento técnico siempre puede simular el referrer o simplemente interceptar el tráfico de red. Es más una pequeña barrera para bots muy básicos que una protección robusta contra ataques decididos. Yo, en mi caso, prefiero concentrar la energía en las reglas de seguridad.

De todas formas, si quieres diferenciar claves de desarrollo y producción para una mayor organización o por si acaso, es una práctica válida. Puedes usar variables de entorno, por ejemplo, en un proyecto React para gestionarlas:

# .env.development
REACT_APP_API_KEY=###dev-key-sin-restriccion###

# .env.production
REACT_APP_API_KEY=###prod-key-con-dominio-restringido###

Luego, en tu código principal, accedes a ellas de esta forma:

import { initializeApp } from 'firebase/app';

const firebaseConfig = {
  apiKey: process.env.REACT_APP_API_KEY,
  // ... otras configuraciones de tu proyecto
};

initializeApp(firebaseConfig);

Esta es una forma limpia de manejar distintas claves. Pero, insisto, la seguridad crítica está en la configuración de tus reglas de Firebase. Es ahí donde se juega el partido.

Un detalle importante que aprendí hace relativamente poco es Firebase App Check. Esta función, lanzada en 2021, te permite asegurar que las solicitudes a tu backend de Firebase provengan solo de tus aplicaciones registradas. Es un escudo extra contra el abuso, un muy buen complemento a las reglas de seguridad.

Si tuviera que empezar de cero con un proyecto Firebase hoy, me concentraría primero en tener unas reglas de seguridad impecables y bien pensadas. Después, definitivamente configuraría App Check lo antes posible. Las restricciones por referrer las dejaría para mucho después, si es que realmente hace falta para reducir un poco el ruido, pero nunca como una medida de seguridad principal.

Jorge RequenaDeveloper full-stack · Chile