프로그래밍 언어/Python

Flask 폼 처리, 사용자 입력, GET/POST 차이, CSRF 보안 설정 방법 - Flask #4

eco7T 2025. 4. 15. 09:31
반응형

 

웹 애플리케이션에서 사용자의 입력을 받아 처리하는 일은 거의 모든 기능의 출발점입니다. 회원가입, 로그인, 검색창, 문의 폼, 게시글 작성 등 대부분의 인터랙션은 사용자가 정보를 입력하고 서버가 그 값을 받아 처리하는 흐름으로 작동합니다. 이 단락에서는 Flask 기반 웹 애플리케이션에서 HTML 폼을 구성하고, 사용자 입력을 수신하여 처리하는 전 과정을 실무 흐름에 맞게 설명합니다.

HTML 폼과 Flask 연동
HTML 폼과 Flask 연동

 

반응형

 

HTML 폼과 Flask 연동

웹에서 폼(form)이란 사용자가 텍스트를 입력하거나 선택한 값을 서버로 전송할 수 있도록 구성된 구조입니다. HTML에서는   <form> 태그를 사용하며, 이 안에 다양한 입력 필드( <input> <textarea> <select>  등)가 들어갑니다.

 

폼의 주요 속성

  •  action : 사용자가 입력한 데이터를 어디(URL)로 보낼 것인지 지정
  •  method : 데이터를 어떤 방식(GET, POST 등)으로 보낼 것인지 결정
<form action="/submit" method="post">
  <input type="text" name="username">
  <input type="submit" value="보내기">
</form>

위의 예제는 이름을 입력받고  /submit  경로로 POST 방식으로 전송합니다. 하지만 여기서 중요한 것은, Flask에서 이 경로를 어떻게 처리하느냐입니다.

 

 

 

  Flask에서 폼 데이터를 받는 흐름

라우팅과 request 객체의 연결

Flask에서는 사용자가 입력한 데이터를 받기 위해 해당 경로에 대응하는 함수를 작성합니다. 예를 들어  /submit 이라는 URL로 POST 요청이 들어올 때 실행될 함수를 다음과 같이 정의합니다.

from flask import Flask, request

app = Flask(__name__)

@app.route('/submit', methods=['POST'])
def submit():
    username = request.form.get('username', '익명')
    return f"안녕하세요, {username}님!"
  •  request.form : HTML 폼에서 전송된 데이터를 받아오는 객체입니다.  request.form[ username ]  또는  request.form.get( username ) 처럼 사용합니다.
  •  request.form.get( username ,  익명 ) : 사용자가 입력하지 않았거나 필드가 누락됐을 때 오류 없이 기본값으로 처리할 수 있도록 해줍니다.

이 구조는 ‘폼의 name 속성 → Flask의 request 객체 → 데이터 처리’라는 흐름으로 이해하면 됩니다.

 

 

  request.form vs request.args

GET과 POST의 차이

  • GET 방식은 데이터를 URL 뒤에 붙여 전송합니다. 검색창, 필터링 등 데이터가 짧고 민감하지 않은 경우에 사용합니다.
  • POST 방식은 데이터를 HTTP 본문에 담아 전송하므로 보안상 조금 더 안전하며, 주로 회원가입, 로그인, 글쓰기 등에 사용됩니다.

 

Flask에서 수신 방식

방식 설명 Flask 수신 방식
GET 주소창에 데이터 포함  request.args.get('key') 
POST 본문(body)에 데이터 포함  request.form.get('key') 

 

예를 들어,  /search?keyword=apple 이라는 URL로 요청이 오면,

@app.route('/search')
def search():
    keyword = request.args.get('keyword')
    return f"{keyword}에 대한 검색 결과입니다."

 

 

반대로, 폼을 통해 POST로 보낸 요청은  request.form.get() 으로 수신합니다. 실무에서는 URL 뒤에 붙는 값은 GET, 입력 폼을 통한 데이터는 POST로 구분하여 처리합니다.

 

 

  GET과 POST의 실전 활용 구분

구분 GET 방식 사용 예 POST 방식 사용 예
검색 키워드 검색 고급 검색
단순 조회 페이지 이동 글 작성
데이터 보안 필요 없음 필요 있음 (비밀번호 등)

 

  • POST 요청을 받는 라우트는 반드시  methods=['POST'] 를 명시해야 합니다.
  • GET 요청에 비해 POST는 브라우저 주소창에 데이터가 보이지 않아 민감 정보 처리에 적합하지만, 여전히 HTTPS로 암호화되지 않으면 완벽히 안전하진 않습니다.

 

 

  CSRF 보호와 Flask-WTF

CSRF(Cross Site Request Forgery)는 사용자가 로그인 상태일 때 공격자가 위조된 요청을 자동으로 전송하게 만들어 사용자의 권한으로 악의적인 요청을 처리하게 만드는 공격 방식입니다. 쉽게 말해, 사용자가 로그인한 사이트를 이용해 모르게 요청을 보내게 하는 방식입니다.

 

Flask-WTF란?

 Flask-WTF 는 CSRF 보호 기능을 내장한 확장 모듈입니다. Flask에서 웹 폼을 더욱 안전하게 다룰 수 있도록 해줍니다.

pip install flask-wtf

 

 

 

 

기본 사용법

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class NameForm(FlaskForm):
    name = StringField('이름', validators=[DataRequired()])
    submit = SubmitField('제출')

 

이제 HTML 템플릿에서는 다음과 같이 CSRF 보호 토큰을 자동 포함시킬 수 있습니다.

<form method="post">
    {{ form.csrf_token }}
    {{ form.name.label }} {{ form.name() }}
    {{ form.submit() }}
</form>

이 토큰이 없으면 서버는 폼 데이터를 받지 않습니다. 보안이 필요한 모든 POST 폼에는 CSRF 보호가 필수입니다.

반응형