티스토리 뷰
Cross-site request forgery
사이트 간 요청 위조 공격
• 사용자가 의도하지 않게 게시판에 글을 작성하거나, 쇼핑을 하게 하는등의 공격
<!-- 공격자 사이트의 웹페이지에 접속하면, 그 즉시 site-victim.com에 새글쓰기 요청이 사용자 모르게 전달된다.. -->
A라는 싸이트 방문 시 아래와 같은 코드가 있다고 가정 한다.
<body onload="document.attack_form.submit();"> # java스크립트 코드 <form name="attack_form" method="post" action="http://site-victim.com/blog/post/new/"> <input type="hidden" name="title" value="스팸 제목" /> <input type="hidden" name="content" value="스팸 내용" /> </form> </body> |
CSRF를 막기 위해 POST요청에 한해, csrf token 발급 및 체크
POST요청에 한해 CsrfViewMiddleware를 통해 csrf token을 체크 # middleware 란? view가 호출 되기 직전에 추가로 호출되는 함수 목록
(설명) ##토큰 값은 계속 바뀐다.
1. GET으로 유저에게 FORM형태를 제공한다.
2. 인자를 유저가 입력 하고, 마지막 단계에 Token을 발급 한다.
3. 전 항목을 전부 POST로 전송한다.
4. CSRF는 POST의 토큰을 비교한다.
5. 유효한 요청이면 요청을 처리한다. VIEW호출 .
(토큰 값이 맞지않으면 VIEW함수를 호출하지 않고 403 응답을 출력 한다.)
- 체크 오류 시에는 403 Forbidden 응답
GET요청에서는 csrf token이 불필요
<form action="" method="post"> {% csrf_token %} <!-- csrf token 발급 : POST요청에서는 필수 !!! --> <input type="text" name="title" /> <textarea name="content"></textarea> <input type="submit" /> </form> |
<input type='hidden' name='csrfviewmiddlewaretoken' value='123$45%6123'>과 비슷한 형태로 값으로 생성이 될거임 (임시의 값)
csrf_token != 유저인증 Token
대개 GET요청은 조회목적, POST요청은 추가/수정/삭제목적으로 사용
csrf_exempt 장식자
특정 뷰에 한해 csrf token 체크를 해제할려면, csrf_exempt 장식자 적용 # API를 구현한 VIEW경우 CSRF 토큰을 사용하면 안된다.
기본 제공되는 보안기능이므로, 어쩔 수 없는 경우 (앱 API 기능을 제공 하는 경우) 를 제외하고는 제거하지 말자. 있어도 개발에 전혀 불편하지가 않다.
from django.views.decorators.csrf import csrf_exempt @csrf_exempt def my_view(request): return HttpResponse('Hello world') |
JQuery, Javascript Post를 보낼때 구글 검색하여 매뉴얼 참고 하면 된다.
https://docs.djangoproject.com/en/2.0/ref/csrf/
"""본 내용은 AskDjango VOD, "장고 차근차근 시작하기" 강의내용을 참고하여 작성했습니다.(https://nomade.kr/)"""
'Python > * Django' 카테고리의 다른 글
18. Form (0) | 2017.12.19 |
---|---|
17. HttpRequest and HttpResponse (0) | 2017.12.18 |
15. HTML Form (0) | 2017.12.15 |
14. Django 템플릿 엔진 - 템플릿 필터 (0) | 2017.12.15 |
13. Django 템플릿 엔진 - 템플릿 태그 (0) | 2017.12.15 |