본문 바로가기

WebDev

django CSRF disable (CSRF 해제)

django CSRF disable (CSRF 해제)


django는 기본적으로 CSRF 방어를 강제한다.

그러나 몇몇 상황에서는 CSRF를 끄고 싶은 경우가 있을 것이다.

CSRF. 한 번 꺼보자.


단 정말 꼭 꺼야만 하는지 생각좀 해 보고 꺼야 한다. 보안에 큰 구멍이 생기기 떄문. 




방법1 @csrf_exempt 데코레이터 사용


공식 문서에서는 데코레이터를 사용하라고 써 있다.

@csrf_exempt
def someview(request):
return None


뭐 이런 식으로 사용하면 된다. 이 뷰에 한해서는 csrf가 강요되지 않는다.

강력한 방법은 아니다. 왜냐하면 매 번 데코레이터를 붙여야 하며, 데코레이터 궁합이 안 맞을 수 있으며, 데코레이터를 달아도 csrf 때문에 문제가 생기는 경우가 있기 때문.


애초에 django에서 강력한 방법을 제공 안할 만큼 csrf를 끄는 것은 위험한 것임을 감수하고 방법2로...




방법2 middleware 정의


http://stackoverflow.com/questions/16458166/how-to-disable-djangos-csrf-validation 참조


대충 프로젝트 어딘가에 미들웨어 정의를 위한 파이썬 파일을 만들자.

나의 경우 settings.py가 있는 디렉토리에 middlewawre.py라고 만들었다.


미들웨어 코드는 간단하다:

class DisableCSRF(object):
def process_request(self, request):
setattr(request, '_dont_enforce_csrf_checks', True)


이제 이 코드를 settings.py에 반영하자:

MIDDLEWARE_CLASSES = (
'...................................'
'phople.middleware.DisableCSRF',
)


이렇게 하면 방법2가 적용된다.



이 방법은 미들웨어 수준에서 csrf 강제를 해제하는 방법이다. 정말 말 그대로 완전히 기능을 상실한다.

CSRF 기능과 관련해서 아무런 꼬임도 생기지 않을 것이다. 그와 함께 정말 큰 보안 구멍이 생길 것이다.




'WebDev' 카테고리의 다른 글

DRF + CORS + CSRF + AJAX 하에서 개발하기  (0) 2016.01.21
django login 정리  (0) 2016.01.21
django class-based view  (0) 2016.01.15
Django Url  (0) 2016.01.14
Django Deploy  (0) 2016.01.04