ddonghyeo 2023. 9. 2. 00:04

CORS๋ž€?

Cross Origin Resource Sharing

์š”์ฒญ์ด Same Origin, ์ฆ‰ ๋™์ผํ•œ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹Œ ๊ณต์œ ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ง‰๋Š” ๋ณด์•ˆ ์ •์ฑ…์ด๋‹ค.
์š”์ฒญ์„ ํ•œ ๋„๋ฉ”์ธ์˜ ์ฃผ์†Œ, ํฌํŠธ๋ฒˆํ˜ธ, ํ”„๋กœํ† ์ฝœ์ด ๋ชจ๋‘ ๊ฐ™์•„์•ผ์ง€ ํ•ด๋‹น ์‘๋‹ต์„ ๋ฐ˜์‘ํ•˜๋Š” ์ •์ฑ…์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,
API์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ์ด server.com์ด๊ณ ,
์š”์ฒญํ•œ๋Š” ์‚ฌ์ดํŠธ์˜ ๋„๋ฉ”์ธ์ด page.com์ด๋ผ๋ฉด

์š”์ฒญ์„ ํ•˜๋Š” page.com์˜ ๋„๋ฉ”์ธ์ด server.com์˜ ๋„๋ฉ”์ธ๊ณผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‘๋‹ต ์š”์ฒญ์„ ๋ง‰๋Š” ์ด์œ ์ด๋‹ค.





CORS ์ •์ฑ…์˜ ์ด์œ 

๋งŒ์•ฝ, ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค๋ฉด,
๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๋ฅผ ์ ‘์†ํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ํ† ํฐ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,
์‚ฌ์šฉ์ž๊ฐ€ example.com ์— ์ ‘์†์„ ํ–ˆ๋Š”๋ฐ, ํ•ด๋‹น ์‚ฌ์ดํŠธ์—์„œ www.naver.com์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ ,
www.naver.com์—์„œ๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ธ์ฆ ํ† ํฐ์„ ์ฒจ๋ถ€ํ•ด์„œ ์ค€๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด exmple.com์—์„  ์‚ฌ์šฉ์ž์˜ naver์— ๋Œ€ํ•œ ์ธ์ฆ ๊ถŒํ•œ์„ ๋ฐ›๊ฒŒ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.





ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

1. ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•˜๊ธฐ

์‰ฌ์šด ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ๋Š”, api ์„œ๋ฒ„์—์„œ ๋”ฐ๋กœ ์ •์ฑ…์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • Spring
    @RestController
    @CrossOrigin(origins = "example.com") // ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ Origin ํ—ˆ์šฉ
    public class MyController {
      @GetMapping("/example")
      public String example() {
          ...
      }
    }
    Spring์—์„œ @CrossOrigin ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ Origin์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    ์œ„ ์ฝ”๋“œ์—์„  API์„œ๋ฒ„๊ฐ€ example.com์— ๋Œ€ํ•œ CORS๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.




  • Django


django์—์„  django-cors-headers๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

pip install django-cors-headers

ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ django-cors-headers๋ฅผ ์„ค์น˜ํ•œ๋‹ค.



INSTALLED_APPS = [
    # ...
    'corsheaders',
    # ...
]

MIDDLEWARE = [
    # ...
    'corsheaders.middleware.CorsMiddleware',
    # ...
]

django settings.py์—์„œ ์œ„ ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ๋‹ค.



๋˜๋Š”, settings.py์— ํŠน์ • ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

CORS_ORIGIN_ALLOW_ALL = True

์œ„๋Š” ๋ชจ๋“  ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ด๋‹ค.

CORS_ORIGIN_WHITELIST = [
    'http://example.com',
    'https://example.com',
]

์œ„๋Š” ํŠน์ • ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ด๋‹ค.




2. ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•ด๊ฒฐํ•˜๊ธฐ

CORS์ •์ฑ…์€ ๋Œ€๋ถ€๋ถ„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ง‰๋Š” ํ–‰์œ„๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๋ธŒ๋ผ์šฐ์ €์—์„œ CORS์ •์ฑ… ์„ค์ •์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


๋ณธ ํฌ๋กฌ ํ™•์žฅํ”„๋กœ๊ทธ๋žจ์€ CORS ์ •์ฑ…์„ Unblock ํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.





์š”์ฆ˜์€ API์„œ๋ฒ„๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ, ๋„๋ฉ”์ธ์ด ๋‹ฌ๋ผ์„œ CORS์„ค์ •์„ ์„œ๋ฒ„์—์„œ ํ•ด์ฃผ๋Š”๊ฒŒ ํ•„์ˆ˜๊ฐ€ ๋๋‹ค !!