Yang 코딩 공부

Django에서 ajax 사용할 때 CSRF token missing 본문

Django/tip

Django에서 ajax 사용할 때 CSRF token missing

코딩하는 Yang 2021. 11. 8. 15:48
  1. @csrf_exempt 데코레이터 사용
  2. ajax post 요청을 발생시킬 때 csrf token 생성 및 추가

데코레이터를 이용하는 방법.

'django.middleware.csrf.CsrfViewMiddleware'

장고 프로젝트 설정을 보면 위와 같ㅌ이 csrf에 관련한 미들웨어를 볼 수 있는데 이 미들웨어 때문에 csrf에 대한 보안을 강화하게 된다.

이때 @csrf_exempt 데코레이터를 사용시 csrf의 보호 기능을을 무시한다.

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

하지만 보안적으로 문제가 있어 권장하지 않는다.

JS 이용 csrf token 생성 및 주입

Ajax를 사용할 때 csrf_token을 등록해주는 코드

 

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

위 코드를 템플릿에 추가하면 됌 또는 ajax data에 직접적으로 넣는 방법이 있음. 위 코드를 사용하면 ajax 코드를 짤 때마다 삽입해주지 않아도 돼서 편했다.

단 Csrf_token이 두번 이상 겹쳐 사용 될경우 오히려 오류가 난다.

항상 겹치지 않게 주의할것.

ex)form 에서 {{csrf_token}}을 사용한 곳에서 같이 입력을 받을 경우. (댓글 수정 등)

위 코드를 사용했는데 ajax를 사용하는 코드에서 또 csrf token을 header에 추가해 보낼 때.