programing

CorsFilter 및 스프링 보안 사용 시 Cors 오류 발생

padding 2023. 4. 3. 21:18
반응형

CorsFilter 및 스프링 보안 사용 시 Cors 오류 발생

Spring Boot을 이용하여 API 서비스를 구축하고 있습니다.인증에는 Basic Auth를 사용합니다.클라이언트가 API에 접속하려고 하면 CORS 오류가 발생합니다.

스프링 부트 시 에러가 발생.

java.displaces를 클릭합니다.부정 인수예외:allowCredentials가 true인 경우 allowOrigins는 "Access-Control-Allow-Origin" 응답 헤더에서 설정할 수 없기 때문에 특별한 값 "*"를 포함할 수 없습니다.credential을 오리진 세트에 허용하려면 명시적으로 나열하거나 대신 "allowed Origin Patterns" 사용을 고려하십시오.

allowed Origin Patterns 사용 예를 찾으려고 했지만 아직 찾지 못했습니다.https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/CorsRegistration.html#allowedOriginPatterns-java.lang.String 문서도 마찬가지입니다.Configuration에 어떤 패턴을 넣어야 하는지 아직 알 수 없습니다.allowed Origin Patterns();

아래는 제 CorsFilter 코드입니다.

@Configuration
public class RequestCorsFilter {

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.setAllowedOrigins(Collections.singletonList("*"));
        config.setAllowedHeaders(Arrays.asList("Origin", "Content-Type", "Accept", "responseType", "Authorization"));
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }      

}

그리고 여기 내 인증 코드가 있습니다.

@Configuration
@EnableWebSecurity
public class AuthenConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
        throws Exception {
    auth
    .inMemoryAuthentication()
    .withUser("thor").password("{noop}P@ssw00rd")
    .authorities("USER");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        String[] AUTH_WHITELIST = {
            // -- swagger ui
            "/v2/api-docs", 
            "/swagger-resources/**", 
            "/configuration/ui",
            "/configuration/security", 
            "/swagger-ui.html",
            "/webjars/**"
        };

        http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            .antMatchers(AUTH_WHITELIST).permitAll() // whitelist URL permitted
            .antMatchers("/api").authenticated(); // others need auth
    }

}

사용하다config.setAllowedOriginPatterns("*")대신config.setAllowedOrigins(Collections.singletonList("*"));

config.setAllowedOrigins(Collections.singletonList("*"));

이 노선은 바꿔야 합니다.응용 프로그램에 액세스할 수 있는 모든 서버를 나열해야 합니다.

예를 들어 angular를 사용하므로 프런트엔드의 개발 서버는 http://localhost:4200입니다.실제 가동 중인 서버는 https://you.server.domain.com 입니다.

설정 리스트는 다음과 같습니다.

config.setAllowedOrigins(List.of("http://localhost:4200","https://you.server.domain.com"));

프로젝트에서 포트 4000을 사용하는 경우 yml config

allowedOrigins:
  - "http://localhost:4000"

http://localhost: 대체*
스프링 문서: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ #spring-configuration

와일드카드 "*"를 오리진에 포함할 경우 이 설정을 true로 설정할 수 없습니다.

config.setAllowCredentials(true);

그러니 그냥 제거해

Q: allowCredentials가 true입니다.allowOrigins는 특별한 값을 포함할 수 없습니다.

이것은, 에 의한 문제 해결에 도움이 됩니다.https://chowdera.com/2022/03/202203082045152102.html

결제 조건 교차 도메인 구성 오류. .allowedOrigins를 .allowedOriginPatterns로 바꿉니다.@Configuration 퍼블릭클래스 CorsConfig {

private CorsConfiguration buildConfig() {

    CorsConfiguration corsConfiguration = new CorsConfiguration();
    //corsConfiguration.addAllowedOrigin("*");
    //  Cross domain configuration error , take .allowedOrigins Replace with .allowedOriginPatterns that will do .
    //  Set the domain name that allows cross domain requests 
    corsConfiguration.addAllowedOriginPattern("*");
    corsConfiguration.addAllowedHeader("*");
    //  Set allowed methods 
    corsConfiguration.addAllowedMethod("*");
    //  Whether to allow certificates 
    corsConfiguration.setAllowCredentials(true);
    //  Cross domain allow time 
    corsConfiguration.setMaxAge(3600L);
    return corsConfiguration;
}

@Bean
public CorsFilter corsFilter() {

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

} 클래스:WebMvcConfigr 인터페이스의 형식을 통해 다음과 같이 변경합니다.@Configuration 퍼블릭클래스 CorsConfig는 WebMvcConfigr { 를 구현합니다.

/** *  Turn on cross domain  */
@Override
public void addCorsMappings(CorsRegistry registry) {

    //  Set routes that allow cross domain routing 
    registry.addMapping("/**")
            //  Set the domain name that allows cross domain requests 
            //.allowedOrigins("*")  
            // Cross domain configuration error , take .allowedOrigins Replace with .allowedOriginPatterns that will do .
            .allowedOriginPatterns("*")
            //  Whether to allow certificates (cookies)
            .allowCredentials(true)
            //  Set allowed methods 
            .allowedMethods("*")
            //  Cross domain allow time 
            .maxAge(3600);
}

}

언급URL : https://stackoverflow.com/questions/66060750/cors-error-when-using-corsfilter-and-spring-security

반응형