Django Cross Site Request Forgery이란???
2022. 1. 18. 16:31ㆍ강의 정리/Django Form
반응형
장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!
Cross Site Request Forgery (CSRF) // 사이트 간 요청 위조 공격
- 사용자가 의도하지 않게 게시판에 글을 작성하거나, 쇼핑을 하게 하는 등의 공격
- 특정 웹사이트가 유저의 웹브라우저를 신용하는 상태를 노린 공격
- 공격자 사이트의 웹페이지에 접속하면, 그 즉시 site-victim.com로의 POST 요청이 사용자 모르게 전달됨.
Django는 CSRF 공격을 막기 위해서 Token을 통한 체크를 한다.
- POST 요청에 한해 CsrfViewMiddleware를 통한 체크
- POST 요청을 받을 때 Token 값이 없거나, 유효하지않다면, 403 에러 응답
- 처리순서
- 입력 Form을 보여줄 때, CSRF Token값도 같이 할당
- CSRF Token은 User마다 다르며, 계속 변경됨.
- 그 입력 Form을 통해 Token값이 전달이 되면, Token 유효성 검증
- 입력 Form을 보여줄 때, CSRF Token값도 같이 할당
- CSRF Token은 유저인증 Token이나 JWT(Json Web Token)이 아닙니다!!
- 앱 API에서는 꺼야한다. #리액트나 뷰또한 앱으로 취급할 수 있다.
- django-rest-framework의 APIView에서는 csrf_exempt가 적용이 되어 있다.
CSRF Token 체크 기능은 가급적이면 끄면 안된다.
- 기본 제공되는 보안기능이며,
- 이를 유지보수하는데 비용이 거의 들지 않는다.
- 특정 View에 한해서, CSRF Token 체크에서 배제하기 위해서는?
- 해당 뷰에 @csrf_exempt 장식자를 사용
#instagram/post_form.html
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form }}
</table>
<input type="submit" value="저장" />
</form>
- csrf_token을 호출하면 폼 내부적으로 토큰이 발행이 된다.
- post 요청을 보내면(=method="post")라면 장고 프로젝트 기본 세팅으로 CsrfViewMiddleware가 적용되어 있다.
jquery에서 CSRF Token 적용하기
#inflearn/static/jquery.csrf.js
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
const csrftoken = getCookie('csrftoken');
#instagram/layout.html
<script src="{% static 'jquery.csrf.js' %}"></script>
도움 받은 문서
반응형
'강의 정리 > Django Form' 카테고리의 다른 글
Django Form Validation (0) | 2022.01.19 |
---|---|
Django ModelForm이란? (0) | 2022.01.19 |
Django를 더 Django스럽게 만들어주는 Form (0) | 2022.01.18 |
HttpRequest, HttpResponse, JsonResponse (0) | 2022.01.17 |
Django HTML Form (0) | 2022.01.17 |