본문 바로가기

Django에서 CORS 설정으로 보안 강화하기: 상세 가이드

_Big 2025. 5. 18.
반응형

django 로고 이미지


크로스 오리진 리소스 공유(CORS)는 현대 웹 애플리케이션 보안에서 매우 중요한 요소입니다. 프론트엔드가 다른 도메인에서 API를 호출하는 구조(예: React 앱이 Django API를 호출)를 사용하는 경우가 많아지면서, CORS 설정은 허용된 교차 출처 통신을 가능하게 하면서도 불법적인 접근은 차단하는 핵심적인 역할을 합니다.

이 글에서는 CORS가 무엇인지, 왜 중요한지, Django에서 django-cors-headers 패키지를 사용해 올바르게 설정하는 방법과 API를 안전하게 유지하기 위한 베스트 프랙티스를 상세히 설명합니다.

서론: CORS란 무엇이며 왜 중요한가?

CORS는 브라우저에 내장된 보안 기능으로, 한 도메인에서 실행 중인 웹 애플리케이션이 다른 도메인의 리소스에 접근하는 것을 제한합니다. 기본적으로 브라우저는 보안을 위해 이러한 요청을 차단합니다.

예를 들어, 프론트엔드가 https://frontend.example.com에서 제공되고, 백엔드 API가 https://api.example.com에 있을 경우, 브라우저는 프론트엔드에서 API로의 요청을 "교차 출처 요청"으로 간주하며, 서버에서 명시적으로 허용하지 않으면 요청을 거부합니다.

이때 필요한 것이 바로 CORS 헤더입니다. 백엔드는 어떤 도메인의 요청을 허용할지를 응답 헤더에 명시해야 합니다.

1. django-cors-headers 설치 및 설정

pip install django-cors-headers

settings.pyINSTALLED_APPS'corsheaders'를 추가하세요:

INSTALLED_APPS = [
    'corsheaders',
    ...
]

그리고 MIDDLEWARE의 가장 위쪽에 CorsMiddleware를 추가합니다:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

 

2. 특정 출처(origin)만 허용하기

CORS_ALLOWED_ORIGINS = [
    "https://frontend.example.com",
    "https://admin.example.com",
]

이렇게 하면 명시한 도메인만 Django API에 접근할 수 있고, 나머지는 브라우저에서 자동으로 차단됩니다.

 

3. 정규 표현식으로 출처 허용 (선택 사항)

CORS_ALLOWED_ORIGIN_REGEXES = [
    r"^https://.*\.example\.com$",
]

정규식 사용 시 허용 범위가 넓어질 수 있으므로 주의 깊게 작성해야 합니다.

 

4. 인증 요청을 위한 credentials 설정

CORS_ALLOW_CREDENTIALS = True

프론트엔드 요청에서는 credentials: 'include' 옵션을 설정해야 합니다.

주의: CORS_ALLOW_CREDENTIALS는 와일드카드 *와 함께 사용할 수 없습니다.

 

5. 허용할 메서드 및 헤더 지정

CORS_ALLOW_METHODS = [
    "DELETE",
    "GET",
    "OPTIONS",
    "PATCH",
    "POST",
    "PUT",
]

CORS_ALLOW_HEADERS = [
    "accept",
    "authorization",
    "content-type",
    "origin",
    "x-csrftoken",
    "x-requested-with",
]

 

6. CORS 오류 디버깅 팁

브라우저 콘솔 오류:

Access to fetch at 'https://api.example.com' from origin 'https://frontend.example.com' has been blocked by CORS policy

확인할 사항:

  • 도메인이 CORS_ALLOWED_ORIGINS에 포함되었는가?
  • 쿠키 전송 시 CORS_ALLOW_CREDENTIALS가 설정되었는가?
  • CorsMiddlewareMIDDLEWARE의 최상단에 있는가?

 

7. 운영 환경에서의 보안 베스트 프랙티스

  • 와일드카드 "*" 사용 금지: 퍼블릭 API가 아니라면 위험
  • 허용된 도메인 주기적 검토
  • 인증/권한 시스템과 함께 사용
  • HTTPS 전면 적용

 

마치며

CORS는 종종 간과되지만 웹 API 보안에서 핵심적인 요소입니다. Django에서는 django-cors-headers 패키지를 통해 CORS를 간단하면서도 강력하게 제어할 수 있습니다.

CORS의 작동 원리를 이해하고, 상황에 맞는 설정을 적용함으로써, 사용자 친화적이면서도 안전한 API를 구축할 수 있습니다.

여러분의 Django 프로젝트에서 CORS 설정에 어려움을 겪고 계신가요? 댓글로 질문이나 경험을 공유해 주세요—함께 해결책을 찾아드리겠습니다!

 

 

Django 모델링: 데이터베이스 설계의 핵심

강력한 웹 애플리케이션은 모두 잘 구조화된 데이터베이스 위에 구축됩니다. Django 세계에서는 데이터를 제대로 모델링하는 것이 모든 것의 출발점입니다—사용자 인터랙션부터 백엔드 처리까

bigadmin.org

 

반응형

댓글