2. ์คํํ๊ฒฝ ๊ตฌ์ถ (VS CODE)
๐ก 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 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์์ ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.