Programming/Java

CORS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ (Spring -> SpringBoot)

seulye 2025. 5. 22. 15:11

 

 

ํ”„๋ก ํŠธ, ๋ฐฑ์—”๋“œ ์—ฐ๊ฒฐํ•  ๋•Œ๋งˆ๋‹ค ์–˜๋ฅผ ๋งˆ์ฃผํ•˜๋Š” ๋“ฏ ํ•˜๋‹ค. (์ง€๊ธ‹์ง€๊ธ‹)

 

๋ฐฑ์—”๋“œ์—์„œ allowํ•ด์ฃผ๋Š” ๊ฒŒ ๊ตญ๋ฃฐ์ด๋ผ, GPT๊ฐ€ ํ•˜๋ผ๋Š” ๋Œ€๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ์ด๊ฒƒ์ €๊ฒƒ ์ˆ˜์ •ํ•ด๋ดค์ง€๋งŒ...

CORS ๊ฐ€ ์žกํ˜€๋„ ๋‹ค๋ฅธ ์—๋Ÿฌ๊ฐ€ ํ„ฐ์ง€๋Š” ๋ฐ”๋žŒ์—.. ๊ฒฐ๊ตญ SOS๋ฅผ ์ณค๊ณ .. ์ฃผ์‹  ์†Œ์Šค๋กœ ์ˆ˜์ •ํ•˜๋‹ˆ๊นŒ ๋จ!

 

// SecurtiyConfig.java

 @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    	CookieCsrfTokenRepository cookieCsrfTokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
    	cookieCsrfTokenRepository.setHeaderName("x-xsrf-token");
    	
        http
            .cors(cors -> {})  // ์ถ”๊ฐ€
        	.csrf(csrf -> csrf
                .csrfTokenRepository(cookieCsrfTokenRepository)
                .csrfTokenRequestHandler(new CustomCsrfTokenRequestHandler())
            )
			
			

// ServeltConfig.java ๋งจ๋ฐ‘์— ์ถ”๊ฐ€
@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:3000")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true);
    }

 

 

-> SpringBoot๋กœ ๋ณ€๊ฒฝ ํ›„ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์•ˆ ๋จ. (SpringBoot 3.2.5)

 

http.cors(cors -> {}) ๋Š” ์‹ค์ œ CorsConfigurationSource Bean์„ ์š”๊ตฌ → ํ•˜์ง€๋งŒ WebMvcConfigurer#addCorsMappings๋งŒ ์„ค์ •ํ•˜๊ณ , CorsConfigurationSource Bean์„ ์ง์ ‘ ๋“ฑ๋กํ•˜์ง€ ์•Š์œผ๋ฉด Spring Security๋Š” ์ด ์„ค์ •์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ addCorsMappings() ์„ค์ •์€ Spring MVC์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€๋งŒ, Spring Security์—์„œ๋Š” http.cors()๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด์„œ ๋นˆ ์„ค์ •์ด ํ•„์š”ํ•ด์ง.

 

GPT๋Š” ์ด๋ ‡๊ฒŒ ๋งํ•ด์คŒ.

 

๊ทธ๋ž˜์„œ, 

// SecurtiyConfig.java
@Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(List.of("http://localhost:3000"));
        configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        configuration.setAllowedHeaders(List.of("Content-Type", "Authorization", "X-Requested-With", "x-xsrf-token", "Accept"));
        configuration.setAllowCredentials(true);

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

 

 @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    	CookieCsrfTokenRepository cookieCsrfTokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
    	cookieCsrfTokenRepository.setHeaderName("x-xsrf-token");
    	
        http
            .cors(cors -> cors.configurationSource(corsConfigurationSource()))  // ๋ณ€๊ฒฝ
        	.csrf(csrf -> csrf
                .csrfTokenRepository(cookieCsrfTokenRepository)
                .csrfTokenRequestHandler(new CustomCsrfTokenRequestHandler())
            )
            
       <์ƒ๋žต>
       
}

 

์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํ–ˆ๋Š”๋ฐ, ์•ˆ ๋˜์—ˆ๋‹ค. 

 

@Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
                .requestMatchers(
                		"/css/**", 
                		"/fonts/**", 
                		"/img/**", 
                		"/libs/**", 
                		"/app/**", 
                		"/views/**", 
                   //     "/auth/login", ์ฃผ์„์ฒ˜๋ฆฌ
                		"/WEB-INF/**"
                );
    }

 

web.ignoring()์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ๋กœ๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ํ•„ํ„ฐ ์ฒด์ธ(CORS ํ•„ํ„ฐ ํฌํ•จ)์„ ์™„์ „ํžˆ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, corsConfigurationSource()์—์„œ ์ •์˜ํ•œ CORS ์ •์ฑ…์ด /auth/login ๊ฒฝ๋กœ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ฃผ์„์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋‹ค! ๊ทธ๋žฌ๋”๋‹ˆ ๋๋‹ค~~!