[๐ŸŽCS] CORS

h-a-n-aยท2023๋…„ 6์›” 14์ผ
0

๐ŸŽCS

๋ชฉ๋ก ๋ณด๊ธฐ
9/15

์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•œ ๋ฒˆ์ฏค์€ ๋งŒ๋‚˜๋ดค์„ CORS ์ •์ฑ…... ๋‚˜ ์—ญ์‹œ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ ์ด ์‹œ๋ป˜๊ฑด ์—๋Ÿฌ๋ฅผ ์ฒ˜์Œ ๋ณด๊ณ  ๋‹นํ™ฉํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ์— ํ™•์‹คํžˆ CORS์— ๋Œ€ํ•ด ๊ฐœ๋…์„ ์งš์–ด๋ณด๋„๋ก ํ•˜์ž~! ๊ณ ๊ณ ์”ก

CORS๋ž€ ๋ฌด์—‡์ธ๊ฐ€

๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ ์— ๋Œ€ํ•œ ํ—ˆ์šฉ/๋น„ํ—ˆ์šฉ ์ •์ฑ…

์ด๋ ‡๊ฒŒ๋งŒ ๋ณด๋ฉด, ๋‹น์ตœ ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋‹ˆ ํ•˜๋‚˜์”ฉ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋œฏ์–ด๋ณด๋„๋ก ํ•˜์ž. ๋จผ์ € CORS๋Š” Cross-Origin Resource Sharing์˜ ์ค„์ž„๋ง๋กœ, ์ง์—ญํ•˜๋ฉด ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  ๋ผ๋Š” ๋œป์ด๋‹ค. ์—ฌ๊ธฐ์„œ "๊ต์ฐจ(cross)์ถœ์ฒ˜"๋ผ๋Š” ๊ฒƒ์€ "(์—‡๊ฐˆ๋ฆฐ) ๋‹ค๋ฅธ ์ถœ์ฒ˜"๋ฅผ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ถœ์ฒ˜(origin)์ด๋ผ๋Š” ๊ฑด ๋˜ ๋ฌด์—‡์ธ๊ฐ€~?

์ถœ์ฒ˜(origin)

์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์‚ฌ์ดํŠธ๋ฅผ ์ ‘์†ํ•  ๋•Œ ์ธํ„ฐ๋„ท ์ฃผ์†Œ์ฐฝ์— ์น˜๋Š” URL์€ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด ๊ฐ™์ง€๋งŒ ์‚ฌ์‹ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌ์„ฑ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
1) protocol(scheme)
2) host: ์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ
3) port: ํฌํŠธ๋ฒˆํ˜ธ
4) path: ์‚ฌ์ดํŠธ ๋‚ด๋ถ€ ๊ฒฝ๋กœ
5) query string: ์š”์ฒญ์˜ key์™€ value ๊ฐ’
6) fragment: ํ•ด์‹œํƒœ๊ทธ

CORS๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋‹ค์Œ ์„ธ๊ฐ€์ง€์ด๋‹ค
origin: protocol + Host + Port

์ฆ‰ ์ถœ์ฒ˜๋ผ๋Š” ๊ฒƒ์€ protocol๊ณผ host์™€ port๊นŒ์ง€ ๋ชจ๋‘ ํ•ฉ์นœ url์„ ์˜๋ฏธํ•œ๋‹ค.

SOP(same-origin policy)

๋™์ผํ•œ ์ถœ์ฒ˜์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ •์ฑ…

๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์ด ํ•„์š”ํ•œ ์ด์œ 

์‚ฌ์‹ค ์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ๋‘ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž์œ ๋กœ์ด ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์€ ๊ฝค ์œ„ํ—˜ํ•œ ํ™˜๊ฒฝ์ด๋‹ค. ๋งŒ์ผ ์ œ์•ฝ์ด ์—†๋‹ค๋ฉด ํ•ด์ปค๊ฐ€ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ด์ปค๊ฐ€ ์‹ฌ์–ด๋†“์€ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ํ•˜์—ฌ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๋‹ค. (XSS: Cross-Site Scripting) ์ด๋Ÿฌํ•œ ์•…์˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด SOP ์ •์ฑ…์œผ๋กœ ๋™์ผํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ™์€ ์ถœ์ฒ˜์™€ ๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ธฐ์ค€


