CORS - xx10222/selab-todo-list GitHub Wiki

SOP (Same-Origin policy)

๊ฐ™์€ Origin(์ฃผ์†Œ)์—๋งŒ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ์ œํ•œํ•˜๋Š” ๋ณด์•ˆ ์ •์ฑ…
Origin์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ์œผ๋กœ ์ด๋ค„์ง„๋‹ค

  • URI Schema (ex. HTTP, HTTPS)
  • Hostname (ex. localhost, naver.com)
  • Port (ex. 80, 8080)

์ด ์ค‘์— ํ•˜๋‚˜๋ผ๋„ ๊ตฌ์„ฑ์ด ๋‹ค๋ฅด๋ฉด SOP ์ •์ฑ…์— ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ajax ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์—†๋‹ค


๋‹ค์Œ์€ http://www.example.com/dir/page.html ์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์˜ˆ์‹œ์ด๋‹ค image

CORS (Cross-Origin Resource Sharing)

CORS๋Š” ์„œ๋กœ ๋‹ค๋ฅธ Origin๋ผ๋ฆฌ ์š”์ฒญ์„ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์ •ํ•ด๋‘” ํ‘œ์ค€์ด๋‹ค ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ์˜ Origin์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค Spring์—์„œ๋Š” @CrossOrigin ์ด๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ง€์›ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ CORS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค


CORS ํ”Œ๋กœ์šฐ

  1. GET ์š”์ฒญ์ธ์ง€ POST ์š”์ฒญ์ธ์ง€ ํŒŒ์•…ํ•œ๋‹ค
  2. Content-Type๊ณผ Custom HTTP Header๋ฅผ ํŒŒ์•…ํ•œ๋‹ค
  3. OPTIONS ์š”์ฒญ์„ ํ†ตํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์ ์ ˆํ•œ Access-Control-* ๋ฅผ ๊ฐ€์กŒ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
  4. ๋งŒ์•ฝ ์ ์ ˆํ•œ Access-Control์„ ๊ฐ€์กŒ๋‹ค๋ฉด ์‹ค์ œ XHR์„ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค
  5. ์ ์ ˆํ•˜์ง€ ๋ชปํ•œ Access-Control์„ ๊ฐ€์กŒ๋‹ค๋ฉด Error๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค


Spring Boot์—์„œ์˜ CORS ํ•ด๊ฒฐ๋ฒ•

2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค

  1. CORS๋ฅผ ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” Controller ์œ„์— @CrossOrigin("*")์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
  2. WebMvcConfigure ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์„œ CORS๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ

1๋ฒˆ์˜ ๊ฒฝ์šฐ, ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ์˜ url์—๋งŒ ์ ์šฉ์ด ๋˜๋Š”๋ฐ ์ด๋Š” Controller๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์–ด๋…ธํ…Œ์ด์…˜์ด ๋งŽ์•„์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค

๋”ฐ๋ผ์„œ ๋‚˜๋Š” 2๋ฒˆ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์„ค์ •ํ•˜์˜€๋‹ค

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // CORS๋ฅผ ์ ์šฉํ•  URL ํŒจํ„ด ์ •์˜
                .allowedOrigins("*") // ์ž์› ๊ณต์œ ๋ฅผ ํ—ˆ๋ฝํ•  Origin ์ง€์ •
                .allowedMethods("GET", "POST", "PATCH", "DELETE") // ํ—ˆ์šฉํ•  HTTP ๋ฉ”์„œ๋“œ ์ง€์ •
                .maxAge(3000); // pre-flight request ์ง€์ •
    }
}

์ฐธ๊ณ )
https://shinsunyoung.tistory.com/86 https://dev-pengun.tistory.com/entry/Spring-Boot-CORS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

โš ๏ธ **GitHub.com Fallback** โš ๏ธ