Autenticación: La puerta principal de tu aplicación

La autenticación es cómo tu aplicación verifica la identidad del usuario. Es la funcionalidad más crítica para la seguridad — todas las demás medidas de seguridad dependen de que la autenticación funcione correctamente. Un bug en autenticación puede exponer los datos de todos los usuarios.

Esta lección cubre el testing de flujos de autenticación (login, registro, recuperación de contraseña) y gestión de sesiones (cómo la aplicación rastrea quién eres después del login).

Testing del flujo de login

Camino feliz

Comienza con lo obvio: las credenciales válidas deben funcionar.

  • Login con email y contraseña correctos
  • Verificar redirección a la página correcta
  • Verificar que el nombre o avatar del usuario aparece en la UI
  • Verificar que la sesión se crea (revisar cookies en DevTools)

Credenciales inválidas

Caso de pruebaComportamiento esperado
Contraseña incorrectaError genérico: “Email o contraseña inválidos” (nunca revelar cuál está mal)
Email inexistenteMismo error genérico que contraseña incorrecta
Email vacíoError de validación antes del envío
Contraseña vacíaError de validación antes del envío
SQL injection en emailSin error SQL, mensaje de validación genérico
XSS en campo emailInput sanitizado, sin ejecución de script

Nota crítica de seguridad: El mensaje de error para email incorrecto vs. contraseña incorrecta debe ser idéntico. Mensajes diferentes permiten a atacantes enumerar cuentas válidas.

Protección contra fuerza bruta

Intenta iniciar sesión con contraseñas incorrectas repetidamente:

  1. Después de 3-5 intentos fallidos, ¿el sistema muestra un CAPTCHA?
  2. Después de 10+ intentos, ¿la cuenta se bloquea o se limita la tasa?
  3. ¿Hay un período de enfriamiento? ¿Cuánto dura?
  4. ¿El bloqueo aplica por IP, por cuenta o ambos?

Login social (OAuth)

Si la aplicación soporta login con Google, GitHub, Facebook:

  • ¿El flujo OAuth redirige correctamente?
  • ¿Qué pasa si el usuario deniega permisos?
  • ¿El email de OAuth se vincula con una cuenta existente?
  • ¿Qué pasa si el proveedor social está caído?

Testing del flujo de registro

Creación de cuenta

  • Registro válido con todos los campos requeridos
  • Email duplicado — debería rechazar con mensaje claro
  • Requisitos de fortaleza de contraseña — probar justo debajo de cada requisito
  • Verificación de email — ¿funciona el link de confirmación?
  • Expiración del link de verificación — ¿expira después de un tiempo razonable?

Verificación de email

  1. Registra una nueva cuenta
  2. Verifica que el email de verificación llega
  3. Haz clic en el link — la cuenta debería activarse
  4. Haz clic en el mismo link de nuevo — debería mostrar “ya verificado”
  5. Intenta iniciar sesión antes de verificar — debería mostrar mensaje apropiado
  6. Solicita un nuevo email de verificación — ¿invalida el link anterior?

Testing de recuperación de contraseña

Flujo de contraseña olvidada

  1. Solicitar reset de contraseña para un email válido
  2. Verificar que el email llega en tiempo razonable
  3. Hacer clic en el link de reset — debería mostrar formulario de reset
  4. Establecer nueva contraseña — debería funcionar
  5. Login con nueva contraseña — debería funcionar
  6. Login con contraseña anterior — debería fallar
  7. Hacer clic en el link de reset de nuevo — debería estar expirado

Casos límite de seguridad

TestEsperado
Reset para email inexistenteMismo mensaje que para email válido (prevenir enumeración)
Múltiples solicitudes de resetSolo el link más reciente debería funcionar
Link de reset después de cambio de contraseñaLink debería invalidarse
Expiración del link (24h+)Link debería expirar

Gestión de sesiones

Creación y almacenamiento de sesiones

Después del login, verificar:

  • Se crea una cookie de sesión
  • La cookie tiene flag Secure (solo HTTPS)
  • La cookie tiene flag HttpOnly (no accesible por JavaScript)
  • La cookie tiene atributo SameSite
  • El ID de sesión es suficientemente largo y aleatorio (mínimo 128 bits)
  • El ID de sesión cambia después del login (previene session fixation)

