Express.js에서 CORS 문제를 해결하는 방법: 완벽 가이드
🤖 AI 추천
Express.js 기반의 웹 애플리케이션 개발자, 특히 프론트엔드와 백엔드를 분리하여 개발하는 경우 CORS 문제에 직면했을 때 해결 방법을 찾고 싶은 개발자에게 이 콘텐츠를 추천합니다. 주니어 개발자부터 시니어 개발자까지 모두에게 유용한 실용적인 가이드입니다.
🔖 주요 키워드
핵심 기술
Express.js 환경에서 브라우저 보안 기능인 CORS(Cross-Origin Resource Sharing) 정책으로 인해 발생하는 요청 차단 문제를 이해하고, cors
미들웨어를 사용하여 이를 효과적으로 해결하는 방법을 설명합니다.
기술적 세부사항
- CORS 정의: 서로 다른 출처(도메인, 프로토콜, 포트) 간의 리소스 공유를 제어하는 브라우저 보안 기능입니다.
- 발생 원인: 프론트엔드가 다른 도메인의 API에 접근할 때 브라우저가 기본적으로 차단합니다. (예: 프론트엔드
http://localhost:3000
vs APIhttp://localhost:5000
) - 에러 메시지: 브라우저 콘솔에서 "Access to fetch at '...' from origin '...' has been blocked by CORS policy." 형태로 나타납니다.
-
Express.js 해결책:
cors
npm 패키지를 설치하고 Express 애플리케이션에 미들웨어로 등록합니다.
bash npm install cors
```javascript
import cors from 'cors';
import express from 'express';
const app = express();app.use(cors()); // 모든 경로에 대해 CORS 허용
app.listen(5000, () => {
console.log('Server running on port 5000');
});
* **특정 출처 허용**: `corsOptions` 객체를 통해 특정 출처(`origin`), 허용 메서드(`methods`), 쿠키/헤더 허용(`credentials`) 등을 설정할 수 있습니다.
javascript
const corsOptions = {
origin: 'http://localhost:3000', // 특정 출처만 허용
methods: ['GET', 'POST'], // 허용할 HTTP 메서드
credentials: true // 쿠키, 인증 헤더 허용
};
app.use(cors(corsOptions));
* **동적 출처 제어**: 함수를 사용하여 동적으로 허용할 출처를 결정할 수 있습니다.
javascript
const corsOptions = {
origin: function (origin, callback) {
const allowedOrigins = ['http://localhost:3000', 'http://localhost:3001'];
if (!origin || allowedOrigins.includes(origin)) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
}
};
app.use(cors(corsOptions));
* **Preflight Request 처리**: `PUT`, `DELETE` 또는 커스텀 헤더를 포함하는 요청 시 브라우저가 보내는 `OPTIONS` 사전 요청을 처리해야 합니다.
javascript
app.options('', cors()); // 모든 경로에 대한 OPTIONS 요청 처리
```
* CORS 설정 요약*: 모든 출처 허용, 단일 출처 허용, 다중 출처 허용(함수 사용), Preflight 요청 처리 방법을 표로 정리합니다.
개발 임팩트
cors
미들웨어를 사용하면 프론트엔드와 백엔드 간의 원활한 API 통신을 보장하고, 개발 생산성을 향상시킬 수 있습니다. 또한, 보안 설정을 통해 의도하지 않은 도메인으로부터 API를 보호하고, 쿠키 및 커스텀 헤더를 통한 인증 메커니즘을 지원할 수 있습니다.