๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋‚˜์˜ ๋ชจ์–‘

CORS(Cross-Origin Resource Sharing) ๋ณธ๋ฌธ

WILT/Network

CORS(Cross-Origin Resource Sharing)

kexon 2022. 8. 8. 12:07

๐ŸŒต SOP(Same-Origin Policy, ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…)

  • ‘๊ฐ™์€ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋งŒ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค’๋Š” ์ •์ฑ…
  • Origin(์ถœ์ฒ˜): ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ
    ⇒ ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅด๋ฉด ๋™์ผํ•œ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹˜

๐Ÿ”–  SOP๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋œ ์ด์œ 

  • ๋ณด์•ˆ์ƒ์˜ ์ด์ 

๐Ÿ”–  BUT!

  • ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ์ผ์ด ๋งŽ์Œ

๐ŸŒต CORS(Cross-Origin Resource Sharing, ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ )

  • ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ ค์ฃผ๋Š” ์ฒด์ œ
  • ๋ธŒ๋ผ์šฐ์ €๋Š” SOP์— ์˜ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ๋ฅผ ๋ง‰์ง€๋งŒ, CORS ์‚ฌ์šฉ์‹œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ

๐Ÿ“ CORS ๋™์ž‘ ๋ฐฉ์‹

CORS Workflow

  1. ๋‹จ์ˆœ ์š”์ฒญ (Simple Request)
    • ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ํ•œ๋ฒˆ์— ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ
    • ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กœ์›€
      • ๋ฉ”์„œ๋“œ: GET, HEAD, POST
      • ์ž๋™์„ค์ • ํ—ค๋” ์™ธ์— Accept, Accept-Language, Content-Language, Content-Type ํ—ค๋” ๊ฐ’๋งŒ ์ˆ˜๋™์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅ
      • Content-Typeํ—ค๋”๋Š” application/x-www-form-urlencoded, multipart/form-data, text/plain ๊ฐ’๋งŒ ํ—ˆ์šฉ
      • XMLHttpRequestUpload ๊ฐ์ฒด์— EventListener๊ฐ€ ์—†์„ ๋•Œ
      • ReadableStream ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ
  2. ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ (Pre-flight Request)
    • ์‹ค์ œ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „, OPTIONS ๋ฉ”์„œ๋“œ๋กœ ์‚ฌ์ „ ์š”์ฒญ์„ ๋ณด๋‚ด ํ•ด๋‹น ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€๋ถ€ํ„ฐ ํ™•์ธํ•˜๋Š” ๊ฒƒ
    • ์‚ฌ์ „ ๊ถŒํ•œ ํ™•์ธ์„ ํ•˜๊ณ  ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ์š”์ฒญ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ†ต์งธ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฆฌ์†Œ์Šค ์ธก๋ฉด์—์„œ ํšจ์œจ์ 
    • ๋งŒ์•ฝ ์š”์ฒญ์„ ๋ณด๋‚ธ ์ถœ์ฒ˜๊ฐ€ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ CORS ์—๋Ÿฌ๋ฅผ ๋„์šฐ๊ฒŒ ๋˜๊ณ , ์‹ค์ œ ์š”์ฒญ์€ ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ
  3. ์ธ์ฆ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ (Credentialed Request)
    • ์š”์ฒญ ํ—ค๋”์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์•„ ๋ณด๋‚ด๋Š” ์š”์ฒญ์œผ๋กœ, ๋ณด์•ˆ์„ ๋” ๊ฐ•ํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ
    • ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅผ ๋•Œ: ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๋ชจ๋‘ CORS ์„ค์ •์ด ํ•„์š”
      • ํด๋ผ์ด์–ธํŠธ ์ธก: ์š”์ฒญ ํ—ค๋”์— withCredentials: true ์„ค์ •
      • ์„œ๋ฒ„ ์ธก: ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Credentials: true๋ฅผ ๋„ฃ์–ด์ค˜์•ผ ํ•จ
        • ์„œ๋ฒ„ ์ธก์—์„œ Access-Control-Allow-Origin์„ ์„ค์ •ํ•  ๋•Œ, ‘*’ ๋Œ€์‹  ์ง์ ‘์ ์œผ๋กœ ๋ช…์‹œ๋ฅผ ํ•ด์ค˜์•ผ ํ•จ
    • Credential Option
      • same-origin(๊ธฐ๋ณธ๊ฐ’): ๊ฐ™์€ ์ถœ์ฒ˜(ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ๋ฒˆํ˜ธ) ์—์„œ ํ—ˆ์šฉ
      • include: ๋ชจ๋“  ์ธ์ฆ ์ •๋ณด ํฌํ•จ
      • omit: ๋ชจ๋“  ์ฟ ํ‚ค, ์ธ์ฆ ์ •๋ณด ๊ตํ™˜ ๋ถˆ๊ฐ€

๐ŸŒต ์ •๋ฆฌ

  • ๊ฐ™์€ ์ถœ์ฒ˜(Same-Origin) ํŒ๋‹จ ๊ธฐ์ค€: ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์Œ
  • CORS ์ •์ฑ…์€ ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ ค์ฃผ๋Š” ์ฒด์ œ
  • ์ถœ์ฒ˜ ๋น„๊ต: ๋ธŒ๋ผ์šฐ์ €์— ๊ตฌํ˜„
  • CORS์˜ 3๊ฐ€์ง€ ๋™์ž‘ ๋ฐฉ๋ฒ•:  Simple Request, Prefilght Request, Credentialed Reqeust

โœ… Ref.

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

https://medium.com/@x24mak/cross-origin-resource-sharing-cors-275e52b021b8

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

https://velog.io/@jimmy0417/WEB-CORS-๊ฐœ๋…๊ณผ-์ ์šฉ-๋ฐฉ๋ฒ•

https://velog.io/@young_pallete/CORS

Comments