Knowledge/Web

๋กœ์ปฌ์—์„œ CORS policy ๊ด€๋ จ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ 

TakeKnowledge 2023. 7. 4. 14:33
๋ฐ˜์‘ํ˜•

 

๐Ÿš€ ๋ฐœ๋‹จ

์œ„์™€ ๊ฐ™์€ 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์— ์œ„๋ฐฐ๋  ๊ฒŒ ์—†์–ด ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  1. XMLHttpRequest๋‚˜ Fetch API๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์š”์ฒญํ•œ ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ 
  2. ๋™์ผ๊ฒฝ๋กœ/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 ์—๋Ÿฌ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋˜ ๊ฒƒ์ด์ฃ .
์ด ์ •๋‹ต ์ฑ•ํ„ฐ๋ฅผ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ“ƒ ์ •๋ฆฌ

  1. <script type=module> ์€ ๋กœ์ปฌ์—์„œ ์‹คํ–‰์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ ๋ณด์•ˆ ์š”๊ตฌ๋กœ ์ธํ•ด CORS ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
  2. ๋กœ์ปฌ์‹œ์Šคํ…œ์—์„œ ๋กœ์ปฌ ํŒŒ์ผ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ๋Š” 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 ) ?

๋ฐ˜์‘ํ˜•