Autenticación y protección CSRF
OAuth2, sin contraseñas propias
Los usuarios finales entran con Google o GitHub — ABA nunca almacena ni gestiona contraseñas de usuario. Tras el callback de OAuth, el backend emite su propio JWT de sesión.
El JWT nunca es visible para JavaScript
El token de sesión se entrega exclusivamente dentro de una cookie HttpOnly / Secure /
SameSite — nunca en el cuerpo de la respuesta, nunca en localStorage, nunca legible desde
JavaScript del navegador. Esto elimina por diseño el vector de robo de token más común en SPAs:
un ataque XSS que lea localStorage no encuentra nada útil ahí, porque el token simplemente no
está.
JWT de sesión → cookie HttpOnly, Secure, SameSite (invisible para JS)
Token CSRF → cookie XSRF-TOKEN, legible por JS (a propósito)
CSRF: patrón de doble envío (Double Submit Cookie)
Como el JWT viaja en una cookie, el navegador la adjunta automáticamente en cualquier request al
dominio del backend — incluidos los que un sitio malicioso podría disparar sin que el usuario se
entere. La defensa es una segunda cookie, XSRF-TOKEN, que sí es legible por JavaScript: el
frontend la lee y la reenvía como header X-CSRF-TOKEN en cada request que modifica datos. Un
sitio atacante puede hacer que el navegador mande la cookie, pero no puede leer su valor para
copiarlo al header — sin los dos coincidiendo, el backend rechaza el request.
Mensajes de error, antes y después de autenticar
- Antes de autenticar: un fallo de login (credencial OAuth inválida, o una API key que no existe/está desactivada) siempre devuelve un mensaje genérico — nunca distingue si el problema fue "la key no existe" vs. "la key está desactivada". Es intencional: no darle pistas a quien esté probando credenciales al azar.
- Después de autenticar: una vez que el sistema ya confirmó quién sos, los mensajes de error sí pueden ser específicos (por ejemplo, nombrar el límite de cuota exacto que alcanzaste) — a ese punto ya no hay riesgo de filtrar información a un atacante no autenticado.
Defensas adicionales contra fuerza bruta
Además del flujo OAuth estándar, el backend trackea intentos fallidos de login y aplica una segunda línea de defensa (captcha) tras repetidos fallos — ambos mecanismos con timeouts cortos hacia proveedores externos, para que una caída de un servicio de terceros nunca bloquee el login de un usuario legítimo.
Seguí con Cifrado y Claves para cómo se protegen las credenciales de las bases de datos ya aprovisionadas.