JS

2. ์‹คํ–‰ํ™˜๊ฒฝ ๊ตฌ์ถ• (VS CODE)

์•ต์ฆŒ 2024. 9. 27. 16:06
๐Ÿ’ก Visual Studio Code(VS Code)์—์„œ ์›น ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•  ๋•Œ, "Live Server" ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ •์ ์ธ ์›น ํŽ˜์ด์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉฐ, ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‰ฝ๊ฒŒ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

Live Server ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋ž€?

Live Server๋Š” VS Code์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ค‘ ํ•˜๋‚˜๋กœ, ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ HTML, CSS, JavaScript๋กœ ๊ตฌ์„ฑ๋œ ์›น ํŽ˜์ด์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ƒˆ๋กœ ๊ณ ์นจํ•˜์—ฌ ๊ฐœ๋ฐœ ์ค‘์ธ ์›น ํŽ˜์ด์ง€์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ฐ”๋กœ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Live Server์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ:
    • Live Server๋Š” HTML ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์นจ๋˜์–ด ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ ๋•๋ถ„์— ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„:
    • Live Server๋Š” ๋กœ์ปฌ์—์„œ ์›น ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณต ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์›น ํŽ˜์ด์ง€๋ฅผ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์•„๋‹Œ HTTP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์ ‘์†ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ์ค‘์— CORS(Cross-Origin Resource Sharing) ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ์‹ค์ œ ์„œ๋ฒ„ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ € ๋™๊ธฐํ™”:
    • Live Server๋Š” ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์‹œ์— ์—ด๋ ค์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋™๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๋กฌ๊ณผ ํŒŒ์ด์–ดํญ์Šค์—์„œ ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ์—ด์–ด๋‘์—ˆ์„ ๋•Œ, ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•จ:
    • VS Code์—์„œ Live Server๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹จ์ˆœํžˆ HTML ํŒŒ์ผ์„ ์—ด๊ณ  ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํ›„ "Open with Live Server"๋ฅผ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ž๋™์œผ๋กœ ๋กœ์ปฌ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ํŽ˜์ด์ง€๋ฅผ ์—ด์–ด์ค๋‹ˆ๋‹ค.

์‚ฌ์ „ ๊ธฐ๋ฐ˜ ์ง€์‹ ํ™•์ธ

 

๐Ÿ’ก CORS(Cross-Origin Resource Sharing) ๋ฌธ์ œ๋Š” ์›น ๊ฐœ๋ฐœ์—์„œ ํ”ํžˆ ๊ฒช๋Š” ๋ณด์•ˆ ์ด์Šˆ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ์ž์‹ ์˜ ๋„๋ฉ”์ธ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ, ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณด์•ˆ ์ •์ฑ… ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. CORS๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์–ด๋–ค ์š”์ฒญ์ด ํ—ˆ์šฉ๋˜๊ณ , ์–ด๋–ค ์š”์ฒญ์ด ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

CORS ๋ฌธ์ œ์˜ ๊ฐœ๋…

1. ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ… (Same-Origin Policy)

  • ์›น ๋ธŒ๋ผ์šฐ์ €์—๋Š” "๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…(Same-Origin Policy)"์ด๋ผ๋Š” ๋ณด์•ˆ ์ •์ฑ…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ์ •์ฑ…์€ ์›น ํŽ˜์ด์ง€๊ฐ€ ์ž์‹ ์ด ๋กœ๋“œ๋œ ๋„๋ฉ”์ธ(์ถœ์ฒ˜) ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ(์ถœ์ฒ˜)์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์ผ ์ถœ์ฒ˜๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค:
    • ํ”„๋กœํ† ์ฝœ (์˜ˆ: http, https)
    • ํ˜ธ์ŠคํŠธ (์˜ˆ: example.com)
    • ํฌํŠธ (์˜ˆ: 80, 443)
  • ์˜ˆ๋ฅผ ๋“ค์–ด, http://example.com์—์„œ ๋กœ๋“œ๋œ ์›น ํŽ˜์ด์ง€๋Š” https://example.com ๋˜๋Š” http://api.example.com:8080๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ถœ์ฒ˜์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2. ๊ต์ฐจ ์ถœ์ฒ˜ ์š”์ฒญ (Cross-Origin Request)

  • ๋งŒ์•ฝ ์›น ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ API ํ˜ธ์ถœ์ด๋‚˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ํ•˜๊ณ ์ž ํ•  ๋•Œ(์˜ˆ: http://example.com์—์„œ http://api.anotherdomain.com์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ๊ฒฝ์šฐ), ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ "๊ต์ฐจ ์ถœ์ฒ˜ ์š”์ฒญ(Cross-Origin Request)"์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์›น ํŽ˜์ด์ง€๊ฐ€ JavaScript๋กœ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— ์žˆ์„ ๊ฒฝ์šฐ CORS ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

// Example of a fetch request that may trigger CORS issue
fetch('http://api.anotherdomain.com/data')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));

 

์œ„์˜ ์ฝ”๋“œ์—์„œ http://api.anotherdomain.com์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์— ์˜ํ•ด ์ด ์š”์ฒญ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CORS ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

CORS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด, ์„œ๋ฒ„ ์ธก์—์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‘๋‹ต ํ—ค๋”์— ์ ์ ˆํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„๋Š” Access-Control-Allow-Origin ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

1. Access-Control-Allow-Origin ํ—ค๋”

  • ์ด ํ—ค๋”๋Š” ์„œ๋ฒ„๊ฐ€ ์–ด๋–ค ์ถœ์ฒ˜์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ• ์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:
    • Access-Control-Allow-Origin: * : ๋ชจ๋“  ๋„๋ฉ”์ธ์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Access-Control-Allow-Origin: <http://example.com> : ํŠน์ • ๋„๋ฉ”์ธ(http://example.com)์—์„œ์˜ ์š”์ฒญ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

2. Preflight ์š”์ฒญ

  • ์ผ๋ถ€ ๊ฒฝ์šฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” ์‹ค์ œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ์„œ๋ฒ„์— "Preflight ์š”์ฒญ"์„ ๋ณด๋‚ด CORS ๊ทœ์น™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” OPTIONS ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋Š” Access-Control-Allow-Methods, Access-Control-Allow-Headers์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ํ—ค๋”๋ฅผ ์‘๋‹ต์— ํฌํ•จ์‹œ์ผœ ์–ด๋–ค ์š”์ฒญ ๋ฉ”์„œ๋“œ์™€ ํ—ค๋”๊ฐ€ ํ—ˆ์šฉ๋˜๋Š”์ง€ ๋ธŒ๋ผ์šฐ์ €์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type

 

 

์ด์™€ ๊ฐ™์ด ์„ค์ •๋œ ์„œ๋ฒ„๋Š” http://example.com์—์„œ ์˜ค๋Š” GET ๋ฐ POST ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋„๋ฉ”์ธ์—์„œ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

CORS ๋ฌธ์ œ๋Š” ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์„œ๋ฒ„ ์ธก์—์„œ CORS ์ •์ฑ…์„ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ด ์ •์ฑ…์„ ์ดํ•ดํ•˜๊ณ , ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์กฐ์ •ํ•จ์œผ๋กœ์จ CORS ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์•ˆ์ „ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.