Skip to content

Latest commit

ย 

History

History
154 lines (86 loc) ยท 9.59 KB

Why we need to know about CORS.md

File metadata and controls

154 lines (86 loc) ยท 9.59 KB

๋‚˜๋Š” CORS๋ฅผ ๊ทธ๋ƒฅ ์—๋Ÿฌ...์˜ ํ•œ ์ข…๋ฅ˜๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์•„์ฃผ ๋‹จ๋‹จํžˆ ์˜คํ•ด๋ฅผ ํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ์˜คํ•ด๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. CORS๋Š” ์ž์‹ ๋„ ๋ชจ๋ฅด๊ฒŒ ๋งŽ์€ ๋ฏธ์›€์„ ๋ฐ›์•˜์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” CORS์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ํ•œ๋‹ค.


CORS

Cross-Origin Resource Sharing์˜ ์•ฝ์ž๋กœ W3C์—์„œ ๋‚ด๋†“์€ ์ •์ฑ…์ด๋‹ค.

W3C (World Wide Web Consortium)

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


Cross-Origin Resource Sharing๋Š”, Cross-Origin(๋‹ค๋ฅธ ์ถœ์ฒ˜)์˜ Resrouce๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ •์ฑ…์ด๋ผ๊ณ  ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์ฃผ์น˜ ๊ฑฐ์˜ ๋ชจ๋“  CORS ๊ด€๋ จ ์ด์Šˆ๋Š” ์ด๋Ÿฐ CORS ์ •์ฑ… ์œ„๋ฐ˜์—์„œ ๋น„๋กฏ๋œ๋‹ค.


SOP

Same-Origin Policy๋Š” ๊ฐ™์€ ์ถœ์ฒ˜์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ทœ์น™์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ์š”์ฒญํ•  ๊ฒฝ์šฐ์— ํ•ด๋‹น๋˜๊ณ , ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„๊ฐ„ ํ†ต์‹ ์„ ํ•  ๋•Œ๋Š” ์ด ์ •์ฑ…์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ํ‘œ์ค€ ์ŠคํŒฉ์— ์กด์žฌํ•˜๋Š” ๋ณด์•ˆ ๊ทœ์น™์ด๋‹ค. ๊ทธ๋Ÿผ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ <script></script> ์•ˆ์— ์žˆ๋Š” ๊ฒƒ๋ง๊ณ  ํŒŒ์ผ์ด๋‚˜ css ํŒŒ์ผ์„ ๊ฐ€์ ธ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ธ๊ฐ€? ์ •๋‹ต์€ ๋งž๋‹ค. ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜, ์›๋ž˜๋Š” ๋‹ค๋ฅธ ์ถœ์ฒ˜(Cross-Origin)์˜ ์ž์›์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์™œ ์ด๋Ÿฐ ๊ทœ์น™์ด ์กด์žฌํ• ๊นŒ?

๋™์ผ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €๋Š” ์™œ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ• ๊นŒ?

์ถœ์ฒ˜๊ฐ€ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งˆ์Œ๋Œ€๋กœ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์€ ๊ฝค ์œ„ํ—˜ํ•œ ํ™˜๊ฒฝ์ด๋‹ค. CSRF Cross-Site Request Forgery ๊ณต๊ฒฉ์ด ์žˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๋„์šฉํ•ด ์ค‘์š” ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค์— ํ† ํฐ์„ ๋‚จ๊ธฐ๊ฒŒ ๋œ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ํ•  ํ•„์š” ์—†์ด ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋กœ๊ทธ์ธ ํ† ํฐ์ด ๋‚จ์•„์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์•…์„ฑ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•œ๋‹ค๋ฉด ์•…์„ฑ ์‚ฌ์ดํŠธ ์—ญ์‹œ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์˜ ํ† ํฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

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

