들어가기

Django 에서는 기본적으로 CSRF 토큰을 이용해 CSRF공격을 방지한다.

CSRF 공격이란?
CSRF 공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로, 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만드는 공격

Django Template

<form>
  {% csrf_token %}
  <input type="text" name="text"/>
  <input type="submit" value="확인"/>
</form>

Django의 자체적인 템플릿에서는 저렇제 {% csrf_token %}을 Form 안에 넣는 것만으로 토큰을 주고 받는 식으로 쉽게 해결이 되었다

클라이언트에서 해당 페이지를 접속하게 되면 Django 에서 자동으로 csrf_token을 클라이언트로 보내어 cookie에 저장시키고, POST로 전송할 때 cookie의 csrf_token 이 함께 전송되어 인증하는 방식이다

하지만 Django 템플릿을 사용하지 않고 React Client나 서버를 따로두고 통신을 할경우에는 저 token을 사용할 수 없었다...(정확히는 어떻게 사용하는지 못찾았다...)

그래서 결국 난 비활성화를 시키기로 했다

CSRF_TOKEN 비활성화

비활성화를 시키는 방법으로는 두가지가 있다

1. 해당 view에 만 비활성화

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def login(request):
  ...

이처럼 @csrf_exempt 데코레이션을 view 함수에 붙여서 해당 view만 csrf 보안에서 면제하는 방법이다

2. 프로젝트 전체 비활성화

기본적으로 Django에서 CSRF 에 대한 보안은 CsrfViewMiddleware 미들웨어를 통해 실행된다. settings.py에 가서 이 미들웨어를 지워주면 프로젝트 전체에서 csrf 검사를 하지 않을 것이다

settings.py

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

위처럼 주석처리든 삭제든 하면 된다