-
๋ก์ปฌ์์ CORS policy ๊ด๋ จ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ด์Knowledge/Web 2023. 7. 4. 14:33๋ฐ์ํ
๐ ๋ฐ๋จ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CORS</title> </head> <body> <script type="module" src="js/module.js"></script> </body> </html> ์์ ๊ฐ์ 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 ) ?๋ฐ์ํ'Knowledge > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HTTP์ HTTPS (0) 2019.08.06 ์ธํฐ๋ท ์ฃผ์์ ์๋ฏธ ( URL / URI ) (0) 2019.08.03