๋ก์ปฌ์์ CORS policy ๊ด๋ จ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ด์
๐ ๋ฐ๋จ
์์ ๊ฐ์ html ํ์ผ์ ๋ก์ปฌํ๊ฒฝ์์ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ธ๋ก ์คํ์์ผฐ๋๋
Access to script at 'file:///C:/๊ฒฝ๋ก/js/module.js' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
์ด์ ๊ฐ์ ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํ์์ต๋๋ค.
๐ซ ํด๊ฒฐ๋ฐฉ์
๋น์ทํ ์๋ฌ๋ฅผ ๋ช ๋ฒ ๊ฒช์ด ๋ดค๊ธฐ์ ํด๊ฒฐ์ ๊ธ๋ฐฉ ํ์ต๋๋ค.
visual studio code ๊ธฐ์ค์ผ๋ก ์ค๋ช
ํด ๋ณด์๋ฉด ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
๋จผ์ ํฐ๋ฏธ๋์ ์ฝ๋๋ค.
http-server๊ฐ ์๋ค๋ฉด
npm install http-server -g
์ ํค์๋๋ก http-server๋ฅผ ์ ์ญ์ผ๋ก ์ค์นํด ์ค ๋ค์
npx http-server
์ ๋ช ๋ น์ด๋ก http-server๋ฅผ ์คํ์์ผ ํด๋น ํด๋๋ฅผ ์๋ฒ์ ์ฌ๋ฆฝ๋๋ค.
http://127.0.0.1:8080
์ URI๋ก ์ ์ํด์ ์๋ฌ๊ฐ ์ฌ๋ผ์ง ๊ฒ์ ํ์ธํฉ๋๋ค.
๋ง์ฝ ์๋ฒ๊ฐ ์ฌ๋ผ๊ฐ๋ ํฌํธ๋ฅผ ๊ธฐ๋ณธ์ธ 8080์ด ์๋ ๋ค๋ฅธ ํฌํธ๋ก ์คํํ๊ณ ์ถ๋ค๋ฉด
npx http-server -p ์ํ๋ ํฌํธ๋ฒํธ
๋ก ์๋ฒ๋ฅผ ์คํํด ํด๋น ํฌํธ๋ก ์ ์ํ๋ฉด ๋ฉ๋๋ค.
๐ ์?
๊ทธ๋ฌ๋ ๋งค๋ฒ 'CORS ๋๊ฒ ์์ด์ ๊ทธ๋ ๊ณ ์๋ฒ์ ์ฌ๋ฆฌ๋ฉด ํด๊ฒฐ๋๋ค' ์ ๋๋ก ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ด๋ฒ ๊ธฐํ์ ์ ๋๋ก ํ๋ฒ ์์๋ด์ผ ๊ฒ ๋จ ์๊ฐ์ ํ์ต๋๋ค. ์ผ๋จ ์ด๋ฆฌ ์ ๋ฆฌ ๊ฒ์ํด๋ณด๋ ํต์ฌ์ SOP์์ต๋๋ค.
๐ SOP (Same Origin Policy - ๋์ผ ์ถ์ฒ ์ ์ฑ )
SOP๋ '๋์ผ ์ถ์ฒ ์ ์ฑ ' ์ ๋๋ค. ์ด๋ค ์ถ์ฒ(origin)์์ ๋ถ๋ฌ์จ ๋ฌธ์๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ค๋ฅธ ์ถ์ฒ์์ ๊ฐ์ ธ์จ ๋ฆฌ์์ค์ ์ํธ์์ฉํ๋ ๊ฒ์ ์ ํํ๋ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ ๋ฐฉ์์ ๋๋ค.
์ด ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๊ฐ์ ์ถ์ฒ๋ฅผ ๊ตฌ๋ถํ๋ ๊ธฐ์ค์ URI์ 'ํ๋กํ ์ฝ ํธ์คํธ ํฌํธ ๊ฐ ๊ฐ์๊ฐ' ์ ๋๋ค.
scheme(protocol) | host | (port) | resource |
http:// | www.example.com | (:80) | /folder/file.html |
ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ๊ฐ ๊ฐ๋ฅดํค๋ ๋ถ๋ถ์ ์์ ๊ฐ์ต๋๋ค. (ํฌํธ๋ ์ฃผ๋ก ์๋ต๋ฉ๋๋ค)
์์์ ํฌํธ๊น์ง์ ๋ถ๋ถ์ด ๊ฐ๋ค๋ฉด ๊ฐ์ ์ถ์ฒ,๋ค๋ฅด๋ฉด ๋ค๋ฅธ ์ถ์ฒ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ์ ์ฑ ์ด ๋ชจ๋ ๋ฐฉ์์ ์์ฒญ์ ์ ์ฉ ๋๋ ๊ฒ์ ์๋๋๋ค.
์๋ฅผ ๋ค์ด
- <img> ํ๊ทธ๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ ์ด๋ฏธ์ง ํ์ผ์ ๊ฐ์ ธ์ค๊ฑฐ๋
- <link> ํ๊ทธ๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ CSS๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋
- <script> ํ๊ทธ๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์ javascript๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ
- ๊ทธ ์ธ์๋ <video> <audio> <object> <embed> <applet> ํ๊ทธ
์๋ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ด ์ ์ฉ๋์ง ์์ต๋๋ค.
SOP๋ script์์ XMLHttpRequest๋ Fetch API๋ฅผ ์ฌ์ฉํด ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ์ ์ฉ๋ฉ๋๋ค.
๊ฒฐ๊ตญ CORS ์๋ฌ๋ก ๋ถ๋ฆฌ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ์ด SOP๊ฐ ์ ์ฉ๋๋ ๋ฐฉ์์ผ๋ก ๋ค๋ฅธ ์ถ์ฒ์ ์์์ ์ ๊ทผํ๋ ค ํ๊ธฐ ๋๋ฌธ์ด์๊ณ CORS๋ ์ด๋ฐ ๊ฒฝ์ฐ cross-origin HTTP ์์ฒญ์ ์คํํ์ฌ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋๋ก ํ๋ ๋งค์ปค๋์ฆ์ ๊ฐ๋ฅดํค๋ ๋ง์ด์์ต๋๋ค.
CORS๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ธธ๊ณ ๋ณธ ํฌ์คํ
์ ํต์ฌ์์ ๋ฒ์ด๋ ์์ด์ ์ฐธ๊ณ ์ฌ์ดํธ๋ง ๋จ๊น๋๋ค
Cross Origin Resource Sharing - CORS
๐คทโ๏ธ ๊ทผ๋ฐ ๊ทธ๋์ ๋ก์ปฌ์์ ์?
๊ทธ๋ฐ๋ฐ SOP์ ๊ดํด ๊ณต๋ถํ๊ณ ๋์๋ ๋ ํผ๋์ค๋ฌ์์ง๊ธฐ ์์ํ์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ ๋ถ๋ถ์
<script type="module" src="js/module.js"></script>
์ธ๋ฐ ์ ๋ถ๋ถ์ SOP์ ์๋ฐฐ๋ ๊ฒ ์์ด ๋ณด์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- XMLHttpRequest๋ Fetch API๋ฅผ ์ฌ์ฉํด ๋ฌด์ธ๊ฐ๋ฅผ ์์ฒญํ ๊ฒ๋ ์๋๊ณ
- ๋์ผ๊ฒฝ๋ก/js/module.js๋ฅผ ์์ฒญํ ๊ฒ์ด๋ ์ด๊ฑด ๋ค๋ฅธ ์ถ์ฒ์ ์์ ๊ธฐ์ค์ ๋ถํฉํ์ง๋ ์์์ผ๋๊น์.
'๋ญ์ง?'
๊ฒฐ๊ตญ ๋ ํ์ฐธ์ ๊ฒ์ํ ์ ๋ฐ์ ์์์ง๋ง ๋คํํ ๋ต์ ์ฐพ์์ต๋๋ค.
โ ์ ๋ต
โจ <script type=module>์ ํน์ฑ
๋จผ์ MDN์ javascript modules์ ๊ดํ ์ค๋ช ์ ๋ฐ๋ฅด๋ฉด ๋ฌธ์ ๊ฐ ๋ ๋ถ๋ถ๊ฐ์ด type์ module๋ก ์ค์ ํ<script> ํ๊ทธ๊ฐ ํฌํจ๋ HTML ํ์ผ์ ๋ก์ปฌ์์ ๋ก๋ํ ๊ฒฝ์ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ณด์ ์๊ตฌ์ฌํญ์ผ๋ก ์ธํด CORS ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๊ณ ํฉ๋๋ค. ๊ทธ ๋๋ฌธ์ ajax๋ก ์์ฒญํ ๊ฒ์ ์๋์๋ ๋ถ๊ตฌํ๊ณ CORS ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์ฃ .
๐ ๋ก์ปฌ์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋์ origin(์ถ์ฒ)์ null์ด๋ค
๋๋ฒ์งธ ์ง๋ฌธ์ ๋ํ ๋ต์, ์๊ณ ๋ณด๋ ๋ฐ์ํ๋ ์๋ฌ ๋ฌธ๊ตฌ์ ํํธ๊ฐ ์์์ต๋๋ค.
์ฝ๋์์ ์ ์ ์๋ฏ c:/๊ฒฝ๋ก/index.html์์ c:/๊ฒฝ๋ก/js/module.js. ์ฆ ๊ฐ์ ๊ฒฝ๋ก์ ์์์ ์์ฒญํ๋๋ฐ ์๋ฌ ๋ฉ์ธ์ง์ ๋ณด์๋ค์ํผ origin, ์ฆ ์ถ์ฒ๊ฐ null ๋ก ๋์ด์จ script์ ๋ํ ์ ๊ทผ์ด CORS ์ ์ฑ ์ ๋ฐ๋ผ ์ ํ๋์๋ค๊ณ ๋์์์ต๋๋ค. ์ ๋ง ์ถ์ฒ๊ฐ null๋ก ๋์ด๊ฐ๊ฑด์ง ํ์ธํ๊ธฐ ์ํด ๋คํธ์ํฌ ํญ์ ๋ณด๋ฉด
์ค์ ๋ก ๊ทธ๋ ๋จ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ๊ฒ์ํด๋ณด๋ ๋ธ๋ผ์ฐ์ ๋ (๋ธ๋ผ์ฐ์ ๋ณ๋ก ์ฝ๊ฐ์ ์์ดํ์ง๋ง) ์น์์ ๋ก์ปฌ ํ์ผ์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ํ๊ธฐ ์ํด ์ด๋ฐ ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค.
์ฆ c:/๊ฒฝ๋ก/index.html์์ ajax๋ก c:/๊ฒฝ๋ก/js/module.js์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๊ฑด ๋์ผ ๊ฒฝ๋ก์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๊ฒ์ด ์๋๊ณ c:/๊ฒฝ๋ก/index.html์์ null/js/module.js๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๊ฒ์ด ๋์ด CORS์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ์ฌ๋ ค ํ๋กํ ์ฝ ํธ์คํธ ํฌํธ๋ฅผ ๊ฐ๊ฒ ๋ง๋ค๋ฉด CORS ์๋ฌ๊ฐ ํด๊ฒฐ๋์๋ ๊ฒ์ด์ฃ .
์ด ์ ๋ต ์ฑํฐ๋ฅผ ๊ฐ๋จํ ์ ๋ฆฌํ์๋ฉด ์๋์ ๊ฐ์ ๊ฒ์
๋๋ค.
๐ ์ ๋ฆฌ
- <script type=module> ์ ๋ก์ปฌ์์ ์คํ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ณด์ ์๊ตฌ๋ก ์ธํด CORS ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
- ๋ก์ปฌ์์คํ ์์ ๋ก์ปฌ ํ์ผ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋๋ origin(์ถ์ฒ)์ด null๋ก ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ CORS์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๐ ์ฐธ์กฐ
MDN - Same-Origin policy
google code - browsersec - Part2.wiki - Same-origin policy
์ญ์ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ - file URI์ same-origin policy
What is CORS ( Cross-Origin Resource Sharing ) ?