Django/tip
Django에서 ajax 사용할 때 CSRF token missing
코딩하는 Yang
2021. 11. 8. 15:48
- @csrf_exempt 데코레이터 사용
- 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에 추가해 보낼 때.