Flask 애플리케이션 배포 전 반드시 확인해야 할 보안 체크리스트
배포 전 마지막 점검! 보안이 뚫린 Flask 앱은 언제든 해킹당할 수 있습니다. 실전 체크리스트로 안전하게 배포하세요.
안녕하세요, 개발자 여러분! ICT리더 리치입니다. 오늘은 Flask로 웹 애플리케이션을 개발한 후 실제 서비스 환경에 배포하기 전에 꼭 점검해야 할 보안 체크리스트를 소개해드립니다.
배포는 단순한 코드 배포가 아니라, 외부의 공격으로부터 애플리케이션과 데이터를 지켜내는 철저한 준비 과정입니다.
이 글에서는 실무에서 자주 발생하는 실수들과 함께, Flask 배포 전 필수 보안 점검 항목들을 체크리스트 형식으로 알려드릴게요.
Flask 초보자부터 운영 경험이 있는 분들까지 모두 도움이 되실 겁니다.
📌 바로가기 목차
| Flask 배포 준비 중 보안 점검을 수행하는 개발자 여성 썸네일 이미지 |
1. 디버그 모드 비활성화 여부 확인
Flask 개발 중에는 debug=True 설정으로 실시간 코드 수정과 에러 로그를 확인할 수 있습니다.
하지만 이 설정이 실 서비스 환경에 그대로 남아있다면 공격자가 전체 코드 흐름과 환경 정보를 열람할 수 있어 치명적인 보안 위협이 됩니다.
배포 전 반드시 debug=False 또는 해당 옵션을 제거하여 디버그 모드를 끄는 것을 잊지 마세요.
Flask는 개발 중에는 디버그 모드를 활성화하지만, 배포 시에는 반드시 꺼야 합니다.
디버그 모드가 켜져 있으면 서버 내 민감 정보와 에러 스택이 외부에 그대로 노출될 수 있습니다.
아래는 config 파일에서 DEBUG 설정을 제어하는 예시입니다.
# config.py – 설정 파일
import os
class Config:
DEBUG = False
TESTING = False
SECRET_KEY = os.environ.get('SECRET_KEY', 'default_key')
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SECURE = True
PREFERRED_URL_SCHEME = 'https'
class DevelopmentConfig(Config):
DEBUG = True
ENV = 'development'
class ProductionConfig(Config):
ENV = 'production'
DEBUG = False
# app.py에서 환경 설정 사용
from flask import Flask
import os
app = Flask(__name__)
env = os.environ.get('FLASK_ENV', 'production')
if env == 'development':
app.config.from_object('config.DevelopmentConfig')
else:
app.config.from_object('config.ProductionConfig')
if __name__ == "__main__":
app.run()
2. HTTPS 및 SSL 인증서 적용 상태
HTTPS는 사용자의 데이터(예: 로그인 정보, 결제 정보 등)를 암호화하여 제3자에게 노출되는 것을 방지합니다. HTTP로만 서비스할 경우 로그인 세션 탈취나 중간자 공격(MITM)의 위험이 크기 때문에, SSL 인증서를 적용한 HTTPS 프로토콜 사용은 선택이 아닌 필수입니다.
| 점검 항목 | 설명 |
|---|---|
| SSL 인증서 설치 | Let's Encrypt 또는 상용 인증서를 이용해 HTTPS 적용 |
| HTTP to HTTPS 리디렉션 | Flask에서 before_request()나 웹 서버 설정으로 리디렉션 처리 |
| 인증서 유효기간 점검 | 자동 갱신 설정 또는 수동 갱신 주기 관리 |
HTTPS는 데이터 암호화를 통해 중간자 공격과 도청을 막아줍니다.
Let’s Encrypt를 활용해 Flask 앱에 무료 SSL 인증서를 적용할 수 있으며, gunicorn이나 nginx 연동 시에도 유용합니다.
# Certbot으로 SSL 인증서 발급 (Ubuntu 기준)
sudo apt update
sudo apt install certbot python3-certbot-nginx
# Nginx 설정 파일 예시
sudo nano /etc/nginx/sites-available/flaskapp
# 아래 내용 추가
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5000;
include proxy_params;
proxy_redirect off;
}
}
3. 세션 및 쿠키 보안 설정
세션과 쿠키는 인증 정보를 담고 있어 노출 시 큰 피해로 이어질 수 있습니다. Flask의 세션 설정 중 Secure, HttpOnly, SameSite 속성은 반드시 설정되어야 합니다.
- SESSION_COOKIE_SECURE = True → HTTPS에서만 쿠키 전송
- SESSION_COOKIE_HTTPONLY = True → 자바스크립트 접근 차단
- SESSION_COOKIE_SAMESITE = 'Lax' → 사이트 간 요청 제한
세션 쿠키는 민감한 사용자 정보를 담고 있으므로 보안 설정이 필수입니다.
다음은 Flask 앱에서 안전한 세션/쿠키 설정 예시입니다.
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'your-secret-key'
# 세션 관련 보안 설정
app.config.update(
SESSION_COOKIE_HTTPONLY=True, # JS 접근 방지
SESSION_COOKIE_SECURE=True, # HTTPS 전용 쿠키
SESSION_COOKIE_SAMESITE='Lax', # CSRF 방지
PERMANENT_SESSION_LIFETIME=1800 # 30분
)
@app.route('/')
def index():
session['user'] = 'admin'
return "Session Set"
@app.route('/get')
def get():
user = session.get('user', 'anonymous')
return f"User: {user}"
if __name__ == '__main__':
app.run(ssl_context='adhoc') # 개발용 HTTPS
![]() |
| Flask 애플리케이션 보안 체크리스트 – 배포 전 꼭 확인해야 할 보안 항목 6가지 |
4. 입력값 검증 및 필터링
사용자 입력을 검증하지 않으면 SQL Injection, XSS 공격 등에 취약해질 수 있습니다. Flask에서는 WTForms나 pydantic 등의 라이브러리를 활용하여 입력값 검증과 필터링을 철저히 수행해야 합니다.
CSRF 공격은 사용자의 의지와 상관없이 요청이 전송되는 보안 취약점입니다.
Flask-WTF 확장 모듈을 사용하면 CSRF 보호 토큰을 자동으로 처리할 수 있습니다.
from flask import Flask, render_template, request
from flask_wtf.csrf import CSRFProtect
from wtforms import Form, StringField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'super-secret-key'
csrf = CSRFProtect(app)
class NameForm(Form):
name = StringField('Name')
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm(request.form)
if request.method == 'POST':
name = form.name.data
return f"Hello, {name}"
return render_template('form.html', form=form)
if __name__ == '__main__':
app.run()
5. 보안 관련 HTTP 헤더 구성
HTTP 응답 헤더를 적절히 설정하면 클라이언트에서의 공격을 사전에 차단할 수 있습니다. Flask에서는 after_request()를 이용해 보안 헤더를 추가할 수 있으며, 대표적으로 아래와 같은 헤더가 사용됩니다.
| 헤더명 | 기능 |
|---|---|
| Content-Security-Policy | 스크립트, 이미지 등의 출처를 제한하여 XSS 방지 |
| X-Frame-Options | 클릭재킹 방지 (예: DENY 또는 SAMEORIGIN) |
| Strict-Transport-Security | HTTPS 연결 강제 적용 |
XSS는 악성 스크립트가 웹사이트에 삽입되어 사용자의 브라우저에서 실행되는 공격입니다.
입력값을 검증하고 출력 시 escape 처리를 통해 XSS를 방지할 수 있습니다.
from flask import Flask, request, render_template_string
import html
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
name = ""
if request.method == 'POST':
name = request.form.get('name', '')
name = html.escape(name) # XSS 필터링
return render_template_string('''
안녕하세요, {{ name }}
''', name=name)
if __name__ == '__main__':
app.run()
6. 패키지 취약점 점검 및 의존성 업데이트
Flask는 다양한 외부 패키지에 의존하며, 이 중 일부는 알려진 보안 취약점을 포함할 수 있습니다.
배포 전 반드시 pip-audit 또는 safety 도구를 통해 의존성 취약점 점검을 수행해야 합니다.
- pip install pip-audit
- pip-audit 실행하여 취약점 확인
- 의심스러운 패키지 제거 또는 업데이트
운영 서버에서는 불필요한 포트를 차단하고 최소 권한 원칙을 적용해야 합니다.
UFW 방화벽을 설정하고 웹 서버 외 접근을 제한하는 것이 중요합니다.
# UFW 방화벽 설정
sudo apt update
sudo apt install ufw
# 기본 정책 설정
sudo ufw default deny incoming
sudo ufw default allow outgoing
# HTTP/HTTPS만 허용
sudo ufw allow 80
sudo ufw allow 443
# SSH 허용 (필수)
sudo ufw allow 22
# 방화벽 활성화
sudo ufw enable
# 상태 확인
sudo ufw status verbose
![]() |
| 배포 전 Flask 앱 보안을 위한 핵심 점검사항 – HTTPS, 세션, CSRF 대응 |
7. 자주 묻는 질문 (FAQ)
네, 사용자의 개인정보 보호와 세션 보안을 위해 반드시 HTTPS로 서비스해야 합니다. 특히 로그인이나 결제가 있다면 필수입니다.
물론입니다. 사용자 입력을 검증하지 않으면 SQL Injection, XSS 등 다양한 공격에 노출됩니다.
pip-audit, safety, bandit 등의 도구를 사용하여 의존성 및 코드 수준의 보안 점검을 수행할 수 있습니다.
배포 환경에서는 반드시 꺼야 합니다. 디버그 모드가 켜져 있으면 서버 로그와 환경 정보가 노출될 수 있어 보안상 매우 위험합니다.
SESSION_COOKIE_SECURE, HTTPONLY, SAMESITE 설정은 꼭 활성화해야 하며, 이는 세션 탈취와 CSRF 방지에 큰 도움이 됩니다.
8. 마무리 요약
✅ 보안 점검은 배포의 마무리가 아니라 시작입니다
Flask 애플리케이션의 보안은 단순한 설정 하나로 해결되지 않습니다.
디버그 모드 비활성화, HTTPS 적용, 세션/쿠키 보안부터
입력값 필터링, HTTP 헤더 구성, 패키지 점검까지
모든 과정이 서로 연결되어 사용자의 데이터를 안전하게 지키는 방패가 됩니다.
보안 체크리스트를 점검하며 한 단계 더 안정적인 서비스를 구축해보세요.
개발자의 꼼꼼한 시선이 최고의 보안입니다.


댓글
댓글 쓰기