쿠키 속에 들어있는 장고노코토큰
POST ajax 요청을 하기 위해 테스트 중인데 crfoken이 없어서 403을 받았습니다.문서를 따라갔지만 여전히 작동하지 않고 crfotoken이라는 쿠키가 비어있는 것을 발견했습니다.$.cookie("csrftoken")
null을 반환합니다.
를 이유와 수 ?csrftoken
쿠키로?
HTML/JS 코드에 crf 토큰을 얻는 방법과 미들웨어에 대한 설정을 코드로 제공해야 한다고 생각합니다.
그 를 해 보셔야 .django.middleware.csrf.CsrfViewMiddleware
켭니다.
에서 를 request.META.get('CSRF_COOKIE')
토큰을 얻기 위해서 입니다.
에서 이 - -{% csrf_token %}
를 장고다로 합니다.CsrfViewMiddleware.process_response
가 이 다른 방법으로 토큰 값을 얻으면 장고는 이 깃발을 놓칩니다.따라서 토큰은 생성되지만 해당 쿠키는 설정하지 않습니다.
코드상으로 두 가지 해결책이 있습니다.JS 코드로 템플릿을 생성하는 데 사용되는 보기에 추가해야 합니다.
1.Django에게 CSRF 쿠키를 강제로 설정할 수 있습니다.
# Force updating CSRF cookie
request.META["CSRF_COOKIE_USED"] = True
2.장고는 전화를 걸면 CSRF_COOKIE_USED를 자동으로 설정합니다.get_token
from django.middleware.csrf import get_token
# don't use direct access to request.META.get('CSRF_COOKIE')
# in this case django will NOT send a CSRF cookie. Use get_token function
csrf_token = get_token(request)
이 솔루션은 각각 별개로 작동해야 합니다.사용할 것을 권합니다.get_token
뷰 데코레이터(장고 1.4 이후 사용 가능)를 사용할 수 있습니다.이것은 설정할 것입니다.csrftoken
도를 .{{ csrf_token }}
템플릿 태그.
같은 문제($.cookie('csrftoken'))가 '정의되지 않음'을 반환했습니다.
그 문제는 내 장고 구성에 있었고, 나는 다음 줄에 대해 언급했고, 그것은 작동합니다.
#CSRF_COOKIE_HTTPONLY = True # Prevent client-side JavaScript access to the CSRF cookie
우선, 애플리케이션을 설계하는 경우 쿠키가 아닌 헤더 또는 POST 요청에서 crf 토큰을 사용하는 것이 항상 좋습니다.
- 모든 양식은 HTML에 동적으로 값을 추가해야 합니다.모든 AJAX POST에는 값도 포함되어야 합니다.
- 쿠키는 모든 요청(즉, CSRF 프로세스에 관련되지 않은 이미지, CSS, JS 등에 대한 모든 GET)에 대해 요청 크기가 증가할 때마다 제출됩니다.
django에서 쿠키를 강제로 사용하고 싶다면 언제든지 다음을 수행할 수 있습니다.
request.META["CSRF_COOKIE_USED"] = True
프로젝트에서 {% crf_token %}을(를) 사용하지 않는 경우.[document][1]에 따르면, 당신은 다른 작업을 할 필요가 없고 간단한 자바스크립트 코드를 작성해야 합니다.사실은 사실이 아닙니다.당신이 넣어야 합니다."request.META['CSRF_COOKIE_USED'] = True"
모든 뷰에 줄을 그거나 적절한 데코레이터를 적습니다.
o_c의 답변에 대해 확장하기: 코멘트를 달음으로써CSRF_COOKIE_HTTPONLY
line, crf_token 값은 (Firefox firebug에서) 더 이상 '정의되지 않음'이 아니며 'real' 값(예: 'qGuFe2Q7...' 등)으로 표시됩니다.
Ajax 요청이 더 이상 다음과 함께 거부되지 않습니다.403 Forbidden
오류가 발생하고 올바르게 실행됩니다(AJAX 헤더에 crf_token이 설정되어 있는 경우).
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
언급URL : https://stackoverflow.com/questions/13412653/django-no-csrftoken-in-cookie
'source' 카테고리의 다른 글
리액트 컴포넌트 컨스트럭터에 아약스를 넣을 수 있습니까? (0) | 2023.10.14 |
---|---|
텍스트 영역 크기 조정을 비활성화하는 방법? (0) | 2023.10.14 |
시스템을 다루고 있습니다.PowerShell에서 DBNull (0) | 2023.10.14 |
레일 4: AJAX로 파일을 업로드하는 방법 (0) | 2023.10.14 |
C11 GCC threads.h not found? (0) | 2023.10.14 |