티스토리 뷰

Django

[Django Basic 09] {% csrf_token %}

Liiot 2020. 2. 9. 16:13

1. CSRF(Cross Site Request Forgery)

: 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)

 

를 특정 웹사이트에 요청하게 하는 공격

  • 이미 사용자가 접속한 상황에서 요청값을 조작하여 사용자가 원하지 않는 action을 보내 웹 어플리케이션을 악용
  • 사용자의 권한에 따라 위험성이 달라짐

 

2. 공격 과정 간단한 예시

  1. 공격자는 도구를 사용해 새글 등록 요청 발생시 어떤 파라미터가 전달되는지 확인한다.

    (동작 구조 사전 파악)

  2. 공격자는 게시글에 <iframe> 태그를 이용해 보이지 않는 게시글을 남긴다.

    ex)

    <iframe src="http//example.com/attack/reg_post?title=abc&content=abc" width="0" height="0" frameborder="0"></iframe>
  3. 피해자가 해당 웹사이트에 접속하여 공격자가 남긴 게시글에 들어간다.

  4. 들어가는 순간 <iframe> 태그로 만든 숨겨진 GET Request가 동작한다.

  5. 피해자의 계정으로 새 글이 등록된다.

 

3. Django의 CSRF공격에 대한 방어

CSRF 공격을 방어하기 위한 다양한 방법이 있지만 Django에서는 기본적으로 csrf token을 이용한다.

 

POST 요청에 대해서만 csrf token을 발급하고 체크한다.

  • CsrfViewMiddleware는 MIDDLEWARE 설정에서 기본적으로 활성화 되어있다.
    • csrf token 발급(사용자가 로그인할 때마다 값이 변경됨)
    • view가 호출되기 전 csrfmiddlewaretoken 유효성 검증
  • POST 양식을 사용하는 템플릿에서 <form> 태그 안에 {% csrf_token %} 태그를 사용
<form class="mt-3" action="{% url 'accounts:signup' %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="form-group">
        <input type="text" class="form-control" id="name" name="name" placeholder="성명">
    </div>
    <button type="submit" class="btn btn-primary">제출하기</button>
</form>

 

동작 과정

  1. 사용자가 해당 페이지에 접속하면 Django에서 자동으로 csrf_token을 클라이언트로 보내어 cookie에 저장
  2. 사용자가 form을 모두 입력한 후 제출버튼을 클릭한다.
  3. form과 cookie의 csrf_token을 함께 POST로 전송한다.
  4. 전송된 token의 유효성을 검증
  5. 유효한 요청이면 요청을 처리
    • token이 유효하지 않거나(없거나 값이 잘못된 경우) 검증 오류 시에는 403 Forbidden Response 반환

 


 

참고 자료

 

크로스 사이트 리퀘스트 변조(CSRF)

CSRF:Cross-Site Request Forgery 크로스 사이트 리퀘스트 변조는 사이트간 요청위조 불리기도 한다. 피해자의 권한으로 피해자 모르게 공격자가 의도한 요청을 수행 하도록 만드는것이다. 이는 그 피해자의 권한..

hack-cracker.tistory.com

 

Django CSRF 공격

들어가기 Django 에서는 기본적으로 CSRF 토큰을 이용해 CSRF공격을 방지한다. CSRF 공격이란? CSRF 공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로, 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만드는 공격 Dj...

velog.io

 

Cross Site Request Forgery protection | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

댓글