이 CORS 실수는 당신의 API를 노출시킵니다 (어디서나 보입니다)
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-Credentials를 true 로 설정하면, 브라우저에 다음과 같이 말하는 것입니다:
“어떤 웹사이트든 내 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 보안 실수를 방지할 수 있습니다.