Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- Proxy_pass
- HTTP
- request.path
- django
- 버블 정렬
- 정렬
- is_ajax() not working
- 클린코드-함수
- nginx
- check ajax
- reCAPTCHA V2
- render html
- queryset
- 선택 정렬
- Django Ajax
- Trre heap
- request.GET
- CleanCode
- django 시작하기
- 자료구조
- 알고리즘
- 글자 수
- 트리란
- queryset filter
- 클린코드
- 효울적
- 포맷팅
- 복수 외래키
- Djnago CSRF
- 클린 코드
Archives
- Today
- Total
Yang 코딩 공부
Django에서 ajax 사용할 때 CSRF token missing 본문
- @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에 추가해 보낼 때.
'Django > tip' 카테고리의 다른 글
Django [Tip] - request.GET[key] / request.GET.get(key) 차이점 (0) | 2022.03.31 |
---|---|
Django [Tip] - Django Template Tag 이용 글자 수 출력 길이 지정 (0) | 2022.03.29 |
django 조회수 조작 방지하기 (0) | 2021.11.08 |
django 쿼리셋 합치기 (0) | 2021.10.28 |
Django - reCAPTCHA V2 적용하기 (0) | 2021.10.01 |