๋๋ 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 ์ ์ฑ ์๋ฐ์์ ๋น๋กฏ๋๋ค.
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
๋์ผ ์ถ์ฒ(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 ์๋ฌ๋ฅผ ๋ธ๋ค๋ ์ ์, ์ถ์ฒ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋น๊ตํ๋ค๋ ์ ์ ๊ธฐ์ตํ์.
๋ธ๋ผ์ฐ์ ๋ ๋ค๋ฅธ ์ถ์ฒ(cross-orgin) ์์ฒญ์ด ๋ณด๋ด์ง ๋ origin์ด๋ผ๋ header์ ์ถ๊ฐํ๋ค. origin ํญ๋ชฉ์๋ ๋ด ์ฌ์ดํธ์ ํ๋กํ ์ฝ, ๋๋ฉ์ธ, ํฌํธ๊ฐ ๋ด๊ธด๋ค.
์์ฒญ์ ๋ฐ๋ api (ex ๋ค์ด๋ฒ ์ง๋ api)๋ ์ง์ ๋ access-control-allow-origin ์ ๋ณด๋ฅผ ์ค์ด ๋ณด๋ธ๋ค. ๋ง์ฝ ๋ด ์ฌ์ดํธ๊ฐ ๋ฑ๋ก๋ ์ํ๋ฉด (ํ์ฉ๋ ์ํ๋ฉด) ๋ด ์ฌ์ดํธ์ url๋ access-control-allow-origin ์ ๋ณด์ ๋ค์ด์๋ค.
๋ธ๋ผ์ฐ์ ๋ ์ด ๋์ ๋น๊ตํ๋ค. origin์์ ๋ณด๋ธ ์ถ์ฒ๊ฐ์ด ์๋ฒ์ ๋ต์ฅ์ ๋ด๊ธด access-control-allow-origin์ ๋๊ฐ์ด ์์ผ๋ฉด ์์ ํ ์์ฒญ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ฒ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ์์ฒญ์ ํ๋ฒ์ ๋ณด๋ด์ง ์๊ณ ์๋น ์์ฒญ๊ณผ ๋ณธ ์์ฒญ์ผ๋ก ๋๋์ด์ ์๋ฒ๋ก ์ ์กํ๋ค.
์ด ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณธ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๋ณด๋ด๋ ์๋น ์์ฒญ์ 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์ ํ์ฉํ๊ณ ์ ํ๋ ๋๋ฉ์ธ์ ์ค์ ํด์ค๋ค. *๋ ๋ชจ๋ ๋๋ฉ์ธ์ ํ์ฉํ๋ค.
- 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๋ฅผ ํ์ฉํ ์ ์๋ค.
- Annotation ์ด์ฉํ๋ ๋ฐฉ๋ฒ
@RequestMapping("/")
@CrossOrigin(origins="*", allowedHeaders="*")
public class AController{
}
@CrossOrigin
์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด configuration๊ฐ์ด ํ์ฉํ origin์ด๋ methods๋ฅผ ์ง์ ํ ์ ์๋ค. origins, methods, maxAge, allowedHeadrs๊ฐ ์๋ค. ๋ฉ์๋์ ์ ์ฉ๋๊ฒ ํ ์๋ ์๋ค.