Flask 애플리케이션 배포 전 반드시 확인해야 할 보안 체크리스트

배포 전 마지막 점검! 보안이 뚫린 Flask 앱은 언제든 해킹당할 수 있습니다. 실전 체크리스트로 안전하게 배포하세요.

안녕하세요, 개발자 여러분! ICT리더 리치입니다. 오늘은 Flask로 웹 애플리케이션을 개발한 후 실제 서비스 환경에 배포하기 전에 꼭 점검해야 할 보안 체크리스트를 소개해드립니다. 배포는 단순한 코드 배포가 아니라, 외부의 공격으로부터 애플리케이션과 데이터를 지켜내는 철저한 준비 과정입니다.

이 글에서는 실무에서 자주 발생하는 실수들과 함께, Flask 배포 전 필수 보안 점검 항목들을 체크리스트 형식으로 알려드릴게요. Flask 초보자부터 운영 경험이 있는 분들까지 모두 도움이 되실 겁니다.

노트북 앞에서 Flask 보안 체크리스트를 확인 중인 전문가 분위기의 20대 여성
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 배포 보안 체크리스트를 검토 중인 20대 여성 개발자의 인포그래픽
Flask 애플리케이션 보안 체크리스트 – 배포 전 꼭 확인해야 할 보안 항목 6가지

4. 입력값 검증 및 필터링

사용자 입력을 검증하지 않으면 SQL Injection, XSS 공격 등에 취약해질 수 있습니다. Flask에서는 WTFormspydantic 등의 라이브러리를 활용하여 입력값 검증과 필터링을 철저히 수행해야 합니다.

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 도구를 통해 의존성 취약점 점검을 수행해야 합니다.

  1. pip install pip-audit
  2. pip-audit 실행하여 취약점 확인
  3. 의심스러운 패키지 제거 또는 업데이트

운영 서버에서는 불필요한 포트를 차단하고 최소 권한 원칙을 적용해야 합니다.
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 배포 전 보안 체크리스트를 점검하는 고급 인포그래픽
배포 전 Flask 앱 보안을 위한 핵심 점검사항 – HTTPS, 세션, CSRF 대응

7. 자주 묻는 질문 (FAQ)

Q Flask 배포 시 꼭 HTTPS를 사용해야 하나요?

네, 사용자의 개인정보 보호와 세션 보안을 위해 반드시 HTTPS로 서비스해야 합니다. 특히 로그인이나 결제가 있다면 필수입니다.

Q Flask에서 입력값 검증을 꼭 해야 하나요?

물론입니다. 사용자 입력을 검증하지 않으면 SQL Injection, XSS 등 다양한 공격에 노출됩니다.

Q Flask 배포 전 어떤 도구로 보안 점검을 하나요?

pip-audit, safety, bandit 등의 도구를 사용하여 의존성 및 코드 수준의 보안 점검을 수행할 수 있습니다.

Q 개발 중 디버그 모드는 꼭 꺼야 하나요?

배포 환경에서는 반드시 꺼야 합니다. 디버그 모드가 켜져 있으면 서버 로그와 환경 정보가 노출될 수 있어 보안상 매우 위험합니다.

Q 세션 보안 설정에서 가장 중요한 항목은?

SESSION_COOKIE_SECURE, HTTPONLY, SAMESITE 설정은 꼭 활성화해야 하며, 이는 세션 탈취와 CSRF 방지에 큰 도움이 됩니다.

8. 마무리 요약

✅ 보안 점검은 배포의 마무리가 아니라 시작입니다

Flask 애플리케이션의 보안은 단순한 설정 하나로 해결되지 않습니다. 디버그 모드 비활성화, HTTPS 적용, 세션/쿠키 보안부터 입력값 필터링, HTTP 헤더 구성, 패키지 점검까지 모든 과정이 서로 연결되어 사용자의 데이터를 안전하게 지키는 방패가 됩니다.

보안 체크리스트를 점검하며 한 단계 더 안정적인 서비스를 구축해보세요. 개발자의 꼼꼼한 시선이 최고의 보안입니다.

댓글

이 블로그의 인기 게시물

(시큐어코딩)Express 기반 Node.js 앱 보안 강화를 위한 핵심 기능

React, Vue, Angular 비교 분석 – 내 프로젝트에 가장 적합한 JS 프레임워크는?

CryptoJS vs Web Crypto API: 어떤 암호화 방식이 더 좋을까?(자바스크립트 암호화)