๋‘ ๊ฐœ์˜ ์ถœ์ฒ˜์˜ ๋‹ค๋ฆ„ ์œ ๋ฌด๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์€ ์œ„์—์„œ origin์ด ๋ฌด์—‡์ธ๊ฐ€ ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ถœ์ฒ˜์˜ ๋™์ผํ•จ์€ Protocol, Host, Post ์ด 3๊ฐ€์ง€๋งŒ ๋™์ผํ•˜๋‹ค๋ฉด ๋™์ผ ์ถœ์ฒ˜๋กœ ํŒ๋‹จํ•œ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ, ํ˜ธ์ŠคํŠธ, ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ทธ ๋’ค์˜ ๋‹ค๋ฅธ ์š”์†Œ๋Š” ๋‹ค๋ฅด๋”๋ผ๋„ ๊ฐ™์€ ์ถœ์ฒ˜๋กœ ์ธ์ •๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ด ์„ธ๊ฐ€์ง€์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ž์‹ ์˜ ์ถœ์ฒ˜์™€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ •์ฑ…์ƒ ์ฐจ๋‹จํ•˜๊ฒŒ ๋œ๋‹ค.

์ถœ์ฒ˜ ๋น„๊ต์™€ ์ฐจ๋‹จ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•œ๋‹ค

์œ„์—์„œ ๊ณ„์† ๋ธŒ๋ผ์šฐ์ €์— ๊ตต์€ ๊ธ€์”จ๋ฅผ ์นœ ๊ฒƒ์„ ๋ˆˆ์น˜์ฑ˜๋Š”๊ฐ€. ์ฐจ๋‹จํ•˜๋Š” ์ฃผ์ฒด๋Š” ๋ˆ„๊ตฌ? ๋ฐ”๋กœ ๋ธŒ๋ผ์šฐ์ €์ด๋‹ค. ์•„๋ฌด๋ž˜๋„ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•˜๋‹ค๋ณด๋‹ˆ ๋ฌด์Šจ ์—๋Ÿฌ๊ฐ€ ๋œจ๋ฉด ์„œ๋ฒ„ ๋ฌธ์ œ์ธ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ ์‰ฌ์šด๋ฐ ์ถœ์ฒ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์€ ์„œ๋ฒ„์— ๊ตฌํ˜„๋œ ์ŠคํŽ™์ด ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €์— ๊ตฌํ˜„๋œ ์ŠคํŽ™์ด๋‹ค.

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

CORS ์ •์ฑ…์˜ ํ•„์š”์„ฑ

SOP ์ข‹๋‹ค ์ด๊ฑฐ์•ผ. ํ•˜์ง€๋งŒ ์ธํ„ฐ๋„ท์€ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜คํ”ˆ๋œ ํ™˜๊ฒฝ์ด๊ณ  ์ด๋Ÿฐ ํ™˜๊ฒฝ์—์„œ ์›นํŽ˜์ด์ง€์˜ ๋‹ค๋ฅธ ์ถœ์ฒ˜์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ๋ฌด์ž‘์ • ๋ง‰์„ ์ˆ˜๋„ ์—†๋Š” ๋…ธ๋ฆ‡. ๊ทธ๋ž˜์„œ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์™ธ ์กฐํ•ญ์„ ๋‘๊ณ  ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด๋ผ๋„ ์ด ์กฐํ•ญ์— ํ•ด๋‹นํ•  ๊ฒฝ์šฐ์—๋Š” ํ—ˆ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋Š”๋ฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ CORS ์ •์ฑ…์„ ์ง€ํ‚จ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด๋‹ค. (=SOP ์ •์ฑ…์„ ์œ„๋ฐ˜ํ•ด๋„ CORS ์ •์ฑ…์— ๋”ฐ๋ฅด๋ฉด ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ผ๋„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๋œป!)


๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด CORS ์ •์ฑ…์„ ๋”ฐ๋ฅด๋ฉฐ SOP ์ •์ฑ…์„ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ง€๊ธˆ๋ถ€ํ„ฐ ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž!

๋ธŒ๋ผ์šฐ์ €์˜ CORS ๊ธฐ๋ณธ๋™์ž‘ ์‚ดํŽด๋ณด๊ธฐ

ํด๋ผ์ด์–ธํŠธ์—์„œ HTTP ์š”์ฒญํ—ค๋”์— Origin์„ ๋‹ด์•„ ์ „๋‹ฌ

๋ธŒ๋ผ์šฐ์ €๋Š” ์š”์ฒญํ—ค๋”์— Origin์ด๋ผ๋Š” ํ•„๋“œ์— ์ถœ์ฒ˜๋ฅผ ํ•จ๊ป˜ ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค.

์„œ๋ฒ„๋Š” ์‘๋‹ตํ—ค๋”์— Access-Control-Allow-Origin์„ ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌ

์ดํ›„ ์„œ๋ฒ„๊ฐ€ ์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ํ•  ๋•Œ ์‘๋‹ต ํ—ค๋”์— Access-Control-Allow-Origin์ด๋ผ๋Š” ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  '์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜ url'์„ ๋‚ด๋ ค๋ณด๋‚ธ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ Origin๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ Access-Control-Allow-Origin์„ ๋น„๊ตํ•œ๋‹ค.

์ดํ›„ ์‘๋‹ต์„ ๋ฐ›์€ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž์‹ ์ด ๋ณด๋ƒˆ๋˜ ์š”์ฒญ์˜ Origin๊ณผ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์ค€ Origin์„ ๋น„๊ตํ•ด๋ณธ ํ›„ ์ฐจ๋‹จํ• ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๋งŒ์•ฝ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฒ„๋ฆฐ๋‹ค(CORS ์—๋Ÿฌ!!)

ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ํ˜„์žฌ ์ž์‹ ์ด ์†ํ•œ ์ถœ์ฒ˜(origin)์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜์— API๋ฅผ ์š”์ฒญํ•˜๊ฒŒ ๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด ์š”์ฒญ์œผ๋กœ ๋„˜์–ด์˜ค๋Š” ๊ฒฝ๊ณผ๊ฐ€ ์•ˆ์ „ํ•œ์ง€ ํŒ๋‹จํ•˜๋Š”๋ฐ, ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ์ถœ์ฒ˜๊ฐ€ ์ž์‹ ์ด ์†ํ•œ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ถœ์ฒ˜์—ฌ๋„ ์„œ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์ถœ์ฒ˜๋ผ๋ฉด ์š”์ฒญ์— ๋Œ€ํ•ด ํ—ˆ์šฉํ•ด์ฃผ๋Š” ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ณด๋ƒ„์œผ๋กœ์จ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

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

CORS ์—๋Ÿฌ๋Š” server์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๊ณ , client์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์„œ๋ฒ„์—์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ CORS ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Access-access-control-allow-origin ํ—ค๋”๋ฅผ ์„ธํŒ…ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ, ์„œ๋ฒ„๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ Open API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ CORS ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค!

ํ”„๋ก์‹œ ์„œ๋ฒ„๋ž€, ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„œ๋ฒ„๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ฆ‰ ํ”„๋ก ํŠธ์—์„œ CORS ์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋งํ•˜๋Š” ๊ฒƒ์€ ์„œ๋ฒ„๋กœ ๊ฐ€๊ธฐ ์ „์— ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์ณ์„œ ์ถœ์ฒ˜๋ฅผ response์™€ ๊ฐ™๊ฒŒ ์ˆ˜์ •ํ•˜๊ณ , ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ ์‚ฌ์ดํŠธ:https://www.datoybi.com/http-proxy-middleware/

profile
ํ•˜๋ฃจํ•˜๋ฃจ๊ฐ€ ์—ฐ์Šต์ด๋‹ˆ ๋‚ด์ผ์€ ๋” ๊ฐ•ํ•ด์งˆ ๊ฒ๋‹ˆ๋‹ค

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