Today I Learned 55 - Django / CORS

angie·2022년 11월 14일
0

Django

목록 보기
2/3
post-thumbnail

1. CORS

1) SOP (Same-Origin Policy)

  • 동일 출처 정책
  • 어떤 출처에서 불러온 문서나 스크립트가 다른 출처에서 가져온 리소스와 상호작용하는 것을 제한하는 보안 방식
  • 잠재적으로 해로울 수 있는 문서를 분리함으로써 공격받을 수 있는 경로를 줄임

출처의 정의

  • 두 URL의 프로토콜, 포트, 호스트가 모두 같아야 동일한 출처라고 한다.

URL 구조와 동일 출처

같은 출처 예시

2) CORS

교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)

  • 웹 페이지 상의 제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 구조
  • 특정 교차 도메인간 요청, 특히 Ajax 요청은 동일-출처 보안 정책에 의해 기본적으로 금지됨
  • 추가 HTTP Header를 사용하여, 특정 출처에서 실행 중인 웹 어플리케이션이 다른 출처의 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제
    • 어떤 출처에서 자신의 컨텐츠를 불러갈 수 있는지 서버에 지정할 수 있는 방법
  • 리소스가 자신의 출처와 다를 때 교차 출처 HTTP 요청을 실행
    • 만약 다른 출처의 리소스를 가져오기 위해서는 이를 제공하는 서버가 브라우저에게 다른 출처지만 접근해도 된다는 사실을 알려야 함

HTTP 응답 헤더

서버가 접근 제어 요청을 위해 보내는 HTTP 응답 헤더

Access-Control-Allow-Origin

Access-Control-Allow-Origin: <origin> | *
  • 단일 출처를 지정하여 브라우저가 해당 출처가 리소스에 접근하도록 허용
  • 자격 증명이 없는 요청의 경우 "*" 와일드 카드는 브라우저의 origin에 상관없이 모든 리소스에 접근하도록 허용

그 외

그 외 다양한 종류의 HTTP 응답 헤더에 대해서는 MDN 공식 문서 참고(링크)

2. CORS in Django

'django-cors-headers' 라이브러리를 사용한다. (라이브러리 깃헙 링크)

1) django-cors-headers

  • Django가 클라이언트의 요청에 응답할 때, CORS header를 추가하여 응답할 수 있도록 도와주는 라이브러리
  • 다른 출처에서 Django 애플리케이션에 대한 브라우저 내 요청을 허용

프로그램 요구사항

Python 3.7 to 3.11 supported.
Django 3.2 to 4.1 supported.

django에서 사용할 준비

  • 공식문서 내용 참고(링크)

1. 설치

해당 라이브러리를 설치하고 requirements.txt를 갱신한다.

$ pip install django-cors-headers
$ pip freeze > requirements.txt

2. installed apps에 등록

INSTALLED_APPS = [
    ...,
    "corsheaders",
    ...,
]

3. middleware에 추가

MIDDLEWARE = [
    ...,
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.common.CommonMiddleware",
    ...,
]
  • CorsMiddleware는 가능한 CommonMiddleware보다 먼저 정의되어야 함

4. 교차 출처 자원 공유를 허용할 도메인 등록

  • 공식 문서 내용 참고(링크)

공식 문서 내용에 따르면, 다음 세 가지 중 최소 한 가지 이상이 정의되어야 한다.

  1. CORS_ALLOWED_ORIGINS
  2. CORS_ALLOWED_ORIGIN_REGEXES
  3. CORS_ALLOW_ALL_ORIGINS
1. CORS_ALLOWED_ORIGINS : Sequence[str]

교차 출처 자원 공유를 허용하기 위해 HTTP requests를 만들 origin들의 리스트를 등록한다.

예시
# my_api/settings.py

# 특정 origin만 선택적으로 허용
CORS_ALLOWED_ORIGINS = [
    'http://localhost:8080',
]
3. CORS_ALLOW_ALL_ORIGINS: bool

true라면 모든 도메인에 대해 교차 출처 자원 공유를 허용한다. 기본값은 false이다.

예시
# my_api/settings.py

# 모든 Origin 허용
CORS_ALLOWED_ALL_ORIGINS = True
profile
better than more

0개의 댓글