๋งŒ์•ฝ SOP๊ฐ€ ์—†๋‹ค๋ฉด ํ„ธํ„ธ ํ„ธ๋ ธ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ถœ์ฒ˜์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ์€ ๊ต‰์žฅํžˆ ํ”ํ•œ ์ผ์ด๋ผ ๋ฌด์ž‘์ • ๋ง‰์„ ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ์›น ์„œ๋น„์Šค๊ฐ€ ๋‹ค์–‘ํ•ด์ง€๋ฉด์„œ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ„ ๋ณด๋‹ค ์ž์œ ๋กญ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ํ•„์š”๊ฐ€ ์ƒ๊ฒผ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๊ฐ„์˜ ์š”์ฒญ์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ง‰๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ, ๊ฐœ๋ฐœ์ž๋“ค์€ Jsonp ๋“ฑ์˜ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฅผ ์šฐํšŒํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด๊ฑธ ํ•ฉ์˜๋œ ์ถœ์ฒ˜๋“ค๊ฐ„์— 'ํ•ฉ๋ฒ•์ '์œผ๋กœ ํ—ˆ์šฉํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ธฐ์ค€์„ ์ถฉ์กฑ์‹œํ‚ค๋ฉด ๋ฆฌ์†Œ์Šค ๊ณต์œ ๊ฐ€ ๋˜๋„๋ก ๋งŒ๋“ค์–ด์ง„ ๋งค์ปค๋‹ˆ์ฆ˜์ด CORS, ๊ต์ฐจ ์ถœ์ฒ˜ ์ž์› ๊ณต์œ  ๋ฐฉ์‹์ด๋‹ค. CORS ์ •์ฑ…์„ ์ง€ํ‚ค๋ฉด SOP์˜ ์ œ์•ฝ์„ ๋ฐ›์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ์ •์ฑ…์„ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ถœ์ฒ˜๊ฐ„ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด CORS(๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š”) ์—๋Ÿฌ๊ฐ€ ๋‚ด๋ ค์ง„๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•œ๋‹ค๋ฉด SOP ์ •์ฑ…์„ ์œ„๋ฐ˜ํ•œ ๊ฒƒ์ด ๋˜๊ณ , ๊ฑฐ๊ธฐ๋‹ค๊ฐ€ SOP์˜ ์˜ˆ์™ธ ์กฐํ•ญ์ธ CORS ์ •์ฑ…๊นŒ์ง€ ์ง€ํ‚ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„์˜ˆ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.


SOP ๐Ÿ‘‰ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ ๊ฐ„์˜ ์š”์ฒญ์ด ํ•„์š” ๐Ÿ‘‰ ๊ฐœ๋ฐœ์ž๋“ค์ด Jsonp๋กœ ์šฐํšŒ ๐Ÿ‘‰ ํ•ฉ๋ฒ•์ ์œผ๋กœ ํ•ด๋ผ ๐Ÿ‘‰ SOP์˜ ์˜ˆ์™ธ ์ •์ฑ…, CORS


Cross-Origin? Same-Origin?

๋™์ผ ์ถœ์ฒ˜(Same-Origin)์—์„œ๋ฐ–์— ๊ณต์œ ๊ฐ€ ์•ˆ ๋˜์—ˆ๋Š”๋ฐ, CORS ์ •์ฑ…์œผ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜(Cross-Origin)์—์„œ๋„ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅด๊ณ , ๊ฐ™๋‹ค๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ธฐ์ค€์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ.


Origin(์ถœ์ฒ˜)์€ โ‘  scheme, โ‘ก host, โ‘ข port ๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ same-origin์ด๋ž€ scheme(ํ”„๋กœํ† ์ฝœ), host(๋„๋ฉ”์ธ), ํฌํŠธ๊ฐ€ ๊ฐ™๋‹ค๋Š” ๋ง์ด๋ฉฐ, ์ด 3๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅด๋ฉด cross-origin์ด๋‹ค.

์œ„ ์‚ฌ์ง„์—์„œ origin์€ protocol+host์ด๋‹ค.


์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์‚ฌ์‹ค ํ•œ ๊ฐ€์ง€๋Š” ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ์ด๋ ‡๊ฒŒ ์ถœ์ฒ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์ด ์„œ๋ฒ„์— ๊ตฌํ˜„๋œ ์ŠคํŽ™์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ์ŠคํŽ™์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

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

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

์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ CORS ์—๋Ÿฌ๋ฅผ ๋‚ธ๋‹ค๋Š” ์ ์„, ์ถœ์ฒ˜๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋น„๊ตํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž.


๋ฐฉ๋ฒ•

1. Simple Request

๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค๋ฅธ ์ถœ์ฒ˜(cross-orgin) ์š”์ฒญ์ด ๋ณด๋‚ด์งˆ ๋•Œ origin์ด๋ผ๋Š” header์„ ์ถ”๊ฐ€ํ•œ๋‹ค. origin ํ•ญ๋ชฉ์—๋Š” ๋‚ด ์‚ฌ์ดํŠธ์˜ ํ”„๋กœํ† ์ฝœ, ๋„๋ฉ”์ธ, ํฌํŠธ๊ฐ€ ๋‹ด๊ธด๋‹ค.

์š”์ฒญ์„ ๋ฐ›๋Š” api (ex ๋„ค์ด๋ฒ„ ์ง€๋„ api)๋Š” ์ง€์ •๋œ access-control-allow-origin ์ •๋ณด๋ฅผ ์‹ค์–ด ๋ณด๋‚ธ๋‹ค. ๋งŒ์•ฝ ๋‚ด ์‚ฌ์ดํŠธ๊ฐ€ ๋“ฑ๋ก๋œ ์ƒํƒœ๋ฉด (ํ—ˆ์šฉ๋œ ์ƒํƒœ๋ฉด) ๋‚ด ์‚ฌ์ดํŠธ์˜ url๋„ access-control-allow-origin ์ •๋ณด์— ๋“ค์–ด์žˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ๋‘˜์„ ๋น„๊ตํ•œ๋‹ค. origin์—์„œ ๋ณด๋‚ธ ์ถœ์ฒ˜๊ฐ’์ด ์„œ๋ฒ„์˜ ๋‹ต์žฅ์— ๋‹ด๊ธด access-control-allow-origin์— ๋˜‘๊ฐ™์ด ์žˆ์œผ๋ฉด ์•ˆ์ „ํ•œ ์š”์ฒญ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ฒŒ๋œ๋‹ค.

