본문 바로가기
Python/Django Ⅰ

CSRF_TOKEN 과 DB 입출력

by Mr.DonyStark 2024. 4. 15.

□ 장고는 CSRF (Cross Site Request Forgery)와 위조방지를 위해 자체적으로 토큰을 발행하는데 이를 CSRF_TOKEN 이라고 함.

반드시 데이터를 요청할 때, 즉, 사용자의 request가 발생하면 이와 함께 CSRTF_TOKEN을 함께 보내어 위조를 방지함.

보통은 템플릿 상의 Form 태그 내에 {% crtf_token %} 이라고 코딩함.

{% csrf_token %}

 

토큰을 바탕으로 장고 프레임워크에서는 자동으로 유효성 검증 후 적절한 View를 연결함.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Memmo Write Form</title>
        <style>
            form > label{
                display: inline-block;
                width: 120px;
            }
            form > input{
                padding : 4px;
                margin-bottom : 4px;
            }
        </style>
    </head>
    <body>
        <h1>Onememo Form</h1>
        <form action="http://localhost:8000/onememos/createMemo/" method="POST" id="memoWriteForm">
            {% csrf_token %}
        <!--
            CSRF(Cross Site Request Forgery) 토큰 : 특정 사용자가 마치 접속하여 요청값을 보낸것처럼 글 작성. 즉, 위조된(가짜) 요청액션을 보내 악의적으로 요청을 이용하는 행위 즉, iframe 등을 몰래 삽입하여 로그인한 사용자가 본인도 모르게 글을 작성하는 행위. 
            이를 위해 장고에서는 토근을 생성 후 사용자 요청 후 함께 보냄. 장고 프렘워크에서는 이러한 CSRF 공격에 대한 방어로 CSRF_TOKEN을 이용. CSRF_TOKEN 발급은 값이 매번 변경되며 전송된 토큰을 통해 뷰가 호출되기 전 유효성을 검증함.
            Post 방식을 사용하는 템플릿 from 태그 쪽에 {%csrf_token%} 과 같이 템플릿 토큰을 사용해줌.
        -->
            <label for="memo">한줄메모</label>
            <input type="text" id="memo" name="memoContent" size="100" placeholder="내용을 입력해주세요." autocomplete="off">
            <br>
            <label for="memo">이름</label>
            <input type="text" id="memo" name="memoName" size="100" placeholder="내용을 입력해주세요." autocomplete="off">
            <br>
            <label for="memo">이메일</label>
            <input type="text" id="memo" name="memoEmail" size="100" placeholder="내용을 입력해주세요." autocomplete="off">
            <br>
        </form>
        <div>
        <button type="submit" form="memoWriteForm">등록</button>
        </div>                
    </body>
</html>

좌) csrf_token 기재 전 / 우) csrf_token 기재 후 : csrf_token을 지정해줌에 따라 키값이 복호화되어 자동으로 생성된 것을 확인 할 수 있음.

 

□ Html 코드를 보면 memo, name, email을 입력받는 form 태그 네임을 memowriteform으로 지정했음. 지정된 memowriteform은 사용자가 버튼을 누르는 동시에 submit 됨과 동시에 views 에서 지정한 함수명과 이를 바탕으로 지정한 urlpattern에 따라 새로운 페이지로 전달됨.

 

→ 템플릿 폼으로 부터 받은 memo, name, email에 대한 name 정보들이 합쳐진 memowriteform을 매개변수로 받음에 따라 입력받은 내용을 지정한 url에서 출력되도록 설정.

'Python > Django Ⅰ' 카테고리의 다른 글

DJANGO CRUD : C(Create), R(Read)  (0) 2024.05.07
Get / Post 방식  (0) 2024.05.07
SQLite 를 활용한 DB 조회  (0) 2024.04.15
서브페이지 URLPATTERNS  (0) 2024.04.15
Models 생성  (0) 2024.04.13