CSRF token 생성

Python_Django 2012. 7. 25. 10:16


공격방법 중에 CSRF 관련된 것이 있는 모양인데(어떻게 하는지는 잘 모르겠고),

Django에선 이런 걸 막는데 필요한 정보가 넘어 오지 않으면 처리 중에 에러를 발생시킨다.

그러니까, 반드시 아래의 절차를 따라서 submit할 때 csrf token를 서버로 보내 줘야 한다.


POST방식으로 데이터를 전송하려면, 입력하는 화면에서 아래와 같은 코드가 추가되어야 한다.


1. view에서 request에 대해 csrf 정보 추가

from django.core.context_processors import csrf


def show_userinfo3(request):

    c = {}

    c.update(csrf(request))

    return render_to_response('user/input.html',c)


위와 같이 귀찮게 매번 코드에 추가하지 않으려면,

settings.py의 TEMPLATE_CONTEXT_PROCESSORS에 django.core.context_processors.csrf 가 포함되어 있으면 아래와 같이만 써도 자동으로 csrf 태그가 정보가 추가됨

def show_userinfo3(request):

    return render_to_response('user/input.html', RequestContext(request))



2. form 태그 안에 {% csrf_token %} 추가

<form action="/pasta/user/userinfo4/" method="post"> {% csrf_token %}


이렇게 해서 웹브라우저에서 user/input.html 화면의 소스보기를 보면, {% csrf_token %} 부분에 아래와 같은 코드가 생성됨

<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='c497670310117cb5fbcdc6bc0657d455' /></div>


이런 csrf 정보가 없으면, submit했을 때 서버에서 처리하다가 CSRF token missing or incorrect 에러가 발생함.


AJAX로 처리할 때도 물론 이 token 정보를 보내 줘야 한다.
그러므로, form 전체를 보내는 게 아니라면 반드시 csrfmiddlewaretoken을 포함시켜 보내 줘야 한다.

'Python_Django' 카테고리의 다른 글

Django의 cache 사용  (0) 2012.07.25
decorator 만들기  (0) 2012.07.25
hash(digest) 호출  (0) 2012.07.25
request의 값 처리  (0) 2012.07.25
Django의 session 처리  (0) 2012.07.13
AND