장고에서 CSRF
2023. 3. 9. 10:38ㆍ개발/토막난 상식
반응형
https://docs.djangoproject.com/en/4.1/howto/csrf/
jquery beforeSend 콜백에 csrf token 설정 콜백 등록
CSRF(Cross Site Request Forgery)
교차 사이트 요청 위조 공격
- CSRF는 사이트간 위조 요청으로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위(CRUD)를 웹 사이트에 요청하게 하는 공격이다.
- 공격자는 웹사이트가 신뢰하고 있는 사용자 권한을 이용해 공격을 실행하며, 웹사이트 입장에서는 인증된 유저의 요청을 인가하기 때문에 공격에 노출된다.
- 사용자가 의도하지 않게 게시판에 글을 작성하거나 쇼핑을 하게 하는 등의 공격으로 잘못된 사이트에서 접속만 해도 POST 요청이 전달될 수 있다.
- Django의 CSRF 미들웨어 및 템플릿 태그는 CSRF 공격에 대한 사용하기 쉬운 보호 기능을 제공한다.
- Django는 CsrfViewMiddleware를 사용해 request 요청이 백엔드 서버로 전달되어 views에 도착하기 전에 CSRF token으로 확인한다. Token이 유효하지 않다면 403 에러를 발생시킨다.
- csrf token을 django template에서 입력하여 공격을 방어할 수 있다.
- 랜덤한 값을 사용자의 세션에 저장하고 모든 요청을 토큰을 통해 검증한다.
<form action="" method="POST">
{% csrf_token %}
<table>
{{form.as_p}}
</table>
<input type="submit">
</form>
- Django 자체를 풀스택 프레임워크로 사용하지 않고, 백엔드 서버로 사용한다면 다양한 API를 만들 수 있다.
- 이 경우 API 서버는 access token, JWT 등을 통해 인증 및 인가를 진행하기 때문에 CSRF 토큰을 사용하지 않아도 된다.
- 하지만 기본적으로 미들웨어에서 CSRF에 대한 방어를 하기 때문에 403 에러를 마주할 수 있다.
- 따라서, 이를 해제하기 위해 csrf_exempt 데코레이터를 이용할 수 있다.
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def article_create(request):
pass
j쿼리를 사용해서 적용방법
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== "") {
var cookies = document.cookie.split(";");
for (var i = 0; i < cookies.length; i++) {
var 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;
}
var csrftoken = getCookie("csrftoken");
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
});
---------------------------------------------------------------------------
<script src="{% static 'jquery.csrf.js' %}"></script>
---------------------------------------------------------------------
from django.views.decorators.csrf import csrf_exempt
fetch()를 사용한 방법
const request = new Request(
/* URL */,
{
method: 'POST',
headers: {'X-CSRFToken': csrftoken},
mode: 'same-origin' // Do not send CSRF token to another domain.
}
);
fetch(request).then(function(response) {
// ...
});
반응형
'개발 > 토막난 상식' 카테고리의 다른 글
장고 기본 CBV API (0) | 2023.03.13 |
---|---|
cleaned_data이란 (0) | 2023.03.09 |
$.ajaxSetup() (0) | 2023.03.09 |
배포 테스트 목적 외부망 연결 추천 (0) | 2023.03.08 |
css 프레임 워크 추천 & CDN이란? (0) | 2023.03.08 |