jc.jang

4강 CSRF 본문

Django/Django - Form,ModelForm

4강 CSRF

jangstory 2019. 9. 24. 19:23

주제

  • Form을 위한 장고의 기본 보안기능으로서 '사이트간 요청 위조 공격'을 어느 정도 막아주는 기능이 있다.

노트

  • 사이트 간 요청 위조 공격이란?

  • 사용자가 의도하지 않게 게시판에 글을 작성하거나, 쇼핑을 하게하는 등의 공격

<body onload="document.attack_form.submit();">
    <form name="attack_form" method="post" action="http://site-victim.com/new/ ">
        <input type="hidden" name="title" value="스팸 제목" />
        <input type="hidden" name="content" value="스팸 내용" />
    </form>
</body>
  • 현재 사이트의 웹 페이지가 로드 되면 "http://site-victim.com/new/"로 form이 전송됨.

 

  • 요청을 받는 서버 입장에서, 공격을 막기 위해 Token을 통한 체크

  • POST 요청에 한해 CsrfViewMiddleware를 통한 체크를 함

  • POST 요청을 받을 때 Token 값이 없거나 유효하지 않다면, 403 Forbidden 응답

  • 처리 순서

    • 입력 Form을 보여줄 때, Token 값도 값이 할당

    • 그 입력 Form을 통해 Token값이 전달이 되면, Token 유효성 검증

    • Form 템플릿 HTML 코드에 {% csrf_token %}을 쓰는 이유!

  • CSRF Token 체크 기능에 대해

    • 가급적이면 끄지 말자.

      • 기본 제공되는 보안기능이다.

      • 이를 유지하는 데에 비용이 거의 들지 않는다.

    • 앱 API에서는 끄는 것이 필요할 수 있다.

      • 앱에서는 get 요청을 통해 입력 폼을 받는 것이 아니기 때문! 앱에서 폼을 생성한다.

      • django-rest-framework에서는 관련 View에 대해 모두 배제

    • 특정 View에 한해 CSRF Token 체크에서 배제하려면?

      • 해당 뷰에 @csrf_exempt 장식자를 적용

요약

  • 장고에서 보안을 위해 csrf 기본 보안 기능을 제공한다.
  • 템플릿 코드에서 왜 {% csrf_token %}을 쓰는지 이제 알았다.
  • 쿠키로 get 요청 시 제공한 csrf_token 값과 post 요청 시 받은 값을 통해 체크하는구나!

 

 

'Django > Django - Form,ModelForm' 카테고리의 다른 글

6강 Form Validation  (0) 2019.09.25
5강 ModelForm  (0) 2019.09.24
3강 Form  (0) 2019.09.24
2강 HttpRequest와 HttpResponse  (0) 2019.09.17
1강 HTML Form  (0) 2019.09.17
Comments