2023. 9. 17. 23:26ใ0. TiL ( Today I Learned )
[๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)]
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)๋ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ ์ด๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ์์ค๊ฐ ์์ ์ ์ถ์ฒ(๋๋ฉ์ธ, ํ๋กํ ์ฝ, ํฌํธ)์ ๋ค๋ฅผ ๋ ๊ต์ฐจ ์ถ์ฒ HTTP ์์ฒญ์ ์คํํ๋ค.
๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์์: https://domain-a.com ํ๋ฐํธ ์๋ JavaScript ์ฝ๋๊ฐ XMLHttpRequest ์ฌ์ฉํ์ฌ https://domain-b.com/data.json ์์ฒญํ๋ ๊ฒฝ์ฐ.
๋ณด์ ์์ ์ด์ ๋ก, ๋ธ๋ผ์ฐ์ ๋ ์คํฌ๋ฆฝํธ์์ ์์ํ ๊ต์ฐจ ์ถ์ฒ HTTP ์์ฒญ์ ์ ํํ๋ค. ์๋ฅผ ๋ค์ด, XMLHttpRequestFetch API๋ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ๋ฐ๋ฆ. ์ฆ, ์ด API๋ฅผ ์ฌ์ฉํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ์ถ์ฒ์ ๋์ผํ ๋ฆฌ์์ค๋ง ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค ๋ถ๋ฌ์ค๋ ค๋ฉด ๊ทธ ์ถ์ฒ์์ ์ฌ๋ฐ๋ฅธ CORS ํค๋๋ฅผ ํฌํจํ ์๋ต์ ๋ฐํํด์ผ ํ๋ค.

