# 설치
pip install flask-wtf
# 추가로 freeze
pip freeze > requirements.txt
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, EqualTo
class LoginForm(FlaskForm):
user_id = StringField('User Id', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
from flask import Flask
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect()
app = Flask(__name__) # 필요한 경우 내부에서만 참조하기때문
csrf.init_app(app)
- CSRF 특정 블루프린트에서 제거처리
- 프로덕션 환경에서도, API 문서를 정상 테스트 처리해주기 위해선 IP ACL등을 정하는 듯 조치필요.
bp = Blueprint(...)
csrf.exempt(bp)
@app.route('/some-view', methods=['POST'])
@csrf.exempt
def some_view():
- CSRF 토큰 검증
- CSRF방어가 필요한 요청(=쓰기/변경이 가능한 엔드포인트 및 메서드들) 마다 특정 토큰을 포함시켜서 요청하여, 서버에서 비교하는 방식
<!--적용 방식-->
<!--JavaScript Requests-->
<script type="text/javascript">
var csrf_token = "{{ csrf_token() }}";
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrf_token);
}
}
});
</script>
<!--HTML Forms1 -->
<form method="post">
{{ form.csrf_token }}
</form>
<!--HTML Forms2 -->
<form method="post">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
</form>
참고 자료