โ† ๋ชฉ๋ก

CORS(Cross-Origin Resource Sharing) ์ดํ•ดํ•˜๊ธฐ ๐ŸŒ

์ž‘์„ฑ: 2024๋…„ 09์›” 11์ผ์ฝ๊ธฐ: ์•ฝ 3๋ถ„

์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‚ ์”จ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์˜ 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 ์„ค์ •์€ ์„œ๋ฒ„ ์ธก์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.