[FE - ConnecTo] DAY51 TIL๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป

JUNYยท2022๋…„ 9์›” 22์ผ
0

๐Ÿ“šZeroBase ConnecTo Front-End

๋ชฉ๋ก ๋ณด๊ธฐ
39/53
post-thumbnail

22.09.22 ์ˆ˜์—… ์‹œ๊ฐ„ ์ค‘ ์Šค์Šค๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๋“ค์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š
ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค! ๐ŸŠ

CORS ๊ฐœ๋…

  • Cross Origin Resource Sharing
    • ๊ต์ฐจ ์ถœ์ฒ˜ ์ •๋ณด ๊ณต์œ ์— ๊ด€ํ•œ ์ •์ฑ…
  • ๋ณด์•ˆ ์ƒ์˜ ์ด์œ ๋กœ ๋ชจ๋“  ์›น์‚ฌ์ดํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ SOP(Same-Origin Policy)๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๊ฐ™์€ ์ถœ์ฒ˜์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ์€ ํ•ญ์ƒ ํ—ˆ๋ฝ๋˜์ง€๋งŒ, ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ ํŠน๋ณ„ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ํ—ˆ๋ฝ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
  • ํ•ด๋‹น ๊ทœ์น™์ด CORS๋กœ, ๋‹ค๋ฅธ ์ถœ์ฒ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ CORS๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ตํ•˜๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‘๋‹ต์„ ํŒŒ๊ธฐํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์—๋Ÿฌ๋ฅผ ๋˜์ง„๋‹ค.

์ถœ์ฒ˜

  • CORS์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์ถœ์ฒ˜๋Š” URI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ ์ค‘ Scheme, Host, Port๋ฅผ ๋งํ•œ๋‹ค.
  • 3๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ๊ฐ„์ฃผํ•˜๋ฉฐ, ํฌํŠธ ๋ฒˆํ˜ธ์˜ ๊ฒฝ์šฐ ๋”ฐ๋กœ ๋ช…์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ HTTP/HTTPS์˜ ๊ธฐ๋ณธ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.
  • ์ถœ์ฒ˜์˜ ๊ตฌ์„ฑ ์š”์†Œ
    • Scheme
      • http:// , https://์™€ ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ. http์™€ https๋Š” ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ˜ธ์ŠคํŠธ๊ฐ€ ๊ฐ™๋”๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ์ธ์‹ํ•˜์—ฌ CORS์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Host
      • www.naver.com๊ณผ ๊ฐ™์ด, ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ์™€ ๊ตฌ๋ถ„๋˜๋Š” ๋…๋ฆฝ์ ์ธ ์ด๋ฆ„. ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์ฃผ์†Œ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ถ€๋ถ„์„ ๋งํ•˜๋ฉฐ, ๋’ท๋ถ€๋ถ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๋“ฑ์€ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • Port
      • ์ƒ๋žต๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ๋ช…์‹œํ•  ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ ๋’ค์— ๋ถ™๋Š”๋‹ค.
        • ์˜ˆ: https://www.pereng.com:8000
      • http์˜ ๊ธฐ๋ณธ ํฌํŠธ๋ฒˆํ˜ธ๋Š” :80, https์˜ ๊ธฐ๋ณธ ํฌํŠธ๋ฒˆํ˜ธ๋Š” :443 ์ด๋‹ค.

๋ˆ„๊ฐ€ ํ™•์ธํ•˜์ง€?

  • CORS๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ํŒ๋‹จํ•˜๊ณ  ์ ์šฉํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์ž์‹ ์ด ๋ˆ„๊ตฌ์ธ์ง€, ์–ด๋–ค ์š”์ฒญ์„ ํ—ˆ๋ฝํ•  ๊ฒƒ์ธ์ง€๋ฅผ ์š”์ฒญ ํ—ค๋”์— ๋‹ด์•„ ์ „์†กํ•˜๊ณ , CORS์œ„๋ฐ˜ ์—ฌ๋ถ€๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŒ๋‹จํ•œ๋‹ค.
    • ๋”ฐ๋ผ์„œ CORS๋ฅผ ์œ„๋ฐ˜ํ•œ ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‘๋‹ต์„ ํŒŒ๊ธฐํ•œ๋‹ค.
      • ์„œ๋ฒ„ ๋กœ๊ทธ์—๋Š” ์ •์ƒ์ ์ธ ํ†ต์‹ ์œผ๋กœ ๊ธฐ๋ก๋œ๋‹ค๋Š” ์˜๋ฏธ
    • ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ํŒ๋‹จ ๊ธฐ์ค€์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ IE์˜ ๊ฒฝ์šฐ ์ถœ์ฒ˜ ํŒ๋‹จ ์‹œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค.

