๐ ๊ฐ์
๊ฐ๋ง์ ์ฅ๊ณ ๋ก ๋ค์ ๊ฐ์ธ์ ์ธ toy project๋ฅผ ํด๋ณด๊ณ ์ถ์ด์, ์ฅ๊ณ ํ๋ก์ ํธ ์์ฑํ๊ณ ๊ฐ๋จํ๊ฒ POST ์์ฒญ ๋น๋๊ธฐํต์ ์ ์ด์ฉํด๋ณด๊ณ ์ถ์ด์ jquery์ ajax๋ฅผ ์ฌ์ฉํ๋ค. ์ญ์, ERROR๊ฐ ์๋ฐ๋ฆฌ ์๋ค.
๐ฑ ๋ฌธ์ ์
์ฐ์ ์์ฑํ ์ฝ๋๋ ์์ฃผ ๊ฐ๋จํ๋ค.
$.ajax({
type:'POST',
url:'/search',
data:JSON.stringify(geodata),
success:function(json){
console.log("to view data pass success",json);
},
error : function(xhr,errmsg,err) {
console.log(xhr.status + ": " + xhr.responseText);
}
});
search ๋ก POST ์์ฒญ์ ๋ณด๋๋๋ฐ.......?
Forbidden (CSRF cookie not set.): /search
[20/Mar/2021 10:47:16] "POST /search HTTP/1.1" 403 2864
๊ฒฐ๊ณผ๋ ์ฒ์ฐธํ๋ค....โ ๏ธโ ๏ธโ ๏ธโ ๏ธโ ๏ธ
๊ฐ๋จํ๊ฒ ์์ฝํ์๋ฉด django์ CSRF(Cross Site Request Forgery ์ฌ์ดํธ ๊ฐ ์์ฒญ ์์กฐ) ๋ณด์ ์ ์ฑ ์ผ๋ก ์ธํด ์ผ์ด๋ ์๋ฌ์ด๋ค.
๐ ํด๊ฒฐ๋ฒ
1๏ธโฃ decorator๋ฅผ ์ฌ์ฉํ์ฌ ํน์ view์ csrf ์ ์ฉํ์ง ์๊ธฐ
๋จ์ํ๊ฒ csrf ์ ์ฑ ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด๋ค. ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํ๋ค. views.py์ ์ํ๋ view์ decorator๋ฅผ ๋ฌ์์ฃผ๋ฉด ๋๋ค.
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def search(request):
return HttpResponse('success')
์ด๋ ๊ฒ ํ๋ฉด ํด๊ฒฐ๋์ง๋ง, ๋ญ๊ฐ ๋ณด์์ ๋ญ๊ฐ ์ฐ์ฐํ๋ค.. ๊ทธ๋์ ๋ค์ ๋ฐฉ๋ฒ์ ์ค๋นํ๋คโ๏ธ
2๏ธโฃ html ํ์ผ header๋ถ๋ถ์ csrf token ์์ฑํ๊ธฐ
์ด ๋ฐฉ๋ฒ์ django ๊ณต์ ๋ฌธ์(๋ณด๋ฌ๊ฐ๊ธฐ)์ ์๋ ๋ฐฉ๋ฒ์ด๋ค. ajax๋ฅผ ์ฌ์ฉํ๋ html ํ์ผ์ header ๋ถ๋ถ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
<script>
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);
}
}
});
</script>
๋๊ฐ ๋ณด๋ฉด ํ ํฐ์ ๋ง๋ค๊ณ ajax์ ๋ฏธ๋ฆฌ ์ค์ ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค. ํ์ํ ์ฌํญ์ ๋น์ฐํ jquery๋ฅผ ๋จผ์ ๋ถ๋ฌ์์ผ ํ๋ค.
โ 2021/04/08 ๋ด์ฉ ์ถ๊ฐ
ํ์ ์์ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋๋ค๊ฐ ์ ๋๋ค๊ฐ ํ๋ค๊ฐ ๊ฒฐ๊ตญ ๋ ์๋๊ธธ๋ ๊ฐ๋จํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ค.
<script>
$.ajaxSetup({
headers: { "X-CSRFToken": '{{csrf_token}}' }
});
</script>
๋จ์ํ ์ด ๋ถ๋ถ๋ง html ํ์ผ์ header ๋ถ๋ถ์ ์ถ๊ฐํด์ฃผ๋ฉด๋๋ค... ์ด๊ฒ ๋๋ฌธ์ ์๊ฐ ๋ ๋ ๋ฆฐ๊ฑฐ ๋๋ฌด ํ๋๋ค๐คฌ
๐ ๋ง๋ฌด๋ฆฌ
์ฒ์ ๋ฐฐ์ธ ๋์๋ ์ด๋ค ๊ฒ์ธ์ง๋ ๋ชจ๋ฅด๊ณ ๋จ์ํ ์๋ฌ๋ง ์์ ๋ ค๊ณ ์ฌ์ฉํ์๋๋ฐ, ๋ค์ ๋ณด๋ ๊ฐํ๊ฐ ์๋กญ๊ณ ์คํ๋ ค ๋ ๊ธฐ์ต์ ๋จ๊ฒ ๋์๋ ๊ฒ ๊ฐ๋ค. ํ์ง๋ง ๋ด ๋จธ๋ฆฌ๋ฅผ ๋๋ฌด ๋ฏฟ์ง ๋ง์. ์ค๋๋ ํฌ์คํ ... ํฌ์คํ ...๐งโ๐ป
reference
'python > django' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[django] mysql + docker-compose (1) | 2022.12.25 |
---|---|
[django] ajax๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ ์ฃผ๊ณ ๋ฐ๊ธฐ (0) | 2021.03.20 |