Definición
Imagina que escribes tu contraseña en un papel, la doblas (pero sin sellar), y se la das al guardia de seguridad cada vez que entras al edificio. El guardia puede leerla fácilmente si quiere - solo está doblada, no encriptada. Así funciona la Autenticación Básica HTTP: envías tu usuario y contraseña “codificados” en Base64 con cada petición, pero Base64 es solo una codificación, no encriptación. Cualquiera que intercepte el mensaje puede leer tus credenciales.
La Autenticación Básica es el mecanismo más antiguo y simple de HTTP para identificar usuarios. Concatenas usuario:contraseña, lo conviertes a Base64, y lo envías en el header “Authorization: Basic YWRtaW46c2VjcmV0”. El servidor decodifica, verifica, y te deja pasar si es correcto. Es tan simple que funciona en cualquier cliente HTTP, curl incluido, sin librerías especiales.
¿Cuándo usarla? Prácticamente nunca en aplicaciones de cara al público, pero tiene su lugar. APIs internas protegidas por VPN, herramientas de desarrollo, scripts de automatización, o cuando necesitas algo que “simplemente funcione” sin OAuth ni tokens. La clave es SIEMPRE usarla sobre HTTPS - sin ello, es como gritar tu contraseña en una habitación llena de gente.
Ejemplo
Herramientas CLI y Scripts: Cuando usas curl o wget para acceder a una API protegida rápidamente: curl -u admin:secret123 https://api.internal.com/data. Es perfecto para scripts de automatización donde no quieres implementar flujos OAuth complejos.
APIs Internas de Empresa: La API del sistema de monitoring interno usa Basic Auth porque está detrás de VPN, solo acceden servidores autorizados, y la simplicidad supera a la sofisticación. Se rota la contraseña mensualmente y los accesos están registrados.
Entornos de Staging y Preview: Los entornos de prueba usan Basic Auth para evitar que robots indexen contenido de desarrollo. Es una capa simple de protección que evita accesos accidentales sin la complejidad de sistemas de autenticación completos.
APIs de Dispositivos IoT Simples: Un sensor de temperatura en la fábrica envía datos a un servidor local usando Basic Auth. El dispositivo es tan simple que no puede manejar OAuth, pero la red está aislada y los datos no son sensibles.
Analogía
La Postal sin Sobre: Escribes tu mensaje en una postal y la envías por correo. Cualquiera que la maneje puede leerla - el cartero, los trabajadores de clasificación, tus vecinos cotillas. La postal llega a su destino, pero el contenido no es privado. HTTPS es como meter la postal en un sobre opaco.
El Portero que Pide el Nombre: Llegas a un edificio y el portero te pregunta tu nombre y el piso al que vas. Tú respondes en voz alta - cualquiera en el vestíbulo puede oírte. El portero verifica en su lista y te deja pasar. Simple pero no discreto.
La Pregunta de Seguridad en Voz Alta: El banco te pregunta tu palabra clave por teléfono. Tú la dices en medio de la oficina donde todos pueden escucharte. La verificación funciona, pero has expuesto tu secreto a quienquiera que estuviera cerca.
El Carné Escrito a Mano: En lugar de una tarjeta con chip, tu “carné” es un papel con tu nombre y contraseña escritos a mano. Lo muestras en cada entrada. Cualquiera puede fotocopiarlo y usarlo - no hay verificación criptográfica, solo lo que dice el papel.
Code Example
// Cliente: Creando el header de Basic Auth
const username = 'admin';
const password = 'secret123';
const credentials = btoa(`${username}:${password}`);
fetch('https://api.example.com/data', {
headers: {
'Authorization': `Basic ${credentials}`
}
});
// Node.js con encoding nativo
const auth = Buffer.from(`${username}:${password}`).toString('base64');
// Servidor: Verificando Basic Auth
function basicAuthMiddleware(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Basic ')) {
res.setHeader('WWW-Authenticate', 'Basic realm="API"');
return res.status(401).json({ error: 'Credenciales requeridas' });
}
// Decodificar Base64
const base64Credentials = authHeader.substring(6);
const credentials = Buffer.from(base64Credentials, 'base64').toString('utf8');
const [username, password] = credentials.split(':');
// Verificar credenciales (usa comparación segura en producción)
if (username === 'admin' && password === 'secret123') {
req.user = { username };
return next();
}
return res.status(401).json({ error: 'Credenciales inválidas' });
}
// curl desde terminal
// curl -u admin:secret123 https://api.example.com/data
Diagrama
sequenceDiagram
participant C as Cliente
participant S as Servidor
C->>S: GET /recurso-protegido
S-->>C: 401 No Autorizado
WWW-Authenticate: Basic realm="API"
Note over C: Codificar credenciales
Base64(usuario:contraseña)
C->>S: GET /recurso-protegido
Authorization: Basic dXNlcjpwYXNz
Note over S: Decodificar Base64
Validar credenciales
alt Credenciales Validas
S-->>C: 200 OK + Datos de Respuesta
else Credenciales Invalidas
S-->>C: 401 No Autorizado
end
Note over C,S: ADVERTENCIA: Base64 NO es encriptacion
DEBE usarse HTTPS para proteger credenciales
Notas de Seguridad
CRÍTICO - …
Configuración y Validación:
- DEBE usarse EXCLUSIVAMENTE sobre HTTPS; Base64 es codificación reversible, NO encriptación - cualquier interceptor puede decodificar las credenciales instantáneamente.
- Las credenciales se envían con CADA petición, aumentando exponencialmente las oportunidades de exposición.
- Vulnerable a ataques de repetición donde un atacante captura y reenvía las credenciales.
- No adecuada para aplicaciones de cara al usuario o públicas; resérvala para comunicación servidor-a-servidor o herramientas internas protegidas por otras capas.
- Implementa rate limiting agresivo para prevenir ataques de fuerza bruta.
Monitoreo y Protección:
- Rota las credenciales regularmente y después de cualquier sospecha de compromiso.
- Usa contraseñas largas, aleatorias y únicas - no reutilices credenciales.
- Prefiere OAuth 2.0, JWT o API keys para sistemas de producción públicos.
- NUNCA registres headers Authorization en logs - contenienen las credenciales en texto plano.
- Implementa bloqueo de cuenta temporal tras múltiples intentos fallidos.
- Considera IP whitelisting como capa adicional de protección.