Django CSRF token 에러

Web 2023. 1. 5. 10:59

후후.... 보안 관련 에러인데 찾아보니 내용이 너무 많다.

상당히 복잡하다....

 

CSRF란 #$%&, 원인이 #$%^#, 대안 방법이 블라블라.... 너무 복잡했다.

다른 건 별로 안 궁금하고 내가 원하는 것은 저 에러가 없어지는 것이다.

 

크게 방법은 두가지를 추천했다.

- 예외처리

- html 헤더에 csrf 코드 넣기

 

예외처리는 좀 위험해 보여서 html 헤더에 넣는 방법으로 처리하기로 했다.

 

 

------------------------------------------------------

html 헤더에 csrf 코드 넣기 방법 2가지!

------------------------------------------------------

- html 에 넣기 -

- javascript 에 넣기 -

 

결국 둘 다 form 안에 csrf 코드를 넣어주는 원리는 같고 아래와 같이 한다.

 

1. html 에 넣기

form 안에 {% csrf_token %} 를 넣어주면 됨

 

 

2. javascript 에 넣기

소스)
    var form = document.createElement('form');
    form.setAttribute('method', 'post');
    form.setAttribute('action', '/data/');
    document.charset = "UTF-8";

    var hiddenField = document.createElement('input');
    hiddenField.setAttribute('type', 'hidden');
    hiddenField.setAttribute('name', 'csrfmiddlewaretoken');
    hiddenField.setAttribute('value', '{{csrf_token}}');
    form.appendChild(hiddenField);
 
    document.body.appendChild(form);
    form.submit();

빨강 박스 처럼 넣어주면 끝ㅋ

 

 

아래 참고 글들에서 Django 공식문서를 확인하여

javascript로 csrf를 생성해주는 코드를 만들어서

헤더에 붙여준다고 하는데...

좀 복잡해 보여서 우연히 1번에 html로 붙이는 코드는

사용자에게서 어떻게 보일까 궁금해서 코드를 보았는데

이렇게 input 박스가 생성된 것을 보고 2번과 같이 생성해 주니 잘 됐다ㅋㅋㅋ

코딩 잼네ㅋㅋㅋ

 

 

 

혹시 저 코드가 실행이 안된다면 셋팅이 덜 되어서 그럴 수도 있다.

최신 버전에는 기본으로 셋팅이 되어 있어서 생략했는데 (내 환경도 기본으로 셋팅되어 있었다)

아래 참고 사이트에서 기본 셋팅을 확인하고 가도 괜찮을 것 같다.

 

 

 

 

참고

Forbidden (CSRF token mis.. : 네이버블로그 (naver.com)

히즈웨드 장고(Django) 개발: 폼(Form) 관리와 CSRF 취약점 해결 (tistory.com)

[django] Forbidden (CSRF token missing or incorrect.) 해결하기! by Codong's Development Diary (tistory.com)

 

 

설정

트랙백

댓글