Python/Django

[Django] CSRF Token + Ajax 비동기 통신

yubi5050 2022. 6. 12. 22:47

Django 에서 HTTP Request를 보낼 때에는 1) Form으로 보내는 방법 2) Ajax 비동기로 보내는 방법이 있으며, CSRF Token을 요청에 포함할 것을 강요한다. CSRF Token을 통해 위조 공격에 대한 보안을 쉽게 작성 할 수 있다.

 

👉  방법 2가지

 

👉 GIthub 전체 코드 (링크) 

 

GitHub - SeonminKim1/Python: Python Framework & Libary

Python Framework & Libary. Contribute to SeonminKim1/Python development by creating an account on GitHub.

github.com

 


 

👉 코드 - templates/index.html

meta 데이터에 csrf_token 을 추가 해주고, Ajax Header에 X-CSRFToken을 추가하여 보내준다.

<html>
    <head>
        <meta name="csrf_token" content="{{ csrf_token }}">
        <!-- Jquery -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    </head>
    <script>
        function put_score() {
            var csrftoken = document.querySelector("meta[name=csrf_token]").content
            var score = document.getElementById("score").value
            console.log(score)
            $.ajax({ // 비동기 방식
                type: "POST",
                dataType: "JSON",
                contentType: "application/json; charset=utf-8",
                url: "/score/",
                data: JSON.stringify({'score': score}),
                headers: {"X-CSRFToken": csrftoken},
                success: function (response) {
                    alert(response["msg"])
                }
            });
        }
    </script>

    <body>
        <div>
            <label for="score">점수를 입력하세요</label><input type="text" id="score">
        </div>
        <button class="score-btn" onclick="put_score()">점수 제출</button>
    </body>

</html>

 

👉 코드 - views.py, url.py

views.py

from django.shortcuts import render
from django.http import JsonResponse

import json

def score_func(request):
    if request.method == 'GET':
        return render(request, 'index.html')
    elif request.method == 'POST':
        score = int(json.loads(request.body)['score'])
        print('받은 score 데이터', score)
        if score >= 70:
            msg = '합격'
        else:
            msg = '불합격'
        return JsonResponse({'msg': msg})

 

urls.py

from django.urls import path
from .views import score_func

urlpatterns = [
    path('score/', score_func)
]