Django Cross Site Request Forgery이란???

2022. 1. 18. 16:31강의 정리/Django Form

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 

 


 

 

 

Cross Site Request Forgery (CSRF) // 사이트 간 요청 위조 공격

  • 사용자가 의도하지 않게 게시판에 글을 작성하거나, 쇼핑을 하게 하는 등의 공격
    • 특정 웹사이트가 유저의 웹브라우저를 신용하는 상태를 노린 공격
    • 공격자 사이트의 웹페이지에 접속하면, 그 즉시 site-victim.com로의 POST 요청이 사용자 모르게 전달됨.

 


 

DjangoCSRF 공격을 막기 위해서 Token을 통한 체크를 한다.

  • POST 요청에 한해 CsrfViewMiddleware를 통한 체크
    • POST 요청을 받을 때 Token 값이 없거나, 유효하지않다면, 403 에러 응답
  • 처리순서
    1. 입력 Form을 보여줄 때, CSRF Token값도 같이 할당
      • CSRF Token은 User마다 다르며, 계속 변경됨.
    2. 그 입력 Form을 통해 Token값이 전달이 되면, Token 유효성 검증

 

 

  • CSRF Token은 유저인증 Token이나 JWT(Json Web Token)이 아닙니다!!

 

  • 앱 API에서는 꺼야한다.  #리액트나 뷰또한 앱으로 취급할 수 있다.
    • django-rest-framework의 APIView에서는 csrf_exempt가 적용이 되어 있다.

 

 

 


 

CSRF Token 체크 기능은 가급적이면 끄면 안된다.

  • 기본 제공되는 보안기능이며,
  • 이를 유지보수하는데 비용이 거의 들지 않는다.
  • 특정 View에 한해서, CSRF Token 체크에서 배제하기 위해서는?
    • 해당 뷰에 @csrf_exempt 장식자를 사용

 

 


 

 


 

#instagram/post_form.html

<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <table>
        {{ form }}
    </table>
    <input type="submit" value="저장" />
</form>
  • csrf_token을 호출하면 폼 내부적으로 토큰이 발행이 된다.
  • post 요청을 보내면(=method="post")라면 장고 프로젝트 기본 세팅으로 CsrfViewMiddleware가 적용되어 있다.

 


jquery에서 CSRF Token 적용하기

#inflearn/static/jquery.csrf.js

function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const 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;
}
const csrftoken = getCookie('csrftoken');

 

 

#instagram/layout.html

<script src="{% static 'jquery.csrf.js' %}"></script>

 

 


도움 받은 문서

 

 

반응형

'강의 정리 > Django Form' 카테고리의 다른 글

Django Form Validation  (0) 2022.01.19
Django ModelForm이란?  (0) 2022.01.19
Django를 더 Django스럽게 만들어주는 Form  (0) 2022.01.18
HttpRequest, HttpResponse, JsonResponse  (0) 2022.01.17
Django HTML Form  (0) 2022.01.17