Timeout de sesión

  • Timeout por inactividad: Después de X minutos de inactividad, la sesión expira
  • Timeout absoluto: Después de Y horas independientemente de actividad, la sesión expira
  • Comportamiento de timeout: Cuando la sesión expira, ¿qué pasa? ¿Redirección al login? ¿Modal? ¿Se pierde trabajo no guardado?

Testing avanzado de autenticación

Sesiones concurrentes

Prueba qué pasa cuando el mismo usuario inicia sesión desde múltiples ubicaciones:

  1. Login en Navegador A
  2. Login en Navegador B con la misma cuenta
  3. Realizar una acción en Navegador A — ¿la sesión sigue válida?
  4. ¿La aplicación limita sesiones concurrentes?
  5. Si las sesiones están limitadas, ¿cuál se termina — la anterior o la nueva?

Funcionalidad “Recordarme”

Si el formulario de login tiene checkbox “Recordarme”:

  • ¿Cuánto dura la sesión persistente? (Típicamente 30 días)
  • ¿Se usa un token persistente separado (no la cookie de sesión)?
  • ¿Puede el usuario revocar todas las sesiones recordadas desde configuración?
  • ¿“Recordarme” sobrevive al reinicio del navegador?
  • ¿El token persistente se invalida al cambiar contraseña?

Autenticación Multi-Factor (MFA)

Si la aplicación soporta MFA:

  • ¿Funciona con apps de autenticación (TOTP)?
  • ¿Funciona con códigos SMS?
  • ¿Qué pasa con un código expirado?
  • ¿Qué pasa con un código incorrecto 3+ veces?
  • ¿Se puede evadir MFA manipulando el request?
  • ¿Se proporcionan códigos de respaldo y funcionan?

Ejercicio: Auditoría de seguridad de autenticación

Realiza una auditoría completa de autenticación:

  1. Registro: Crea una cuenta, prueba duplicados, verifica email
  2. Login: Prueba credenciales válidas/inválidas, verifica mensajes de error
  3. Sesión: Inspecciona cookies por flags de seguridad (Secure, HttpOnly, SameSite)
  4. Timeout: Espera la expiración de sesión, verifica comportamiento
  5. Reset de contraseña: Completa el flujo, verifica expiración del link
  6. Sesiones concurrentes: Login desde dos navegadores simultáneamente
  7. Logout: Verifica destrucción de sesión — presiona botón atrás después de logout
ÁreaTestHallazgoRiesgo
LoginMensajes de errorDiferentes para email vs contraseña incorrectaAlto (enumeración)
SesiónFlags de cookiesFalta flag HttpOnlyAlto (XSS puede robar sesión)
Reset contraseñaExpiración del linkLink funciona después de 7 díasMedio
LogoutBotón atrásMuestra página autenticada en cachéMedio

Testing de logout

El logout frecuentemente se sub-prueba:

  1. Hacer clic en logout — verificar redirección a página de login
  2. Presionar botón atrás del navegador — NO debería mostrar contenido autenticado
  3. Intentar acceder a una URL autenticada directamente — debería redirigir al login
  4. Verificar que la cookie de sesión se elimina o invalida
  5. Verificar que la sesión del servidor se destruye
  6. En una pestaña separada aún abierta — ¿qué pasa al intentar realizar una acción?

Puntos clave

  • La autenticación es la funcionalidad más crítica para seguridad — pruébala exhaustivamente
  • Los mensajes de error de login deben ser genéricos para prevenir enumeración de cuentas
  • Siempre verifica que las cookies de sesión tengan flags Secure, HttpOnly y SameSite
  • Prueba timeout de sesión tanto por inactividad como absoluto
  • Los links de reset de contraseña deben expirar e invalidarse después de uso
  • Los IDs de sesión deben regenerarse después del login para prevenir session fixation
  • El logout debe destruir la sesión del lado del servidor, no solo eliminar la cookie