본문 바로가기
ETC/에러 모음

[django] 403 forbidden Error 해결하기(CSRF token)

by Guardy 2020. 12. 13.
728x90

django, CSRF token missing or incorrect, 403 forbidden, python

 

장고를 이용할 때 CSRF 문제로 인해 아래와 같이 403 forbidden Error가 발생하곤한다. 

{"detail":"CSRF Failed: CSRF token missing or incorrect."}

이때 해결 방법을 공유하고자 한다.


403은 유저가 해당 요청에 대한 권한이 없을 때 발생하는 오류이다. CSRF는 무엇일까 CSRF는 다음과 같다.

CSRF : Cross-site request forgery
CSRF는 사이트간 요정 위조. 
사이트 간 요청 위조는 웹사이트 취약점 공격의 하나이다. 
사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격을 말한다. 

하지만 유저권한이 필요없는 사이트의 경우 CSRF를 사용할 필요가 없다. 따라서 우리는 django project에서 CSRF를 Except 시켜주면 된다.

방법은 두가지 방법이 있다.

첫 번째 방법 : settings.py와 views.py 수정

#settings.py
MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.locale.LocaleMiddleware",
    "django.middleware.common.CommonMiddleware",
    #"django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.common.BrokenLinkEmailsMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]
#views.py
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt,name='dispatch')
class SavePoll(APIView):

settings.py의 csrf부분을 주석처리해주고 views.py에 다음과 같이 csrf_exempt를 넣어준다.

두 번째 방법 : settings.py만 수정

MIDDLEWARE = [
    #"django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.locale.LocaleMiddleware",
    "django.middleware.common.CommonMiddleware",
    #"django.middleware.csrf.CsrfViewMiddleware",
    #"django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.common.BrokenLinkEmailsMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

해당 세 middleware를 주석처리해주면 된다.

도움이 되셨다면 공감버튼 부탁드립니다. 감사합니다~!

728x90