웹 애플리케이션에서 사용자의 입력을 받아 처리하는 일은 거의 모든 기능의 출발점입니다. 회원가입, 로그인, 검색창, 문의 폼, 게시글 작성 등 대부분의 인터랙션은 사용자가 정보를 입력하고 서버가 그 값을 받아 처리하는 흐름으로 작동합니다. 이 단락에서는 Flask 기반 웹 애플리케이션에서 HTML 폼을 구성하고, 사용자 입력을 수신하여 처리하는 전 과정을 실무 흐름에 맞게 설명합니다.
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 보호가 필수입니다.
'프로그래밍 언어 > Python' 카테고리의 다른 글
tiktoken 라이브러리 활용 - OpenAI LLM 토큰 계산으로 AI 모델 비용 예상하기 (0) | 2025.05.28 |
---|---|
Flask 데이터베이스, SQLAlchemy와 SQLite로 모델, 마이그레이션, CRUD - Flask #5 (0) | 2025.04.17 |
웹 UI 개발을 위한 Flask 템플릿 엔진 Jinja2 조건문과 템플릿 구조 가이드 - Flask #3 (0) | 2025.04.10 |
Flask 웹 개발 입문자를 위한 URL 매핑과 HTTP 메서드 처리 가이드 - Flask #2 (0) | 2025.04.07 |
Django vs Flask 파이썬 웹 프레임워크 비교 - Flask #1 (0) | 2025.04.01 |