Cross Origin Resource Sharing

LUCYยท2022๋…„ 4์›” 7์ผ
0

Origin ๐Ÿ’ฌ

  • Origin(์ถœ์ฒ˜): <Protocol> "://" <hostname> [ ":" <port> ]
    • Protocol + Host + Port
    • <Protocol> : [ HTTP, HTTPS ]
    • <hostname> : ์„œ๋ฒ„์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„ ๋˜๋Š” IP
    • <port> : ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ์„ ๋งบ๊ธฐ ์œ„ํ•œ TCP ํฌํŠธ ๋ฒˆํ˜ธ, [ Default : 80 ]


๐Ÿšจ Access to fetch at https://blah.blah.blah/yadda Visit Website from origin http://localhost:1234 has been blocked by CORS policy: No โ€˜Access-Control-Allow-Originโ€™ header is present on the requested resource. If an opaque response serves your needs, set the requestโ€™s mode to โ€˜no-corsโ€™ to fetch the resource with CORS disabled.

๐Ÿšจ ์›๋ณธhttp://localhost:1234์—์„œ https://blah.blah.blah/yadda ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋„์ค‘ CORS์ •์ฑ…์— ์˜ํ•ด ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹น. ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— Access-Control-Allow-Origin ํ—ค๋”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‘๋‹ต์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ requestโ€™s ๋ชจ๋“œ๋ฅผ no-cors๋กœ ๋ณ€๊ฒฝํ•ด์„œ CORS๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€์ฃผ์„ธ์—ฌ!

์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๋Š” ์ด์œ ๋Š” HTTP์š”์ฒญ์—์„œ ์–ด๋–ค ์š”์ฒญ์„ ํ•˜๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ •์ฑ…์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ!

<HTML> ๐Ÿ‘‰๐Ÿป Cross-Origin ์ •์ฑ…์„ ๋”ฐ๋ฆ„

<Script> ๐Ÿ‘‰๐Ÿป Same-Origin ์ •์ฑ…์„ ๋”ฐ๋ฆ„

  • JS๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด์•ˆ์ƒ ์ œํ•œํ•œ๋‹ค. 

Cross-Origin Resource Sharing ๐Ÿ’ฌ

๋‹ค๋ฅธ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ (Cross-Origin Resource Sharing, CORS)๋Š” ์ถ”๊ฐ€ HTTP ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•œ ์ถœ์ฒ˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์„ ํƒํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋„๋ก ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ ค์ฃผ๋Š” ์ฒด์ œ์ด๋‹ค. - MDN

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ๋Š” HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด์„œ ๋ณด๋‚ธ๋‹ค. ์ด๋•Œ ๋ธŒ๋ผ์šฐ์ €๋Š” Origin์— ์ถœ์ฒ˜๋ฅผ ํ•จ๊ป˜ ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค.


Preflight Request๐Ÿ’ฌ

  1. ๋งŒ์•ฝ ๋‚ด๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Fetch API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ฆฌ์Šค์†Œ๋ฅผ ๋ฐ›์•„์™€! ๋ผ๊ณ  ์‹œํ‚จ๋‹ค๋ฉด
    - Fetch API๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํฌํ•จํ•œ ๋ฆฌ์†Œ์Šค ์ทจ๋“์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
  2. ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์—๊ฒŒ ์˜ˆ๋น„ ์š”์ฒญ(Preflight)์„ ๋ณด๋‚ธ๋‹ค.
  3. ์„œ๋ฒ„๋Š” ์ด ์˜ˆ๋น„ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ •์ฑ…์„ ๋‹ด์€ ์ •๋ณด๋ฅผ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋‹ค์‹œ ๋ณด๋‚ด์ค€๋‹ค.
  4. ์ดํ›„ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž์‹ ์ด ๋ณด๋‚ธ ์˜ˆ๋น„์š”์ฒญ๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ๋น„๊ตํ›„ ๋ณธ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  5. ์ดํ›„ ์„œ๋ฒ„๊ฐ€ ๋ณธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ•˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ JS๋กœ ๋„˜๊ฒจ์ค€๋‹ค .

Simple Request๐Ÿ’ฌ

ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ์˜ˆ๋น„์š”์ฒญ์„ ์ƒ๋žตํ• ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กœ์›Œ์„œ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค๋ฉด ๊ฑฐ์˜ ์ถฉ์กฐ์‹œํ‚ค๊ธฐ ์–ด๋ ค์›Œ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.


์š”์ฒญ์˜ ๋ฉ”์†Œ๋“œ๋Š” GET, HEAD, POST ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.
Fetch๊ฐ€ "CORS-safelisted request-header"๋กœ ์ •์˜ํ•œ ํ—ค๋”๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Content-Language Content-Type Accept Accept-Language
  • Save-Data Viewport-Width DPR Downlink Width

๋งŒ์•ฝ Content-Type๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜ ๊ฐ’๋“ค๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.

  • application/x-www-form-urlencoded multipart/form-data text/plain


Credentialed Request๐Ÿ’ฌ

์ด ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์ข€ ๋” ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฆฌ์†Œ์Šค ์š”์ฒญ API์ธ XMLHttpRequest ๊ฐ์ฒด๋‚˜ fetch API๋Š” ๋ณ„๋„์˜ ์˜ต์…˜ ์—†์ด ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค ์ •๋ณด๋‚˜ ์ธ์ฆ๊ณผ ๊ด€๋ จ๋œ ํ—ค๋”๋ฅผ ํ•จ๋ถ€๋กœ ์š”์ฒญ์— ๋‹ด์ง€ ์•Š๋Š”๋‹ค.
๋งŒ์•ฝ ์š”์ฒญ์— ์ธ์ฆ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋‹ด์•„์•ผ ํ•œ๋‹ค๋ฉด credentials ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.


Credentials ์˜ต์…˜

  • same-origin(๊ธฐ๋ณธ๊ฐ’): ๊ฐ™์€ ์ถœ์ฒ˜ ๊ฐ„ ์š”์ฒญ์—๋งŒ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  • include: ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.
  • omit: ๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š๋Š”๋‹ค.

๋งŒ์•ฝ same-origin , include ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ๋ฆฌ์†Œ์Šค ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค๋ฉด ํ•œ๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๋นก๋นกํ•œ ์กฐ๊ฑด๋“ค์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒ€์‚ฌํ•ด์•ผํ•œ๋‹ค.

  • Access-Control-Allow-Origin: ๋ชจ๋“  ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” (*)์€ ์‚ฌ์šฉ๋ถˆ๊ฐ€, ๋ช…์‹œ์ ์ธ URL ์š”๊ตฌ
  • ์‘๋‹ต ํ—ค๋”์—๋Š” ๋ฐ˜๋“œ์‹œ Access-Control-Allow-Credentials: true๊ฐ€ ์กด์žฌํ•ด์•ผํ•จ

Chrome ํ™•์žฅํ”„๋กœ๊ทธ๋žจ์€ CORS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ธ Allow CORS ์„ ์ œ๊ณตํ•œ๋‹ค.


Reference: CORS๋Š” ์™œ ์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ๋ฅผ ํž˜๋“ค๊ฒŒ ํ•˜๋Š”๊ฑธ๊นŒ?

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