Autenticación vs. Autorización y Seguridad de Aplicación
En las semanas anteriores de Computación en Red 2 exploramos la arquitectura interna de Spring Boot, el ciclo de vida de los Beans, la persistencia relacional con Spring Data JPA y la construcción de vistas dinámicas con Server-Side Rendering (SSR) mediante Thymeleaf.
Sin embargo, hasta este momento nuestras aplicaciones han sido completamente abiertas: cualquier usuario con acceso a la red puede invocar controladores, modificar registros o acceder a páginas administrativas. En sistemas empresariales, la seguridad no es un accesorio tardío, sino un requisito no funcional crítico que debe diseñarse desde el núcleo de la arquitectura (Secure by Design).
1. Seguridad a Nivel de Aplicación (Application-Level Security)
Cuando pensamos en seguridad informática, con frecuencia imaginamos mecanismos perimetrales de infraestructura: firewalls, proxies inversos, redes privadas virtuales (VPN) o políticas de subred en la nube. Si bien estos mecanismos son indispensables, no conocen el contexto del negocio.
Un firewall de red puede verificar que una petición provenga de una dirección IP permitida y que viaje por el puerto 443 cifrada con HTTPS, pero no puede determinar si la persona que envía la petición es un estudiante consultando sus notas o un intruso intentando eliminar las calificaciones de todo el curso.
La seguridad a nivel de aplicación evalúa el contexto semántico de cada interacción: determina quién es el usuario que ejecuta la acción, valida la autenticidad de sus credenciales y verifica si cuenta con los permisos organizacionales necesarios para invocar un método o acceder a un recurso específico.
2. El Núcleo del Control de Acceso
Cualquier sistema de control de acceso se fundamenta en responder de manera estricta y secuencial a dos preguntas distintas:
A. Autenticación (Authentication) — ¿Quién eres?
Es el proceso de verificar la identidad declarada por un usuario, sistema o servicio externo.
- Entrada: Un identificador (username, correo electrónico, identificador de cliente) acompañado de una prueba fehaciente (credentials, tales como contraseña, token JWT o certificado digital).
- Proceso: El sistema compara las credenciales suministradas contra un almacén confiable de identidades (base de datos relacional, servidor LDAP o proveedor OAuth2).
- Resultado: Si la prueba es válida, el sistema establece un Principal (un objeto que representa al usuario autenticado en la sesión o contexto actual). Si no coincide, rechaza la solicitud retornando un código de error HTTP 401 Unauthorized.
B. Autorización (Authorization / Access Control) — ¿Qué puedes hacer?
Es el proceso de determinar si un usuario autenticado posee los privilegios suficientes para realizar una operación o acceder a un recurso protegido.
- Entrada: La identidad verificada del usuario (Principal), sus permisos asignados (Granted Authorities / Roles) y el recurso o endpoint solicitado (ej.
DELETE /mvc/users/42). - Proceso: El motor de seguridad evalúa las reglas de acceso configuradas (ej. "Solo usuarios con rol ADMIN pueden eliminar cuentas").
- Resultado: Si el usuario posee los permisos requeridos, la petición continúa hacia el controlador (
200 OK). Si carece de privilegios, el sistema aborta la operación retornando un código de error HTTP 403 Forbidden.
3. Cuadro Comparativo: Autenticación vs. Autorización
| Criterio | Autenticación (Authentication) | Autorización (Authorization) |
|---|---|---|
| Pregunta fundamental | ¿Quién eres tú? (Who are you?) | ¿Qué tienes permitido hacer? (What are you allowed to do?) |
| Paso en el flujo | Primer paso obligado. Siempre antecede a la autorización. | Segundo paso. Solo ocurre sobre identidades ya autenticadas. |
| Dato clave utilizado | Credenciales (Username, Password, Tokens, OTP, Biometría). | Permisos individuales (Authorities) o perfiles de usuario (Roles). |
| Código HTTP de fallo | HTTP 401 Unauthorized (identidad ausente o inválida). | HTTP 403 Forbidden (identidad válida, pero permisos insuficientes). |
| Abstracción en Spring | AuthenticationManager, AuthenticationProvider, PasswordEncoder. | SecurityFilterChain, AuthorizationFilter, @PreAuthorize. |