Como Configurar CORS no Spring Security: Guia Completo

Ao integrar frontends modernos (como React ou Angular) com backends Spring Boot, frequentemente nos deparamos com erros de CORS (Cross-Origin Resource Sharing). Entender e configurar CORS corretamente no Spring Security é essencial para garantir segurança e fluidez na comunicação entre diferentes domínios.

Neste artigo, vamos explorar como dominar a configuração de CORS usando a classe CorsConfiguration do Spring, com práticas recomendadas para ambientes seguros.

O que é CORS e por que é importante?

CORS é um mecanismo de segurança implementado pelos navegadores para restringir requisições entre diferentes origens. Sem a configuração apropriada no servidor, o navegador bloqueia a interação entre o frontend e o backend, resultando em erros de requisição.

No Spring Security, conseguimos configurar regras específicas para permitir ou bloquear origens, métodos e cabeçalhos.

Configurações essenciais do CorsConfiguration

1. setAllowedOrigins(List<String> allowedOrigins)

Finalidade: Define quais domínios podem acessar seu backend.

Exemplo:

corsConfiguration.setAllowedOrigins(List.of("https://meu-frontend.com"));

Dica de SEO: Sempre restrinja a lista de origens para domínios específicos em produção.

2. setAllowedMethods(List<String> allowedMethods)

Finalidade: Especifica quais métodos HTTP são permitidos.

Exemplo:

corsConfiguration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE"));

3. setAllowedHeaders(List<String> allowedHeaders)

Finalidade: Controla quais cabeçalhos podem ser enviados pelo cliente.

Exemplo:

corsConfiguration.setAllowedHeaders(List.of("Authorization", "Content-Type"));

4. setExposedHeaders(List<String> exposedHeaders)

Finalidade: Define quais cabeçalhos o cliente poderá acessar na resposta.

Exemplo:

corsConfiguration.setExposedHeaders(List.of("Authorization"));

5. setAllowCredentials(boolean allowCredentials)

Finalidade: Permite ou bloqueia o envio de cookies e cabeçalhos de autenticação.

Exemplo:

corsConfiguration.setAllowCredentials(true);

Atenção: Se allowCredentials for true, você não pode usar "*" em allowedOrigins.

6. setMaxAge(Long maxAge)

Finalidade: Controla o tempo que o navegador pode armazenar a resposta de pré-vôo (OPTIONS).

Exemplo:

corsConfiguration.setMaxAge(3600L);

Integração do CORS no Spring Security

Para aplicar a configuração, use o CorsConfigurationSource combinado com a configuração do SecurityFilterChain:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.cors().configurationSource(corsConfigurationSource())
        .and()
        .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
    return http.build();
}

@Bean
public CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(List.of("https://meu-frontend.com"));
    configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE"));
    configuration.setAllowedHeaders(List.of("Authorization", "Content-Type"));
    configuration.setExposedHeaders(List.of("Authorization"));
    configuration.setAllowCredentials(true);
    configuration.setMaxAge(3600L);

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

Boas práticas para configuração de CORS

  • Restrinja os domínios de produção.
  • Evite usar "*" em ambientes seguros.
  • Habilite credentials apenas quando necessário.
  • Audite métodos e cabeçalhos permitidos regularmente.

Conclusão

Uma configuração correta de CORS no Spring Security é fundamental para segurança e funcionamento de aplicações modernas. Seguindo essas práticas, você garante que sua API seja acessível apenas pelas origens certas, reduzindo riscos de segurança.

Deixe um comentário