2. Preflight Request ์˜ˆ๋น„ ์š”์ฒญ

๋ธŒ๋ผ์šฐ์ €๋Š” ์š”์ฒญ์„ ํ•œ๋ฒˆ์— ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์˜ˆ๋น„ ์š”์ฒญ๊ณผ ๋ณธ ์š”์ฒญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์„œ๋ฒ„๋กœ ์ „์†กํ•œ๋‹ค.

์ด ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ณด๋‚ด๋Š” ์˜ˆ๋น„ ์š”์ฒญ์„ Preflight๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์˜ˆ๋น„ ์š”์ฒญ์—๋Š” HTTP ๋ฉ”์„œ๋“œ ์ค‘ OPTIONS ๋ฉ”์„œ๋“œ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋น„ ์š”์ฒญ์˜ ์—ญํ• ์€ ๋ณธ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ธŒ๋ผ์šฐ์ € ์Šค์Šค๋กœ ์ด ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ธ์ฆ๋œ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. CORS์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์‹์ด๋ผ๊ธฐ ๋ณด๋‹ค๋Š” ๋‹ค๋ฅธ ์ถœ์ฒ˜ ๊ฐ„ ํ†ต์‹ ์—์„œ ๋ณด์•ˆ์„ ์ข€ ๋” ๊ฐ•ํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์š”์ฒญ์— ์ธ์ฆ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜ต์…˜์ด credentials์˜ต์…˜์ด๋‹ค. ์˜ต์…˜์—๋Š” ์ด 3๊ฐ€์ง€ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. โ‘  same-origin(๊ฐ™์€ ์ถœ์ฒ˜ ๊ฐ„ ์š”์ฒญ์—๋งŒ ์ธ์ฆ ์ •๋ณด ๋‹ด์Œ)์ด ๊ธฐ๋ณธ๊ฐ’์ด๊ณ  โ‘กinclude(๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด ๋‹ด์Œ)์™€ โ‘ขomit(๋ชจ๋“  ์š”์ฒญ์— ์ธ์ฆ ์ •๋ณด ๋‹ด์ง€ ์•Š์Œ)์ด ์žˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” Access-Control-Allow-Origin: *๋ผ๋Š” ์‘๋‹ต์„ ๋ณด๊ณ  ๊ดœ์ฐฎ๋‹ค, ๊ฒฐ๋ก  ๋‚ด๋ฆฌ์ง€๋งŒ credentials ์˜ต์…˜์„ include๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ฐ™์€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์ƒํ™ฉ์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์ธ์ฆ ๋ชจ๋“œ๊ฐ€ include์ผ ๊ฒฝ์šฐ ๋ชจ๋“  ์š”์ฒญ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์˜ *๋ฅผ Access-Control-Allow-Origin ํ—ค๋”์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.


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

์‘๋‹ต ํ—ค๋” Access-Control-Allow-Origin์— ํ—ˆ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋„๋ฉ”์ธ์„ ์„ค์ •ํ•ด์ค€๋‹ค. *๋Š” ๋ชจ๋“  ๋„๋ฉ”์ธ์„ ํ—ˆ์šฉํ•œ๋‹ค.

Spring Boot

  1. Config ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•
@Configuration
public class WebConfig implements WebMvcConfigurer{
    @Override
    public void addCorsMappings(CorsRegistry registry){
        registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedMethods("GET","POST");
    }
}

@Configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค.

addCorsMappings(...) ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ๋‹ค.

registry.addMapping์„ ์ด์šฉํ•ด์„œ ์ž์› ๊ณต์œ ๋ฅผ ํ—ˆ์šฉํ•  url ํŒจํ„ด์„ ์ •์˜ํ•œ๋‹ค. "/**"์€ ์™€์ผ๋“œ์นด๋“œ์ด๋‹ค.

allowedOrigins() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ž์› ๊ณต์œ ๋ฅผ ํ—ˆ๋ฝํ•  Origin์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

.allowedOrigins("http://localhost:8080", "http://localhost:7007");

ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ Origin์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

allowedMethods()๋กœ ์ž์› ๊ณต์œ ๋ฅผ ํ—ˆ์šฉํ•  HTTP Mehotd๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ "*"๋ฅผ ์ด์šฉํ•ด ๋ชจ๋“  method๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Annotation ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
@RequestMapping("/")
@CrossOrigin(origins="*", allowedHeaders="*")
public class AController{
    
}

@CrossOrigin ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด configuration๊ฐ™์ด ํ—ˆ์šฉํ•  origin์ด๋‚˜ methods๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. origins, methods, maxAge, allowedHeadrs๊ฐ€ ์žˆ๋‹ค. ๋ฉ”์„œ๋“œ์— ์ ์šฉ๋˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.