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
fortrue
, você não pode usar"*"
emallowedOrigins
.
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.