๐ŸŒทDev

[Spring] CORS ์—๋Ÿฌ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์„ค์ • ๋ฐ ํฌ์ŠคํŠธ๋งจ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•

alreadykite 2023. 9. 29. 13:25

 

๋ฌธ์ œ ๋ฐฐ๊ฒฝ


 

์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉ์•ˆํ•˜๋ฉด ip ํ—ˆ์šฉ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ํ”„๋ก ํŠธ ์„œ๋ฒ„ ๋ฐฐํฌ ํ›„ CORS ์—๋Ÿฌ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

์ฐพ์•„๋ณด๋‹ˆ CORS๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ฉฐ ์„œ๋ฒ„์˜ ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •๊ณผ๋Š” ๋ณ„๊ฐœ๋ผ๊ณ  ํ•œ๋‹ค.

 

CORS(Cross-Origin Resource Sharing)๋ž€?

๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ(์ถœ์ฒ˜)์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์•ˆ ์ œํ•œ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

์›น ํŽ˜์ด์ง€๊ฐ€ A.com ๋„๋ฉ”์ธ์—์„œ ๋กœ๋“œ๋˜์—ˆ๊ณ , ์ด ์›น ํŽ˜์ด์ง€๊ฐ€ B.com์˜ API๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…(Same-Origin-Policy)์— ์˜ํ•ด ์ด ์š”์ฒญ์„ ์ฐจ๋‹จํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์ด ๋•Œ B.com ์„œ๋ฒ„์—์„œ ์ ์ ˆํ•œ CORS ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ด ์š”์ฒญ์ด ํ—ˆ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. 

 

์ฆ‰, ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •์ด ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์„œ๋ฒ„๋ผ๋„ ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ CORS ํ—ค๋”๋ฅผ ์ ์ ˆํžˆ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” CORS ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์„œ๋ฒ„๊ฐ€ CORS๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ์‘๋‹ต ํ—ค๋”์— 'Access-Control-Allow-Origin'์„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค. 

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ


@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("https://java-jober.netlify.app", "http://localhost:5173")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

์œ„์™€ ๊ฐ™์ด WebConfig ํด๋ž˜์Šค์— addCorsMapping ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์žฌ๋ฐฐํฌํ•˜์˜€๋‹ค. 

์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๋„๋ฉ”์ธ(์ถœ์ฒ˜)๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๊ณ  .allowedOrigins("*") ๋กœ ํ–ˆ์—ˆ๋Š”๋ฐ allowCredentials ๋ฅผ true๋กœ ์„ค์ •ํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํฌ๋ฆฌ๋ด์…œ(์ฟ ํ‚ค๋‚˜ http ์ธ์ฆ๊ณผ ๊ฐ™์€)์ด ์žˆ๋Š” ์‘๋‹ต์„ ํ”„๋ก ํŠธ์—”๋“œ  JavaScript์— ๋…ธ์ถœํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ณด์•ˆ ์ƒ์˜ ์ด์œ ๋กœ true์ผ ๋•Œ๋Š” allowedOrigins์— "*"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํ•œ๋‹ค. 

 

๊ทธ๋ž˜์„œ allowCredentials๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค๋ฉด, 

  1. allowedOriginsPatterns์— ํฌ๋ฆฌ๋ด์…˜์„ ํ—ˆ์šฉํ•˜๋Š” ํŠน์ • ์ถœ์ฒ˜ ์ง‘ํ•ฉ์ด ์žˆ๋‹ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ดํ•˜๊ฑฐ๋‚˜
  2. allowedOrigins์— ํŠน์ • ๋„๋ฉ”์ธ์„ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ํ”„๋ก ํŠธ ๋ฐฐํฌ ์ฃผ์†Œ์™€ ํ”„๋ก ํŠธ์˜ ๋กœ์ปฌ ์ฃผ์†Œ๋ฅผ ๋ช…์‹œํ•ด์ฃผ์—ˆ๋‹ค.

(ํ”„๋ก ํŠธ ๋กœ์ปฌ์ฃผ์†Œ๋Š” ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„๋ž‘ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”)  

 

 

ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•


ํฌ์ŠคํŠธ๋งจ์—์„œ Headers์— ์œ„์™€ ๊ฐ™์ด ํ‚ค์™€ ๊ฐ’์„ ๋„ฃ๊ณ  ์š”์ฒญํ•˜๋ฉด

์‘๋‹ต Headers์— Access-Control-Allow-Origin ๊ฐ’์ด ํ—ˆ์šฉํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด CORS ์„ค์ •์ด ์ž˜ ๋œ๊ฒƒ์ด๋‹ค!