CORS ์ฒด์ ๋ ๋ธ๋ผ์ฐ์ ์ ์๋ฒ ๊ฐ์ ์์ ํ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ ๋ฐ ๋ฐ์ดํฐ ์ ์ก์ ์ง์ํฉ๋๋ค. ์ต์ ๋ธ๋ผ์ฐ์ ๋ XMLHttpRequest ๋๋ Fetch์ ๊ฐ์ API์์ CORS๋ฅผ ์ฌ์ฉํ์ฌ ๊ต์ฐจ ์ถ์ฒ HTTP ์์ฒญ์ ์ํ์ ์ํํ๋ค.
์ด๋ค ์์ฒญ์ด CORS๋ฅผ ์ฌ์ฉํ ๊น?
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ํ์ค์ ์น ๋ธ๋ผ์ฐ์ ์์ ํด๋น ์ ๋ณด๋ฅผ ์ฝ๋ ๊ฒ์ด ํ์ฉ๋ ์ถ์ฒ๋ฅผ ์๋ฒ์์ ์ค๋ช ํ ์ ์๋ ์๋ก์ด HTTP ํค๋๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ๋์ํ๋ค. ์ถ๊ฐ์ ์ผ๋ก, ์๋ฒ ๋ฐ์ดํฐ์ ๋ถ์ ํจ๊ณผ(side effect)๋ฅผ ์ผ์ผํฌ ์ ์๋ HTTP ์์ฒญ ๋ฉ์๋(GET ์ ์ธํ HTTP ๋ฉ์๋)์ ๋ํด, CORS ๋ช ์ธ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญ OPTIONS "ํ๋ฆฌํ๋ผ์ดํธ"(preflight, ์ฌ์ ์ ๋ฌ)ํ์ฌ ์ง์ํ๋ ๋ฉ์๋๋ฅผ ์์ฒญํ๊ณ , ์๋ฒ์ "ํ๊ฐ"์ ๋จ์ด์ง๋ฉด ์ค์ ์์ฒญ์ ๋ณด๋ด๋๋ก ์๊ตฌํ๊ณ ์๋ค.
๋ํ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์์ฒญ์ "์ธ์ฆ์ ๋ณด"(์ฟ ํค, HTTP ์ธ์ฆ)๋ฅผ ํจ๊ป ๋ณด๋ด์ผ ํ๋ค๊ณ ์๋ ค์ค ์๋ ์๋ค.
CORS ์คํจ๋ ์ค๋ฅ์ ์์ธ์ด์ง๋ง, ๋ณด์์์ ์ด์ ๋ก JavaScript์์๋ ์ค๋ฅ์ ์์ธ ์ ๋ณด์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์ ์ ์๋ ๊ฒ์ ์ค๋ฅ ๋ฐ์ํ๋ค๋ ์ฌ์ค๋ฟ์ด๋ค. ์ ํํ ์ด๋ค ๊ฒ์ด ์คํจํ๋์ง ์์๋ด๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ์ ์ฝ์์ ๋ด์ผ ํฉ๋๋ค.
์ดํ ํญ๋ชฉ์ ์๋๋ฆฌ์ค์ ํจ๊ป, ์ฌ์ฉํ HTTP ํค๋์ ์์ธ ๋ด์ฉ์ ๋ค๋ฃฌ๋ค.
์ถ์ฒ : https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) - HTTP | MDN
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing, CORS)๋ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ
developer.mozilla.org
์์ฃผ๋ณด๋ ์์ฝ๋์ ๊ฐ์์์ CORS์ ๋ํ ๋ด์ฉ์ ๋ณด์์, ๋ด์ฉ์ ๋ค์ ํ๋ฒ ์ ๋ฆฌํด ๋ณด์๋ค.
๊ด๋ จ URL : https://youtu.be/bW31 xiNB8 Nc? si=foepV_rofbW7 QO-y
ํ ์ฌ์ดํธ์์ ์ฃผ์๊ฐ ๋ค๋ฅธ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ์์ฃผ ์ ํ๊ฒ ๋๋ ์ค๋ฅ CORS
์ฃผ์๊ฐ ‘์ด์ฉ๊ณ ’ ๋ท์ปด์์ URL ‘์ ์ฉ๊ณ ’ ๋ท์ปด ์๋น์ค์ API๋ก ์ ๋ณด๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด์ ํ๋ฐํธ์์ HTTP์์ฒญ์ ๋ณด๋์ ๋ ๋ฏธ๋ฆฌ ์ด๋ค ์ค์ ์ ํด ์ฃผ์ง ์์ผ๋ฉด CORS๋ฌธ์ ๋ก ๋งํ๊ฒ ๋๋ค. ( * postman๊ณผ ๊ฐ์ด ๋๋ฅธ ๊ฑธ๋ก ์์ฒญํ๋ฉด ๋ค๋๋๋ฐ, ์น์ผ๋ก ํ๋ฉด ๋งํ ๋๊ฐ ๋ง์ ).
โถ๏ธ ์น์ฌ์ดํธ์์! ์ฆ ๋ธ๋ผ์ฐ์ ์ธ ํ๋ฐํธ์๋์์ AJAX๋ฅผ ๋ณด๋ผ ๋๋ง๋ค ์๋จ ( ํฌ๋กฌ / ์์ง / ์ฌํ๋ฆฌ )
CORS๋ ์ ์๋ ๊ฑธ๊น?
์๋ฅผ ๋ค์ด ์ฐฉํ ๋ท์ปด์ด๋ผ๋ ์ฌ์ดํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
์ด๋ค ์ฌ์ดํธ์ ๋ก๊ทธ์ธํ๋ฉด, ๋ค์์ ์ ์ํ ๋ ๋ก๊ทธ์ธ์ด ์ ์ง๊ฐ ๋์ด์ผ ํ๋๋ฐ ๊ทธ๊ฒ์ ์บ์๋ผ๊ณ ํ๋ค.
๋ด ๋ก๊ทธ์ธ์ ๋ณด๋ฅผ ํ ํฐ์ผ๋ก ์ ์ฅํด์, ๋ก๊ทธ์ธํ๋ ์ฌ์ดํธ์ ์ ์ํ ๋๋ง๋ค ์์ฒญ์ ์ค์ด ๋ณด๋ด๋ฉด ๊ทธ ์ฌ์ดํธ์์ ์ด ์ฟ ํค๋ฅผ ํ์ธํ๊ณ ๋ก๊ทธ์ธ์ ํ์ธํ ์ ์๋ค. ๋ง์ฝ ๋ด๊ฐ ํฌ๋กฌ์ ํตํด ๋ก๊ทธ์ธ์ ์งํํ๋ค๋ฉด, ํฌ๋กฌ์ ๋ด ์ ๋ณด๊ฐ ์ ์ฅ์ด ๋์ด์๋ค๋ ๊ฒ์ด ๋๋ค.
์ด๋, ์ด๋ฌํ ์ ๋ณด๋ฅผ ๋นผ๋ด๊ธฐ ์ํด ๋์ ๋ท์ปด์ ๋ง๋ค์ด ์ ์ฑ๋ฉ์ผ์ด ์ด๋ ๋๊ธ์ ํตํด ํด๋น ์ฌ์ดํธ๋ก ์ ์ธํ๊ฒ ํ ์ ์๋ค.
๋์ ์ ์ ์ ๋ธ๋ผ์ฐ์ ์ ์ ์์ ํ๋ฉด Html / css / js ์ฝ๋๊ฐ ๋ด ๋ธ๋ผ์ฐ์ ์ ๋ฐ์์ง ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ๋์ ์ฐฉํ ๋ท์ปด์ ์ ์ฅ๋ ๋ด ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ ์์ ์ธ ํ๋์ ์ทจํ ์ ์๊ฒ ๋๋ค.
์ด๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ API๋ฅผ ์กฐ์ํ ์ ์๊ธฐ์ ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ๋ฐฉ์งํ๋ค.
CORS(Cross-Origin Resource Sharing) ๋ค๋ฅธ ์ถ์ฒ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์,
SOP (Same-Origin Policy) ๋์ผ ์ถ์ฒ ์ ์ฑ (์์ฒญ์ ๋ง๋ ๊ฒ)
์๋ ์๋ก ๋ค๋ฅธ ์ถ์ฒ๋ผ๋ฆฌ ์์ฒญ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ์ ๋๋ ๊ฒ ๊ธฐ๋ณธ๊ฐ์ด์๋ค.
ํ์ง๋ง, ์น ์ํ๊ณ๊ฐ ๋ค์ํด์ง๋ฉด์ ์ฌ๋ฌ ์๋น์ค๋ค ๊ฐ์ ๋ณด๋ค ์์ ๋กญ๊ฒ ๋ฐ์ดํฐ๊ฐ ์ฃผ๊ณ ๋ฐ์์ง ํ์๊ฐ ์๊ธฐ๊ฒ ๋์๋ค.
๊ทธ๋ฐ๋ฐ ๋ค๋ฅธ ์ฌ์ดํธ ๊ฐ์ ์์ฒญ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ง๊ณ ์์ด ๊ฐ๋ฐ์๋ค์ jsonp (*ํ์ฌ๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์) ์ฐํํด์ ์ฌ์ฉํ๋ค.
์ด๊ฑธ ํฉ์ํด์ ์ถฉ์กฑ์ํค๋ฉด ๋ฆฌ์์ค๊ฐ ๊ณต์ ๋์ด ์ฌ์ฉํ ์ ์์๊น ํด์ ๋ง๋ค์ด์ง ๊ฒ์ด CORS (๊ต์ฐจ ์ถ์ฒ ์์ ๊ณต์ ๋ฐฉ์)์ด๋ค.
๋จ, ์กฐ๊ฑด์ด ์๋ค.
์์ฒญ์ ๋ฐ๋ ๋ฐฑ์๋ ์ชฝ์์ ํ๋ฝํ ๋ค๋ฅธ ์ถ์ฒ๋ค์ ๋ฏธ๋ฆฌ ๋ช ์ํด ๋๋ฉด ๋๋ค.
๋ฐฑ์๋ ์๋ฒ๋ฅผ ํ๋ก๊ทธ๋๋ฐํ ๋ ์ฐ๋ ํ๋ ์์ํฌ๋ค์ ์ดํด๋ณด๋ฉด CORS ์ต์ ์ ๋ฃ๋ ๋ฐฉ๋ฒ๋ค์ด ์ฝ๊ฒ ๋ง๋ จ๋ผ ์๋ค. ์ฌ๊ธฐ๋ค ํ์ฉํ ์ฌ์ดํธ๋ค์ ์ ์ด์ฃผ๋ฉด ์ด์ ๊ฑฐ๊ธฐ์ ์ง์ ํ ์ฌ์ดํธ์์ ์ด ์๋ฒ๋ก ์ผ๋ง๋ ์ง HTTP์์ฒญ์ ๋ณด๋ผ ์ ์๋ค.
์๋ฌด๋ ๋ณด๋ด๋ ๋๋ ์์ฒญ์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ณํ, ์์ผ๋์นด๋๋ฅผ ์ ์ด ๋ฃ์ผ๋ฉด ๋๊ตฌ๋ ๋ค ์ธ ์ ์๋ค.
๋ค์ด๋ฒ ์ง๋์ ๊ฐ์ api๋, CORS๋ฅผ ํ์ฉํด ์ฃผ๋ ์ฃผ์๋ฅผ ์ง์ ํ๋ ํ์ด์ง๊ฐ ๋ฐ๋ก ์๋ค.
์ฌ๊ธฐ์, header๋, ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ ์ก๋ ๋
๋ฐ์ดํฐ์ ๋งจ ์์ชฝ์ ๋ถ์ ๋ณด์ถฉ ์ ๋ณด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
๋ฐ๋ ์ชฝ์ IP์ฃผ์ ์ฌ์ฉํ ํ๋กํ ์ฝ์ด๋ ์ต์ ๋ฑ์ด ๋ด๊ธฐ๋๋ฐ ์ด๋ ์ฐํธ์ผ๋ก ์น์๋ฉด ๋ดํฌ์ ์ ์ธ ๋ด์ฉ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. (Header์๋ ์์ฒญํ๋ ์ชฝ์ schema ๋๋ฉ์ธ, ๊ทธ๋ฆฌ๊ณ ํฌํธ๊ฐ ๋ด๊ธด๋ค. )
origin์์ ๋ณด๋ธ ์ถ์ฒ๊ฐ์ด ์๋ฒ์ ๋ต์ฅ ํค๋์ ๋ด๊ธด Access-control-allow-Origin์ ๋๊ฐ์ด ์์ผ๋ฉด ์์ ํ ๋ฐ์ดํฐ๋ก ๊ฐ์ฃผํ๊ณ ์๋ต์ ๋ฐ์์ค๊ฒ ๋๋ค.
ํ ํฐ๋ฑ ์ฌ์ฉ์ ์๋ณ ์ ๋ณด๊ฐ ๋ด๊ธด ์์ฒญ์, ๋ณด๋ค ์๊ฒฉํ๋ค. ๋ณด๋ด๋ ์ธก ์์ฒญ์ ์ต์ ์ credentials ํญ๋ชฉ์ true๋ก ์ธํ ํด์ผ ํ๊ณ ,
๋ฐ๋ ์ชฝ์์๋ ์๋ฌด ์ถ์ฒ๋ ๋ค ๋๋ค๋ ์์ผ๋์นด๋๊ฐ ์๋๋ผ, ๋ณด๋ด๋ ์ชฝ์ ์ถ์ฒ ์นํ์ด์ง ์ฃผ์๋ฅผ ์ ํํ ๋ช ์ํ ๋ค์ Access-control-allow-credentials ํญ๋ชฉ์ true๋ก ๋ง์ถฐ์ค์ผ ํ๋ค. ( ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋ ์ฟ ํค๊ฐ ๋์๊ฒ ์ฐ์ผ ์ ์์ด์ ๋ณด๋ค ์กฐ๊ฑด์ ๋๊ฒ ๊ฐ์ถ์ด์ผ ํจ )
โถ๏ธ Simple request ๋ฐฉ์์ผ๋ก get / post ๋ฑ ์ผ์ ์กฐ๊ฑด์ ์์ฒญ์ ์ฌ์ฉ๋จ
โถ๏ธ Put / delete ๋ฑ์ preflight ์์ฒญ์ ๋จผ์ ๋ณด๋ด์ ๋ณธ ์์ฒญ์ด ์์ ํ์ง ํ์ธํ๊ณ ์ฌ๊ธฐ์ ํ๋ฝ์ด ๋จ์ด์ ธ์ผ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค. ( ์๋ฒ์ ์ํฅ์ ์ค ์ ์๋ ์์ฒญ์ผ๋ก ๋จผ์ ํ์ฉ์ฌ๋ถ ๊ฒ์ฆ์ด ํ์ํจ )
์ฒจ๋ถ URL : https://evan-moon.github.i/2020/05/21/about-cors/
CORS๋ ์ ์ด๋ ๊ฒ ์ฐ๋ฆฌ๋ฅผ ํ๋ค๊ฒ ํ๋๊ฑธ๊น?
์ด๋ฒ ํฌ์คํ ์์๋ ์น ๊ฐ๋ฐ์๋ผ๋ฉด ํ๋ฒ์ฏค์ ์ป์ด๋ง์ ๋ดค์ ๋ฒํ ์ ์ฑ ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค. ์ฌ์ค ์น ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด CORS ์ ์ฑ ์๋ฐ์ผ๋ก ์ธํด ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ๊ต์ฅํ ํํด์
evan-moon.github.io


Wil์ ์ ๊ธฐ ์ํด์ CORS๋ฅผ ์ฐพ์๋ณด๋ฉด์, ๋๋ถ๋ถ์ ์ ๋ชฉ๋ค์ด ์ํ์ง๋ง ์ ๋ฌํ๋ค.
์ค์ ๋ก ํ์๋ค๊ณผ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์ฒจ๋ถ ์ด๋ฏธ์ง์ ๊ฐ์ด CORS์ค๋ฅ๊ฐ ๋๋ ๊ฒ์ ๋ณด๊ธฐ๋ ํ๋ค.
(ํธ๋ฌ๋ธ ์ํ ์์ ๊ฐ์ ธ์ด!)
ํ์ ์ ํ๋ค ๋ณด๋ฉด ์ฌ์ฌ์น ์๊ฒ ๋ง์ฃผํ๊ฒ ์ง.
๋ค์ ์ฃผ๋ ํ์ดํ ํด์ผ์ง! ใ ใ ์!