docsSeguridad

Seguridad

Configuración de Seguridad (SecurityConfig)

La clase SecurityConfig es el núcleo de la seguridad de la aplicación. Vamos a analizar cada sección y cómo puedes adaptarla a tus necesidades.

Configuración Base

@Configuration
public class SecurityConfig {
    private static final String HMAC_SHA_256 = "HmacSHA256";
    private final String jwtSecret;
    private final String frontendUrl;
}
  • HMAC_SHA_256: Algoritmo para firmar tokens JWT
  • jwtSecret: Tu clave secreta (configurable en .env)
  • frontendUrl: URL de tu frontend (configurable en .env)

Endpoints Públicos y Protegidos

@Bean
public SecurityFilterChain securityFilterChain(final HttpSecurity http) throws Exception {
    http.authorizeHttpRequests(auth -> auth
            .requestMatchers(
                    "/v1/auth/**",    // Endpoints de autenticación
                    "/error",         // Página de error
                    "/actuator/**",   // Endpoints de monitoreo
                    "/v3/api-docs/**", // Documentación OpenAPI
                    "/swagger-ui/**"   // Interface Swagger
            ).permitAll()
            .anyRequest().authenticated())

Personalización:

  • Añade tus endpoints públicos a .requestMatchers()
  • Ejemplo para endpoints públicos adicionales:
.requestMatchers(
    "/v1/auth/**",
    "/api/public/**",     // Tus endpoints públicos
    "/api/products/**"    // Ejemplo: productos visibles sin auth
).permitAll()

Configuración CORS

private CorsConfigurationSource corsConfigurationSource(final String origin) {
    final var configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Collections.singletonList(origin));
    configuration.setAllowedMethods(Collections.singletonList(CorsConfiguration.ALL));
    configuration.setAllowedHeaders(Collections.singletonList(CorsConfiguration.ALL));
    configuration.setAllowCredentials(true);

Personalización:

  • Configura orígenes múltiples:
configuration.setAllowedOrigins(Arrays.asList(
    "https://tuapp.com",
    "https://staging.tuapp.com"
));
  • Restringe métodos HTTP:
configuration.setAllowedMethods(Arrays.asList(
    "GET", "POST", "PUT", "DELETE"
));

Configuración JWT

@Bean
public JwtDecoder jwtDecoder() {
    return NimbusJwtDecoder
        .withSecretKey(new SecretKeySpec(jwtSecret.getBytes(), HMAC_SHA_256))
        .build();
}

Personalización:

  • Cambia el algoritmo de firma:
private static final String ALGORITHM = "HmacSHA512"; // Más seguro
  • Ajusta la configuración del decodificador:
@Bean
public JwtDecoder jwtDecoder() {
    return NimbusJwtDecoder
        .withSecretKey(new SecretKeySpec(jwtSecret.getBytes(), ALGORITHM))
        .clock(Clock.systemDefaultZone()) // Personaliza la zona horaria
        .build();
}

Encriptación de Contraseñas

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

Personalización:

  • Ajusta la fuerza del hash:
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder(12); // Mayor costo computacional
}

Protección CSRF

.csrf(csrf -> csrf.ignoringRequestMatchers("/v1/auth/**", "swagger-ui/**"));

Personalización:

  • Excluir rutas adicionales:
.csrf(csrf -> csrf.ignoringRequestMatchers(
    "/v1/auth/**",
    "/api/webhooks/**",  // Ejemplo: webhooks
    "/api/public/**"     // Endpoints públicos
));

Mejores Prácticas de Seguridad

  1. JWT Secret:

    • Usa una clave segura y larga (mínimo 256 bits)
    • Rota la clave periódicamente
    • Nunca compartas la clave
  2. CORS:

    • Lista blanca de orígenes específicos
    • Evita usar allowedOrigins("*")
    • Configura solo los métodos necesarios
  3. Endpoints:

    • Principio de menor privilegio
    • Documenta endpoints públicos
    • Usa rate limiting en endpoints sensibles
  4. Contraseñas:

    • BCrypt con factor de trabajo 12+
    • Valida fortaleza de contraseñas
    • Implementa políticas de expiración

Nota: Estas son configuraciones base. Ajusta según tus requisitos de seguridad específicos.