์น ๊ฐ๋ฐ์๋ผ๋ฉด ํ ๋ฒ์ฏค์ ๋ง๋๋ดค์ CORS ์ ์ฑ ... ๋ ์ญ์ ํ๋ก์ ํธ ์งํ ์ค ์ด ์๋ป๊ฑด ์๋ฌ๋ฅผ ์ฒ์ ๋ณด๊ณ ๋นํฉํ๋ ๊ธฐ์ต์ด ์๋ค. ์ด๋ฒ ๊ธฐํ์ ํ์คํ CORS์ ๋ํด ๊ฐ๋ ์ ์ง์ด๋ณด๋๋ก ํ์~! ๊ณ ๊ณ ์ก
๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ๊ณต์ ์ ๋ํ ํ์ฉ/๋นํ์ฉ ์ ์ฑ
์ด๋ ๊ฒ๋ง ๋ณด๋ฉด, ๋น์ต ๋ฌด์จ ์๋ฆฌ์ธ์ง ์ ์ ์์ผ๋ ํ๋์ฉ ์ฒ์๋ถํฐ ๋ฏ์ด๋ณด๋๋ก ํ์. ๋จผ์ CORS๋ Cross-Origin Resource Sharing์ ์ค์๋ง๋ก, ์ง์ญํ๋ฉด ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ๋ผ๋ ๋ป์ด๋ค. ์ฌ๊ธฐ์ "๊ต์ฐจ(cross)์ถ์ฒ"๋ผ๋ ๊ฒ์ "(์๊ฐ๋ฆฐ) ๋ค๋ฅธ ์ถ์ฒ"๋ฅผ ์๋ฏธํ๋ค๊ณ ๋ณผ ์ ์๋๋ฐ, ์ถ์ฒ(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์ ์๋ฏธํ๋ค.
๋์ผํ ์ถ์ฒ์์๋ง ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ์ ์๋ค๋ ์ ์ฑ
์ฌ์ค ์ถ์ฒ๊ฐ ๋ค๋ฅธ ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ ๋ก์ด ์ํตํ ์ ์๋ ํ๊ฒฝ์ ๊ฝค ์ํํ ํ๊ฒฝ์ด๋ค. ๋ง์ผ ์ ์ฝ์ด ์๋ค๋ฉด ํด์ปค๊ฐ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ด์ฉํด์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ดํ๋ฆฌ์ผ์ด์ ์์ ํด์ปค๊ฐ ์ฌ์ด๋์ ์ฝ๋๊ฐ ์คํํ์ฌ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๊ฐ๋ก์ฑ ์ ์๋ค. (XSS: Cross-Site Scripting) ์ด๋ฌํ ์ ์์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด SOP ์ ์ฑ ์ผ๋ก ๋์ผํ์ง ์๋ ๋ค๋ฅธ ์ถ์ฒ์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ง ์๋๋ก ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ ์ ๋ฐฉ์งํ๋ ๊ฒ์ด๋ค.
๋ ๊ฐ์ ์ถ์ฒ์ ๋ค๋ฆ ์ ๋ฌด๋ฅผ ํ๋จํ๋ ๊ธฐ์ค์ ์์์ origin์ด ๋ฌด์์ธ๊ฐ ์์ ์ ์ ์๋ค. ์ถ์ฒ์ ๋์ผํจ์ Protocol, Host, Post ์ด 3๊ฐ์ง๋ง ๋์ผํ๋ค๋ฉด ๋์ผ ์ถ์ฒ๋ก ํ๋จํ๋ค.
์ ๋ฆฌํ์๋ฉด ๊ฐ์ ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๊ทธ ๋ค์ ๋ค๋ฅธ ์์๋ ๋ค๋ฅด๋๋ผ๋ ๊ฐ์ ์ถ์ฒ๋ก ์ธ์ ๋๋ค. ๋ฐ๋๋ก ์ด ์ธ๊ฐ์ง์ค ํ๋๋ผ๋ ์์ ์ ์ถ์ฒ์ ๋ค๋ฅผ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ ์ ์ฑ
์ ์ฐจ๋จํ๊ฒ ๋๋ค.
์์์ ๊ณ์ ๋ธ๋ผ์ฐ์ ์ ๊ตต์ ๊ธ์จ๋ฅผ ์น ๊ฒ์ ๋์น์ฑ๋๊ฐ. ์ฐจ๋จํ๋ ์ฃผ์ฒด๋ ๋๊ตฌ? ๋ฐ๋ก ๋ธ๋ผ์ฐ์ ์ด๋ค. ์๋ฌด๋๋ ์๋ฒ์ ์์ฒญ์ ํ๋ค๋ณด๋ ๋ฌด์จ ์๋ฌ๊ฐ ๋จ๋ฉด ์๋ฒ ๋ฌธ์ ์ธ๊ฐ ์๊ฐํ๊ธฐ ์ฌ์ด๋ฐ ์ถ์ฒ๋ฅผ ๋น๊ตํ๋ ๋ก์ง์ ์๋ฒ์ ๊ตฌํ๋ ์คํ์ด ์๋ ๋ธ๋ผ์ฐ์ ์ ๊ตฌํ๋ ์คํ์ด๋ค.
์ฌ์ค ์๋ฒ๋ ๋ฆฌ์์ค ์์ฒญ์ ๋ํ ์๋ต์ ๊น๋ํ ํด์ฃผ์๋ค. ๊ทธ๋ฌ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด ์๋ต์ ๋ถ์ํด์ ๋์ผ ์ถ์ฒ๊ฐ ์๋๋ฉด, CORS ์๋ฌ๋ฅผ ๋ด๋ฟ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ๋ธ๋ผ์ฐ์ ์๋ ์๋ฌ๊ฐ ๋จ์ง๋ง, ์๋ฒ ์ชฝ์์๋ ์ ์์ ์ผ๋ก ์๋ต์ ํ๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๋ํญ์ ๊ฒช๋ ๊ฒ์ด๋ค. ์ฆ, ์๋ต ๋ฐ์ดํฐ๋ ๋ฉ์ฉกํ์ง๋ง ๋ธ๋ผ์ฐ์ ๋จ์์ ๋ฐ์ ์ ์๋๋ก ์ฐจ๋จ์ ํ ๊ฒ์ด๋ค.
SOP ์ข๋ค ์ด๊ฑฐ์ผ. ํ์ง๋ง ์ธํฐ๋ท์ ์ฌ๋ฌ ์ฌ๋๋ค์๊ฒ ์คํ๋ ํ๊ฒฝ์ด๊ณ ์ด๋ฐ ํ๊ฒฝ์์ ์นํ์ด์ง์ ๋ค๋ฅธ ์ถ์ฒ์ ์๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ๊ฑธ ๋ฌด์์ ๋ง์ ์๋ ์๋ ๋ ธ๋ฆ. ๊ทธ๋์ ๋ช ๊ฐ์ง ์์ธ ์กฐํญ์ ๋๊ณ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ์์ฒญ์ด๋ผ๋ ์ด ์กฐํญ์ ํด๋นํ ๊ฒฝ์ฐ์๋ ํ์ฉํ๊ธฐ๋ก ํ๋๋ฐ, ๊ทธ ์ค ํ๋๊ฐ ๋ฐ๋ก CORS ์ ์ฑ ์ ์งํจ ๋ฆฌ์์ค ์์ฒญ์ด๋ค. (=SOP ์ ์ฑ ์ ์๋ฐํด๋ CORS ์ ์ฑ ์ ๋ฐ๋ฅด๋ฉด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ผ๋ ํ์ฉํ๋ค๋ ๋ป!)
๊ทธ๋ผ ์ด๋ป๊ฒ ํ๋ฉด CORS ์ ์ฑ
์ ๋ฐ๋ฅด๋ฉฐ SOP ์ ์ฑ
์ ํํผํ ์ ์๋์ง ์ง๊ธ๋ถํฐ ํจ๊ป ์์๋ณด์!
๋ธ๋ผ์ฐ์ ๋ ์์ฒญํค๋์ Origin์ด๋ผ๋ ํ๋์ ์ถ์ฒ๋ฅผ ํจ๊ป ๋ด์ ๋ณด๋ธ๋ค.
์ดํ ์๋ฒ๊ฐ ์ด ์์ฒญ์ ๋ํ ์๋ต์ ํ ๋ ์๋ต ํค๋์ Access-Control-Allow-Origin
์ด๋ผ๋ ํ๋๋ฅผ ์ถ๊ฐํ๊ณ '์ด ๋ฆฌ์์ค๋ฅผ ์ ๊ทผํ๋ ๊ฒ์ด ํ์ฉ๋ ์ถ์ฒ url'์ ๋ด๋ ค๋ณด๋ธ๋ค.
์ดํ ์๋ต์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ๋ ์์ ์ด ๋ณด๋๋ ์์ฒญ์ 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/