장고에서 CSRF

2023. 3. 9. 10:38개발/토막난 상식

반응형

https://docs.djangoproject.com/en/4.1/howto/csrf/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

jquery beforeSend 콜백에 csrf token 설정 콜백 등록

 

jquery beforeSend 콜백에 csrf token 설정 콜백 등록 · askcompany-kr/django-with-react@e96f01d

Show file tree Showing 3 changed files with 32 additions and 0 deletions.

github.com

 
 
 

CSRF(Cross Site Request Forgery)

교차 사이트 요청 위조 공격

  • CSRF는 사이트간 위조 요청으로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위(CRUD)를 웹 사이트에 요청하게 하는 공격이다.
  • 공격자는 웹사이트가 신뢰하고 있는 사용자 권한을 이용해 공격을 실행하며, 웹사이트 입장에서는 인증된 유저의 요청을 인가하기 때문에 공격에 노출된다.
  • 사용자가 의도하지 않게 게시판에 글을 작성하거나 쇼핑을 하게 하는 등의 공격으로 잘못된 사이트에서 접속만 해도 POST 요청이 전달될 수 있다.
 
 
 
 
 
 
 
  • Django의 CSRF 미들웨어 및 템플릿 태그는 CSRF 공격에 대한 사용하기 쉬운 보호 기능을 제공한다.
  • Django는 CsrfViewMiddleware를 사용해 request 요청이 백엔드 서버로 전달되어 views에 도착하기 전에 CSRF token으로 확인한다. Token이 유효하지 않다면 403 에러를 발생시킨다.
 
  • csrf token을 django template에서 입력하여 공격을 방어할 수 있다.
  • 랜덤한 값을 사용자의 세션에 저장하고 모든 요청을 토큰을 통해 검증한다.
<form action="" method="POST">
	{% csrf_token %}
  <table>
    {{form.as_p}}
  </table> 
  <input type="submit">
</form>​
 
 
 
 
 
 
  • Django 자체를 풀스택 프레임워크로 사용하지 않고, 백엔드 서버로 사용한다면 다양한 API를 만들 수 있다.
  • 이 경우 API 서버는 access token, JWT 등을 통해 인증 및 인가를 진행하기 때문에 CSRF 토큰을 사용하지 않아도 된다.
  • 하지만 기본적으로 미들웨어에서 CSRF에 대한 방어를 하기 때문에 403 에러를 마주할 수 있다.
  • 따라서, 이를 해제하기 위해 csrf_exempt 데코레이터를 이용할 수 있다.
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def article_create(request):
    pass
 
 
 
 
 

Django CSRF

CSRF는 사이트간 위조 요청으로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위(CRUD)를 웹 사이트에 요청하게 하는 공격이다.공격자는 웹사이트가 신뢰하고 있는 사용자 권한을 이용해

velog.io

 
 
 j쿼리를 사용해서 적용방법
 
 
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 src="{% static 'jquery.csrf.js' %}"></script>

 

 

---------------------------------------------------------------------

from django.views.decorators.csrf import csrf_exempt

 

 

 

 

 

fetch()를 사용한 방법

const request = new Request(
    /* URL */,
    {
        method: 'POST',
        headers: {'X-CSRFToken': csrftoken},
        mode: 'same-origin' // Do not send CSRF token to another domain.
    }
);
fetch(request).then(function(response) {
    // ...
});

 

 

반응형

'개발 > 토막난 상식' 카테고리의 다른 글

장고 기본 CBV API  (0) 2023.03.13
cleaned_data이란  (0) 2023.03.09
$.ajaxSetup()  (0) 2023.03.09
배포 테스트 목적 외부망 연결 추천  (0) 2023.03.08
css 프레임 워크 추천 & CDN이란?  (0) 2023.03.08