보안Medium#222
CORS 설정을 보안 관점에서 어떻게 관리해야 하나요?
#보안#CORS#Origin#웹보안
답변 포인트
Origin 허용 범위와 credentials 조합를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
CORS는 허용 Origin을 명시적으로 제한해야 합니다. 인증 정보를 포함하는 요청에서 무분별한 와일드카드 허용은 위험하며 환경별 allowlist 관리가 필요합니다.
CORS는 브라우저가 다른 origin으로 요청할 때 서버가 허용 여부를 알려주는 보안 메커니즘입니다. 서버 간 통신 보안이 아니라 브라우저의 same-origin policy 예외를 관리하는 설정입니다.
핵심 헤더
HTTP
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: truecredential을 허용할 때는 Access-Control-Allow-Origin: *를 사용할 수 없고, 정확한 origin을 반환해야 합니다.
위험한 설정
JavaScript
// 위험: 모든 origin + credentials 허용과 유사한 효과
app.use(cors({ origin: true, credentials: true }));요청 Origin을 무조건 반사하면 공격 사이트도 인증된 요청을 보낼 수 있습니다.
안전한 관리
- 허용 origin을 환경별 allowlist로 관리합니다.
- 관리자/결제 API와 공개 API의 CORS 정책을 분리합니다.
- preflight 요청의 method/header를 과도하게 열지 않습니다.
- CORS는 인증/인가를 대체하지 않습니다. 서버는 토큰과 권한을 항상 검증해야 합니다.
실무 예시
JavaScript
const allowed = new Set(['https://app.example.com', 'https://admin.example.com']);
app.use(cors({
origin(origin, cb) {
if (!origin || allowed.has(origin)) return cb(null, origin);
cb(new Error('not allowed by CORS'));
},
credentials: true,
}));면접 답변 포인트
CORS는 브라우저의 cross-origin 요청 허용 정책입니다. 보안 관점에서는 wildcard 남용을 피하고, credential 허용 시 origin allowlist를 엄격히 관리하며, 인증/인가와 혼동하지 않는 것이 중요합니다.