source

쿠키 속에 들어있는 장고노코토큰

ittop 2023. 10. 14. 10:38
반응형

쿠키 속에 들어있는 장고노코토큰

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_HTTPONLYline, 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

반응형