/** * CORS 설정 * * Cross-Origin Resource Sharing 설정 * * @author TK-FB-Project * @since 2025-12-11 */ const logger = require('../utils/logger'); /** * 허용된 Origin 목록 */ const allowedOrigins = [ 'http://localhost:20000', // 웹 UI 'http://localhost:3005', // API 서버 'http://localhost:3000', // 개발 포트 'http://127.0.0.1:20000', // 로컬호스트 대체 'http://127.0.0.1:3005', 'http://127.0.0.1:3000' ]; /** * CORS 설정 옵션 */ const corsOptions = { /** * Origin 검증 함수 */ origin: function (origin, callback) { // Origin이 없는 경우 (직접 접근, Postman 등) if (!origin) { logger.debug('CORS: Origin 없음 - 허용'); return callback(null, true); } // 허용된 Origin 확인 if (allowedOrigins.includes(origin)) { logger.debug('CORS: 허용된 Origin', { origin }); return callback(null, true); } // 개발 환경에서는 모든 localhost 허용 if (process.env.NODE_ENV === 'development') { if (origin.includes('localhost') || origin.includes('127.0.0.1')) { logger.debug('CORS: 로컬호스트 허용 (개발 모드)', { origin }); return callback(null, true); } } // 로컬 네트워크 IP 자동 허용 (192.168.x.x) if (origin.match(/^http:\/\/192\.168\.\d+\.\d+(:\d+)?$/)) { logger.debug('CORS: 로컬 네트워크 IP 허용', { origin }); return callback(null, true); } // 차단 logger.warn('CORS: 차단된 Origin', { origin }); callback(new Error(`CORS 정책에 의해 차단됨: ${origin}`)); }, /** * 인증 정보 포함 허용 */ credentials: true, /** * 허용된 HTTP 메소드 */ methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], /** * 허용된 헤더 */ allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'], /** * 노출할 헤더 */ exposedHeaders: ['Content-Range', 'X-Content-Range'], /** * Preflight 요청 캐시 시간 (초) */ maxAge: 86400 // 24시간 }; module.exports = corsOptions;