만약 django 사용시 form을 제출했을 때 CSRF 오류를 리턴한다면, CSRF token을 request에 같이 삽입한 뒤에 전송하지 않았기 때문에 발생한 것이다.
그래서 아래와 같은 에러 화면을 보게 될 거다:
django framework는 CSRF(Cross Site Request Forgery) 공격을 방지하기 위해, 편리하게 token을 사용한다.
쉽게 말해, django에서 리턴된 HTML 파일에는 CSRF token 값이 박혀 있어서, form의 submit에 의해 request가 django 서버로 오면, 앞서 보냈던 CSRF token 값이 request에 잘 포함되어 다시 돌아왔는지 서버에서 검증하는 것이다.
이를 적용하려면, django 서버에서 리턴하는 HTML 파일에 CSRF token이 같이 저장되도록 하면 된다.
HTML 파일에서, POST 방식을 사용하는 <form> tag 내에 {% csrf_token %}라는 template tag를 추가하면 된다.
해당 <form>이 render될 때, django는 {% csrf_token %}를 실제 CSRF token 값으로 대체한다.
(CSRF token 값은 django 서버에 의해 생성되며, HTML 파일의 매번 리턴 시마다 변경된다.)
CSRF token 값은 일반적으로 <form> 내의 hidden된, "csrfmiddlewaretoken" 라는 이름을 가진 <input> tag로서 HTML 페이지에 포함된다.
<input type="hidden" name="csrfmiddlewaretoken" value="실제 CSRF token 값">
해당 token은 form이 submit될 때 browser에 의해 request에 포함되며, django 서버에 의해 그 유효성이 검증된다.
그 뒤에, django 서버는 request에 대한 view page를 연결해준다.
[CSRF token 사용법]
사용자에게 리턴되어 render될 HTML 코드 내에, {% csrf_token %}를 <form> tag 내부에 박아주자.
<body>
<form action="http://localhost:8000/memo/writeMemo/" method="POST" id="memoWriteForm">
{% csrf_token %}
<input type="text" name="memContent" placeholder="메모">
</form>
<div>
<button type="submit" form="memoWriteForm">메모 쓰기</button>
</div>
</body>
실제 render되는 html 출력 값을 확인해보자.
django에 의해 {% csrf_token %}가 hidden된 <input> tag로 변경되었다.
<body>
<form action="http://localhost:8000/memo/writeMemo/" method="POST" id="memoWriteForm">
<input type="hidden" name="csrfmiddlewaretoken" value="JgcYMzhTo2srNdLGPF7nEFoOkiw1HgOOHenFgoQtlPbFrb7BwKP3dLenSQiPkfib">
<input type="text" name="memContent" placeholder="메모">
</form>
<div>
<button type="submit" form="memoWriteForm">메모 쓰기</button>
</div>
</body>
'django' 카테고리의 다른 글
[django] Model attribute들은 어떤 class attribute일까? (0) | 2023.11.23 |
---|