CORS(Cross-Origin Resource Sharing) ์ดํดํ๊ธฐ ๐
์น ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด, ์ฌ๋ฌ๋ถ์ ์น์ฌ์ดํธ๊ฐ ๋ค๋ฅธ ์ฌ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ๋ถ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ์จ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ค๋ฅธ ์ฌ์ดํธ์ API๋ฅผ ํธ์ถํ ์ ์์ฃ . ์ด๋ด ๋ CORS, ์ฆ Cross-Origin Resource Sharing์ ๊ฐ๋ ์ด ์ค์ํด์ง๋๋ค.
CORS๋ ๋ฌด์์ธ๊ฐ์?
๊ฐ๋จํ ๋งํด์, CORS๋ ์น ํ์ด์ง๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ฒ ์์ฒญํ ์ ์๋๋ก ํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ์น ๋ธ๋ผ์ฐ์ ๋ ๋ณด์์์ ์ด์ ๋ก ์คํฌ๋ฆฝํธ์์ ์์๋ ๋ค๋ฅธ ๋๋ฉ์ธ(์ถ์ฒ)์ผ๋ก์ HTTP ์์ฒญ์ ์ ํํฉ๋๋ค. ์ด๋ฅผ '๋์ผ ์ถ์ฒ ์ ์ฑ (Same-Origin Policy)'์ด๋ผ๊ณ ํฉ๋๋ค. ํ์ง๋ง CORS๋ฅผ ์ฌ์ฉํ๋ฉด, ์๋ฒ๋ ํน์ ์ถ์ฒ์์ ์์ ์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.
์์๋ก CORS ์ดํดํ๊ธฐ
์๋ฅผ ๋ค์ด, ์ฌ๋ฌ๋ถ์ ์น์ฌ์ดํธ๊ฐ https://your-website.com
์ด๊ณ , ๋ ์จ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ API๊ฐ https://weather-api.com
์ ์์ ๋, ์ฌ๋ฌ๋ถ์ ์ฌ์ดํธ์์ ์ด API๋ฅผ ํธ์ถํ๋ ค๊ณ ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์ฐจ๋จํฉ๋๋ค. ํ์ง๋ง https://weather-api.com
์๋ฒ๊ฐ ์ ์ ํ CORS ํค๋๋ฅผ ํฌํจํ์ฌ ์๋ตํ๋ฉด, ์ฌ๋ฌ๋ถ์ ์น์ฌ์ดํธ๋ ์ด API๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ฐ์ ์ ์์ต๋๋ค.
๊ฐ๋จํ ์ฝ๋ ์ค๋ํซ
์น ๊ฐ๋ฐ์๋ก์, ์ฌ๋ฌ๋ถ์ด ์๋ฒ ์ธก์์ CORS๋ฅผ ์ค์ ํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Node.js์ Express๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค:
const express = require('express');
const cors = require('cors');
const app = express();
// ๋ชจ๋ ๋๋ฉ์ธ์์์ ์์ฒญ์ ํ์ฉ
app.use(cors());
// ํน์ ๋๋ฉ์ธ์์์ ์์ฒญ๋ง ํ์ฉ
app.use(cors({
origin: 'https://your-website.com'
}));
app.get('/data', (req, res) => {
res.json({ message: '์ด ๋ฐ์ดํฐ๋ CORS ์ ์ฑ
์ ํตํด ์์ ํ๊ฒ ์ ๋ฌ๋ฉ๋๋ค.' });
});
app.listen(3000, () => console.log('์๋ฒ๊ฐ 3000๋ฒ ํฌํธ์์ ์คํ ์ค์
๋๋ค.'));
์ด ์ฝ๋ ์ค๋ํซ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ถ์ฒ์์์ ์์ฒญ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ํน์ ์ถ์ฒ์์๋ง ์์ฒญ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ง๋ฌด๋ฆฌ
CORS๋ ์น ๊ฐ๋ฐ์์ ์ค์ํ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑํ๋ฉด ๋ค์ํ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ฒ ํ์ฉํ ์ ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค. ๊ธฐ์ตํ์ธ์, CORS ์ค์ ์ ์๋ฒ ์ธก์์ ์ด๋ฃจ์ด์ง๋ฉฐ, ์ฌ๋ฌ๋ถ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ฑ ์ ์ฐํ๊ณ ์์ ํ๊ฒ ๋ง๋ค์ด ์ค ์ ์์ต๋๋ค.