Django 와 React.js 통신을 할 때, axios 또는 fetch 함수등을 사용하여 서버와 POST 통신을 할 때 CSRF 403 Forbidden Error 메세지를 Django 에서 출력 합니다. 이러한 경우 해결하는 방법에 대해서 알아 보겠습니다.
CSRF Token
CSRF Token 의 개념
CSRF 토큰 의 Cookie 에 저장되어 통신을 합니다. 역활은 서버에 들어온 요청이 실제 서버에서 허용한 요청이 맞는지 확인하기 위한 토큰 입니다. 동작과정을 살펴보면 다음과 같습니다.
- 뷰에서 템플릿을 만들어 넘길때, CSRF 토큰값을 쿠키에 담아서 보내준다.
- django 프레임워크에서 설정한 헤더와 쿠키로 CSRF 토큰을 넘긴다.
Django 는 기본 설정에서 CSRF 보안 기능을 제공합니다. 때문에 Key 값이 기본 설정값으로 지정되어 전달을 하고 axios 등에서 확인하는 Key 이름이 달라서 403 오류가 발생 합니다.
Django 에서 수정
settings.py 파일에서 CSRF token 의 이름을 axios 에서 확인하는 Cookie 의 이름과 일치하도록 바꾸는 방법은 다음과 같습니다.
CSRF_COOKIE_NAME = 'XSRF-TOKEN'
CSRF_HEADER_NAME = 'X-XSRF-TOKEN'
CSRF_TRUSTED_ORIGINS = [
"http://0.0.0.0:5173",
"http://0.0.0.0:8000",
]
Axios 에서 수정
axios 설정을 django 기본 쿠키 설정값과 일치 시키는 방법 입니다.
axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = 'X-CSRFToken'