Revisión de Seguridad Spring Boot
Usar al agregar autenticación, manejar entradas, crear endpoints o trabajar con secretos.
Cuándo Activar
- Agregar autenticación (JWT, OAuth2, basada en sesión)
- Implementar autorización (@PreAuthorize, control de acceso basado en roles)
- Validar entrada de usuario (Bean Validation, validadores personalizados)
- Configurar CORS, CSRF o cabeceras de seguridad
- Gestionar secretos (Vault, variables de entorno)
- Agregar limitación de velocidad o protección contra fuerza bruta
- Escanear dependencias por CVEs
Autenticación
- Preferir JWT sin estado o tokens opacos con lista de revocación
- Usar cookies
httpOnly,Secure,SameSite=Strictpara sesiones - Validar tokens con
OncePerRequestFiltero resource server
Autorización
- Habilitar seguridad de métodos:
@EnableMethodSecurity - Usar
@PreAuthorize("hasRole('ADMIN')")o@PreAuthorize("@authz.canEdit(#id)") - Denegar por defecto; exponer solo los scopes requeridos
Validación de Entrada
- Usar Bean Validation con
@Validen controllers - Aplicar restricciones en DTOs:
@NotBlank,@Email,@Size, validadores personalizados - Sanitizar cualquier HTML con lista blanca antes de renderizar
Prevención de Inyección SQL
- Usar repositorios de Spring Data o consultas parametrizadas
- Para consultas nativas, usar bindings
:param; nunca concatenar cadenas
Codificación de Contraseñas
- Siempre hashear contraseñas con BCrypt o Argon2 — nunca almacenar en texto plano
- Usar el bean
PasswordEncoder, no hashing manual
Protección CSRF
- Para aplicaciones de sesión de navegador, mantener CSRF habilitado; incluir token en formularios/cabeceras
- Para APIs puras con tokens Bearer, deshabilitar CSRF y depender de autenticación sin estado
Gestión de Secretos
- Sin secretos en el código fuente; cargar desde entorno o vault
- Mantener
application.ymllibre de credenciales; usar marcadores de posición - Rotar tokens y credenciales de base de datos regularmente
Cabeceras de Seguridad
Configuración de CORS
- Configurar CORS a nivel del filtro de seguridad, no por controller
- Restringir orígenes permitidos — nunca usar
*en producción
Limitación de Velocidad
- Aplicar Bucket4j o límites a nivel de gateway en endpoints costosos
- Registrar y alertar sobre ráfagas; retornar 429 con hints de reintento
Seguridad de Dependencias
- Ejecutar OWASP Dependency Check / Snyk en CI
- Mantener Spring Boot y Spring Security en versiones soportadas
- Fallar builds ante CVEs conocidos
Logging y PII
- Nunca registrar secretos, tokens, contraseñas ni datos PAN completos
- Redactar campos sensibles; usar logging JSON estructurado
Subida de Archivos
- Validar tamaño, tipo de contenido y extensión
- Almacenar fuera del web root; escanear si es requerido
Lista de Verificación Antes del Lanzamiento
- Tokens de autenticación validados y con expiración correcta
- Guardias de autorización en cada ruta sensible
- Todas las entradas validadas y sanitizadas
- Sin SQL concatenado con cadenas
- Postura CSRF correcta para el tipo de aplicación
- Secretos externalizados; ninguno con commit
- Cabeceras de seguridad configuradas
- Limitación de velocidad en APIs
- Dependencias escaneadas y actualizadas
- Logs libres de datos sensibles
Recuerda: Denegar por defecto, validar entradas, privilegio mínimo y seguro por configuración primero.


