이 CORS 실수는 당신의 API를 노출시킵니다 (어디서나 보입니다)

발행: (2025년 12월 27일 오후 06:40 GMT+9)
2 min read
원문: Dev.to

Source: Dev.to

Problem

많은 Cloudflare Workers(및 기타 서버리스 함수)에서 흔히 볼 수 있는 패턴은 다음과 같습니다:

headers.set('Access-Control-Allow-Origin', '*');
headers.set('Access-Control-Allow-Credentials', 'true');

겉보기엔 무해해 보이지만, 심각한 보안 취약점을 만들게 됩니다.

Why it’s a security hole

Access-Control-Allow-Origin* 로 설정하고 또한 Access-Control-Allow-Credentialstrue 로 설정하면, 브라우저에 다음과 같이 말하는 것입니다:

“어떤 웹사이트든 내 API에 인증된 요청을 할 수 있도록 허용한다.”

Consequences

  • 악의적인 사이트가 사용자 데이터를 읽을 수 있습니다.
  • 로그인된 사용자를 대신해 요청을 보낼 수 있습니다.
  • 세션 토큰과 쿠키가 탈취될 수 있습니다.

Fixes

Option 1: Use specific origins

const allowedOrigins = [
  'https://yourdomain.com',
  'https://app.yourdomain.com'
];
const origin = request.headers.get('Origin');

if (allowedOrigins.includes(origin)) {
  headers.set('Access-Control-Allow-Origin', origin);
  headers.set('Access-Control-Allow-Credentials', 'true');
}

목록에 있는 오리진만 인증된 요청을 보낼 수 있도록 허용합니다.

Option 2: Omit credentials

API가 쿠키나 기타 인증 헤더를 필요로 하지 않는다면, 인증 헤더를 완전히 제거합니다:

headers.set('Access-Control-Allow-Origin', '*');
// No Access-Control-Allow-Credentials header

Bottom line

Access-Control-Allow-Origin에 와일드카드(*)를 사용하면서 Access-Control-Allow-Credentials를 함께 사용하지 마세요. 특정 오리진을 지정하거나 또는 인증을 사용하지 않는 방법 중 하나를 선택하면 됩니다. 이 간단한 변경만으로도 널리 퍼진 CORS 보안 실수를 방지할 수 있습니다.

Back to Blog

관련 글

더 보기 »