1. settings 속성

https://docs.djangoproject.com/en/4.0/ref/settings/

 

2. cookies에서 가져오기

global_settings.py에 지정된 이름으로 cookies에 발급된 csrf token이용

csrftoken 쿠키를 사용할려면 view가 {% csrf_token %}이 사용된 템플릿을 렌더링해야 한다.

그렇지 않을 경우 cookie로 csrf 토큰 쿠키를 Django가 설정하지 않을 수 있다. 즉 'csrftoken'이란 이름을 가진 cookie가 만들어져 있지 않다.

https://docs.djangoproject.com/en/4.0/ref/csrf/#ajax

template html없이 ajax호출이 필요할때 csrftoken을 강제로 만들어 주는 메소드를 호출해준다. 아래 링크 참조

https://docs.djangoproject.com/en/4.0/ref/csrf/#page-uses-ajax-without-any-html-form

그래서 첫 페이지 호출 view를 아래와 같이 수정하면 된다.

변경전

class HomeView(TemplateView):
    template_name = "home.html"

    def get_context_data(self, **kwargs):
        context = TemplateView.get_context_data(self, **kwargs)

변경후

@method_decorator(ensure_csrf_cookie, name="get")
class HomeView(TemplateView):
    template_name = "home.html"

    def get(self, request, *args, **kwargs):
        return TemplateView.get(self, request, *args, **kwargs)
    
    def get_context_data(self, **kwargs):
        context = TemplateView.get_context_data(self, **kwargs)

 

global_settings.py

CSRF_COOKIE_NAME = 'csrftoken'

 

javascript

    getCsrftoken : function()
    {
        return UT.getCookie("csrftoken");
    },
    
    getCookie : function(cname)
    {
    ....
    },

    ajax : function(type, url, data, callbackSuccess, callbackError)
    {
        var _csrftoken = UT.getCsrftoken();
        
        $.ajax({ type: type
               , url: url
               , data: data
               , dataType: "json"
               , headers: {"X-CSRFToken": _csrftoken}
               , success: callbackSuccess
               , error: callbackError
               });

 

3. meta tag에 지정하여 사용하기

<!DOCTYPE html>
<html lang="ko">
    <head>
        <title>{% block title %}{{ site.name }}{% endblock title %}</title>
        <meta name="csrf_token" content="{{ csrf_token }}">
        <meta name="viewport" content="width=device-width, initial-scale=1">

template html에 {{csrf_token }}을 사용하면 앞서 언급했듯이 Django가 이미 csrftoken cookie가 만들어놔서

사실 아래처럼 Meta tag를 참조 할 필요없이 cookie에 기록된 'csrftoken'을 사용하면 되나,

또 다른 활용법으로 기록해 본다. 

        var _csrftoken = document.querySelector("meta[name=csrf_token]").content;

        $.ajax({ type: type
               , url: url
               , data: data
               , dataType: "json"
               , headers: {"X-CSRFToken": _csrftoken}
               , success: callbackSuccess
               , error: callbackError
               });