๐ CORS ์ ์ฑ , ๋ชจ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ ๊ผญ ์์์ผ ํ ๊ฒ
Source: Dev.to

CORS๋ ๋ฌด์์ธ๊ฐ?
CORS๋ ํ ์ถ์ฒ(๋๋ฉ์ธ)์ ๋ฆฌ์์ค๊ฐ ๋ค๋ฅธ ์ถ์ฒ์ ์ํด ์ด๋ป๊ฒ ์ ๊ทผ๋ ์ ์๋์ง๋ฅผ ์ ์ดํ๋ ๋ธ๋ผ์ฐ์ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
Important: CORS๋ ๋ธ๋ผ์ฐ์ ์ ์ํด ๊ฐ์ ์ ์ฉ๋์ง๋ง, ์ค์ ์ ๋ฐฑ์๋์์ ํฉ๋๋ค.
๊ฐ์ฅ ํํ CORS ์ค์
Access-Control-Allow-Origin: *
์ด ํค๋๋ ๋ชจ๋ ์น์ฌ์ดํธ๊ฐ ์ฌ๋ฌ๋ถ์ API๋ฅผ ํธ์ถํ ์ ์๊ฒ ํฉ๋๋ค. API๊ฐ ์ฟ ํค, ํ ํฐ, ์ธ์ ๋ฑ์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ ์ฌ๊ฐํ ๋ณด์ ์ํ์ด ๋ฉ๋๋ค.
์์ ํ CORS ์ค์ ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
1๏ธโฃ ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ ํ์ฉ ๋ฆฌ์คํธ ์ฌ์ฉ
์๋ ค์ง ๋๋ฉ์ธ๋ง ํ์ฉํฉ๋๋ค:
const allowedOrigins = [
'https://app.example.com',
'https://admin.example.com'
];
2๏ธโฃ ์๊ฒฉ ์ฆ๋ช ๊ณผ ํจ๊ป ์์ผ๋์นด๋ ์ฌ์ฉ ๊ธ์ง
์ฟ ํค, ํค๋์ ํฌํจ๋ JWT, ์ธ์ ๋ฑ์ ์ฌ์ฉํ ๋๋ ์ ํํ ์ถ์ฒ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Credentials๊ฐ true์ผ ๊ฒฝ์ฐ *๋ ํ์ฉ๋์ง ์์ต๋๋ค.
3๏ธโฃ ํ์ฉํ HTTP ๋ฉ์๋ ์ ํ
API๊ฐ ์ค์ ๋ก ํ์๋ก ํ๋ ๋ฉ์๋๋ง ํ์ฉํฉ๋๋ค:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
๋ถํ์ํ๊ฒ PATCH๋ OPTIONS์ ๊ฐ์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ์๋๋ฅผ ๋
ธ์ถํ์ง ๋ง์ธ์.
4๏ธโฃ ํ์ฉ ํค๋ ์ ํ
์์ฒญ ํค๋ ์ค ํ์ฉํ ํญ๋ชฉ์ ๋ช ์ํฉ๋๋ค:
Access-Control-Allow-Headers: Content-Type, Authorization
5๏ธโฃ ํ๋ฆฌํ๋ผ์ดํธ(OPTIONS) ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ
๋ธ๋ผ์ฐ์ ๋ ํน์ API ํธ์ถ ์ ์ OPTIONS ์์ฒญ์ ๋ณด๋
๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก:
- ๋น ๋ฅด๊ฒ ์๋ตํฉ๋๋ค(์:
204 No Content). - ํ๋ฆฌํ๋ผ์ดํธ ์๋ต์ ์ธ์ฆ์ ์๊ตฌํ์ง ์์ต๋๋ค.
- ์ ์ ํ CORS ํค๋๋ฅผ ๋ฐํํฉ๋๋ค.
6๏ธโฃ ํ๊ฒฝ๋ณ CORS ๊ท์น
| ํ๊ฒฝ | ์ ์ฑ |
|---|---|
| Development | localhost ํ์ฉ |
| Staging | ํ ์คํธ ๋๋ฉ์ธ ํ์ฉ |
| Production | ์๊ฒฉํ ํ์ฉ ๋ฆฌ์คํธ ์ ์ฉ |
์ด ์ ๊ทผ๋ฒ์ ๊ฐ๋ฐ์ ํธ๋ฆฌํ๊ฒ ํ๋ฉด์๋ ํ๋ก๋์ ์์๋ ๋ณด์์ ์ ์งํฉ๋๋ค.
7๏ธโฃ CORS๋ฅผ ๋ณด์ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ค์ธํ์ง ๋ง ๊ฒ
CORS๋ ๋ค์์ ๋์ฒดํ์ง ์์ต๋๋ค:
- ์ธ์ฆ
- ์ธ๊ฐ
- ์๋ ์ ํ
- ์ ๋ ฅ ๊ฒ์ฆ
๊ณต๊ฒฉ์๋ ์ฌ์ ํ Postman์ด๋ curl ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด API๋ฅผ ์ง์ ํธ์ถํ ์ ์์ต๋๋ค.
์์: ์์ ํ Node.js CORS ์ค์
const cors = require('cors');
const express = require('express');
const app = express();
app.use(cors({
origin: ['https://app.example.com'],
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true,
maxAge: 86400 // seconds
}));
๋ฉด์ ํ
Q: CORS๋ ํ๋ก ํธ์๋ ๋ณด์ ๊ธฐ๋ฅ์ธ๊ฐ์, ๋ฐฑ์๋ ๋ณด์ ๊ธฐ๋ฅ์ธ๊ฐ์?
A: CORS๋ ๋ธ๋ผ์ฐ์ ์ ์ํด ๊ฐ์ ์ ์ฉ๋์ง๋ง, ์ค์ ์ ๋ฐฑ์๋์์ ์ ์ดํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ ์๊ฐ
ํ๋ฅญํ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋:
- ์ต์ ๊ถํ ์์น์ ๋ง๋ CORS ์ค์ ์ ์ฌ์ฉํฉ๋๋ค.
- ํ๋ก๋์ ์์๋ ์์ผ๋์นด๋๋ฅผ ํผํฉ๋๋ค.
- ํ๊ฒฝ๋ณ ์ค์ ์ ๊ตฌ๋ถํฉ๋๋ค.
- CORS๊ฐ ์ค์ ๋ณด์ ์ ์ด๋ฅผ ๋์ฒดํ ์ ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ CORS ์ค์ ์ ์ ๋ฌธ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ ์ฑ์๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.