개발자들이 CORS를 이해하지 못하는 이유

CORS는 웹 개발에서 가장 오해를 많이 받는 보안 도구 중 하나입니다. 많은 개발자들이 CORS가 서버를 보호한다고 생각하지만, 그렇지 않습니다.

CORS는 사용자를 보호합니다.

브라우저는 동일 출처 정책(Same-Origin Policy, SOP)을 강제합니다. 이 정책은 악성 사이트가 사용자를 대신하여 다른 사이트에 요청을 보내는 것을 차단합니다. CORS는 단순히 서버가 브라우저에게 특정 사이트에 대해서는 해당 규칙을 완화하도록 알리는 방식입니다.

Postman에서는 요청이 성공하는데 브라우저에서 실패한다면, CORS 문제가 있는 것입니다. Postman은 브라우저가 아니므로 이러한 규칙을 강제하지 않습니다.

반드시 피해야 할 흔한 실수들:

  • CORS를 유일한 보안 수단으로 사용하는 것. CORS는 인증(authentication)이 아닙니다. 여전히 토큰, 비밀번호, rate limiting이 필요합니다.
  • 와일드카드 함정. 쿠키나 자격 증명(credentials)을 전송해야 하는 경우 Access-Control-Allow-Origin: *를 사용할 수 없습니다. 반드시 정확한 도메인을 명시해야 합니다.
  • preflight 요청 무시. 브라우저는 많은 API 호출 전에 자동으로 OPTIONS 요청을 보냅니다. 서버가 OPTIONS를 차단하면 실제 요청은 실패하게 됩니다.
  • 에러 헤더 누락. API가 CORS 헤더 없이 401 또는 500 에러를 반환하면, 브라우저는 실제 에러를 숨깁니다. 대신 일반적인 CORS 메시지만 보게 됩니다.

해결 방법:

  • OPTIONS 요청 처리. 서버가 preflight 호출에 대해 200 또는 204 상태 코드를 반환하도록 설정하세요.
  • 미들웨어 사용. CORS를 미들웨어 레벨에서 설정하여 에러를 포함한 모든 응답에 적용되도록 하세요.
  • Vary 헤더 설정. 여러 출처(origin)를 동적으로 허용하는 경우, 응답에 Vary: Origin을 추가해야 합니다.
  • 적절한 도구 사용. Node.js의 경우 cors 패키지를 사용하고, Django의 경우 django-cors-headers를 사용하세요.

브라우저 확장 프로그램을 사용하여 CORS를 우회하려고 하지 마세요. 대신 서버 설정을 수정하세요.

Source: https://dev.to/onsen/why-developers-dont-understand-cors-and-how-to-fix-it-19d5

Optional learning community: https://t.me/GyaanSetuAi