CORS ๊ด€์ ์—์„œ ๋ณด๋Š” 3๊ฐ€์ง€ ํ†ต์‹  ๋ฐฉ๋ฒ•

  1. Preflight
    1. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์˜ˆ๋น„ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค
    2. ์˜ˆ๋น„ ์š”์ฒญ์— ๋Œ€ํ•ด, ์„œ๋ฒ„๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ํ—ˆ์šฉ๋˜๊ณ  ๊ธˆ์ง€๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‘๋‹ต ํ—ค๋”์— ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค.
      1. origin, credential, method ๋“ฑ
    3. ๋ธŒ๋ผ์šฐ์ €๋Š” ์˜ˆ๋น„ ์š”์ฒญ๊ณผ ๊ทธ์— ๋Œ€ํ•œ ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋น„๊ตํ•˜์—ฌ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋  ๊ฒฝ์šฐ ๋ณธ ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ๋‹ค
    4. ์ดํ›„ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋„˜๊ฒจ์ค€๋‹ค
  2. Simple Request
    1. ๋ธŒ๋ผ์šฐ์ €๋Š” ์˜ˆ๋น„ ์š”์ฒญ ์—†์ด ์„œ๋ฒ„์— ๋ฐ”๋กœ ๋ณธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต ํ—ค๋”์˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ CORS ์ •์ฑ… ์œ„๋ฐ˜ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค
      1. ์˜ˆ๋น„ ์š”์ฒญ์ด ์—†๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ , 1๋ฒˆ๊ณผ ๋กœ์ง์ด ๊ฐ™๋‹ค
      2. ์ œ์•ฝ ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กœ์›Œ, ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ผ์ด ๋“œ๋ฌผ๋‹ค
        1. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ method ์ œํ•œ,
        2. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ header ์ œํ•œ,
        3. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Content-type ์ œํ•œ
  3. Credentialed Request
    1. ์š”์ฒญ ํ—ค๋”์— Credentials๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์ฟ ํ‚ค์™€ ๊ฐ™์€ ์ธ์ฆ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ „์†ก
      1. Same-origin: ๊ฐ™์€ ์ถœ์ฒ˜์— ๋ณด๋‚ผ ๋•Œ๋งŒ ์ธ์ฆ ์ •๋ณด ์ „์†ก
      2. Include: ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ธ์ฆ ์ •๋ณด ์ „์†ก
      3. Omit: ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š์Œ
    2. ์ธ์ฆ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ ๊ธฐ์กด CORS ๋ฃฐ์— ์ƒˆ๋กœ์šด ๊ทœ์น™์„ 2๊ฐœ ์ถ”๊ฐ€ํ•จ
      1. ์„œ๋ฒ„์ธก์—์„œ Access-Control-Allow-Credentials: true๋ฅผ ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
      2. ์„œ๋ฒ„์ธก์—์„œ Access-Control-Allow-Origin ์— ๋ช…ํ™•ํ•œ ์ถœ์ฒ˜๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•จ
        1. ๋ณด์•ˆ ์ƒ์˜ ์ด์Šˆ๋กœ * ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

CORS ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

์„œ๋ฒ„

  • Access-Control-Allow-Origin ์„ค์ •ํ•˜๊ธฐ
    • ๊ฐ€๊ธ‰์  * ๋ณด๋‹ค๋Š” ๊ตฌ์ฒด์ ์ธ ์ถœ์ฒ˜๋ฅผ ๋ช…์‹œํ•  ๊ฒƒ(๋ณด์•ˆ ์ด์Šˆ)
    • ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์— Credentials: include์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ, * ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CORS ์—๋Ÿฌ ๋ฐœ์ƒ
  • Access-Control-Allow-Credentials: true ํ™•์ธํ•˜๊ธฐ
    • ํด๋ผ์ด์–ธํŠธ์—์„œ Credentials: include์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ, ๊ทธ์— ๋Œ€ํ•ด ํ•ด๋‹น ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด CORS ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ.

ํด๋ผ์ด์–ธํŠธ

  • Proxy ์„ค์ •ํ•˜๊ธฐ
    • Proxy๋ž€?

      • ์š”์ฒญ์„ Proxy์—์„œ ์„ค์ •ํ•œ ์ฃผ์†Œ๋กœ ์šฐํšŒํ•˜์—ฌ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•
      • http-proxy-middleware ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    • ์˜ˆ์‹œ

      //  `/api`๋กœ ์‹œ์ž‘ํ•˜๋Š” ์š”์ฒญ์˜ ์ฃผ์†Œ๋ฅผ ์›๋ž˜ ํด๋ผ์ด์–ธํŠธ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ target์—์„œ ์„ค์ •ํ•œ ์ฃผ์†Œ๋กœ ์šฐํšŒํ•ด์ค€๋‹ค.
      
      // ๋”ฐ๋ผ์„œ target์˜ ์ฃผ์†Œ์™€ ์š”์ฒญ์„ ๋ฐ›์„ ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋ฅผ ์ผ์น˜์‹œํ‚ค๋ฉด, ๋™์ผํ•œ ์ถœ์ฒ˜๋กœ ํŒ๋‹จํ•˜์—ฌ CORS ์ •์ฑ… ์œ„๋ฐ˜์„ ํ”ผํ•ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค
      
      proxy: {
            '/api': {
              target: 'https://api.evan.com',
              changeOrigin: true,
              pathRewrite: { '^/api': '' },
            },
          }
      
    • ์ฃผ์˜์‚ฌํ•ญ

      • ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋งŒ ์ ์šฉ๋˜๋ฏ€๋กœ, ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํ”„๋ก์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค
        • ๋นŒ๋“œ ์ดํ›„์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ

์ฐธ๊ณ ์ž๋ฃŒ

https://evan-moon.github.io/2020/05/21/about-cors/#cors๋ฅผ-ํ•ด๊ฒฐํ• -์ˆ˜-์žˆ๋Š”-๋ฐฉ๋ฒ•

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

https://phase-dryosaurus-8ac.notion.site/CORS-9f5a68d44a8f4b46bbb647a9b50c2638

profile
์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๐ŸŒผ

0๊ฐœ์˜ ๋Œ“๊ธ€