프로그래밍/Python

[Python 강의] 27강 - Flask 애플리케이션을 위한 보안 최적화

월횽 2024. 11. 5. 06:30
728x90
반응형
SMALL

안녕하세요! 그레이 해커 월횽입니다. 오늘은 Flask 애플리케이션의 보안 강화에 대해 알아보겠습니다. 웹 애플리케이션의 보안은 민감한 정보 보호와 사용자 신뢰 유지에 매우 중요하므로, 여러 보안 기법을 알아보며 Flask 애플리케이션을 보호하는 방법을 살펴보겠습니다.

 

 

1. HTTPS 설정

애플리케이션과 사용자가 주고받는 데이터를 암호화하려면 HTTPS를 사용해야 합니다. 이는 전송되는 데이터가 도청되거나 변조되지 않도록 보호합니다.

· SSL 인증서 설치: SSL 인증서를 발급받아 웹 서버에 설치하여 HTTPS를 활성화합니다.
· Flask 설정: Flask 애플리케이션에서 HTTPS 전용으로 설정할 수 있습니다.

from flask import Flask

app = Flask(__name__)
app.config['PREFERRED_URL_SCHEME'] = 'https'

 

 

 

2. CSRF(Cross-Site Request Forgery) 보호

CSRF는 사용자가 알지 못하는 사이에 악의적인 요청이 전송되는 공격입니다. Flask-WTF를 사용해 CSRF 공격을 방어할 수 있습니다.

pip install Flask-WTF
반응형
from flask_wtf import CSRFProtect

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
csrf = CSRFProtect(app)

 

 

 

3. XSS(Cross-Site Scripting) 방어

XSS는 악성 스크립트를 주입하여 사용자 브라우저에서 실행하게 하는 공격입니다. HTML을 렌더링할 때 Jinja2 템플릿 엔진이 기본적으로 자동으로 이를 방지합니다.

<!-- 사용자 입력을 HTML 엔터티로 변환 -->
<p>{{ user_input }}</p>

 

 

 

4. SQL Injection 방어

SQL Injection은 SQL 쿼리에 악성 코드를 삽입하는 공격입니다. Flask의 ORM인 SQLAlchemy를 사용하여 쿼리 파라미터를 안전하게 처리할 수 있습니다.

# 안전한 쿼리 예시
user = User.query.filter_by(username=username).first()

 

 

 

5. 보안 헤더 추가

Flask-Talisman을 사용하여 보안 헤더를 쉽게 추가할 수 있습니다. 이 헤더들은 브라우저가 애플리케이션을 더 안전하게 처리하도록 돕습니다.

pip install flask-talisman
728x90
from flask import Flask
from flask_talisman import Talisman

app = Flask(__name__)
Talisman(app)

 

 

 

6. 비밀번호 암호화 저장

비밀번호는 평문이 아닌 해시 형태로 저장해야 합니다. Werkzeug의 generate_password_hash와 check_password_hash를 사용해 비밀번호를 안전하게 저장하고 인증할 수 있습니다.

SMALL
from werkzeug.security import generate_password_hash, check_password_hash

hashed_password = generate_password_hash("mypassword")
is_password_correct = check_password_hash(hashed_password, "mypassword")

 

 

 

7. JWT 보안 강화

JWT를 사용할 때 만료 시간을 설정하고, HTTPS 통신을 통해 전송하며, 토큰 서명 키를 안전하게 관리하는 것이 중요합니다.

from datetime import timedelta

app.config['JWT_SECRET_KEY'] = 'your_jwt_secret_key'
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = timedelta(hours=1)

 

 

 

8. 인증과 권한 관리

사용자 인증 후 각 사용자에게 필요한 권한만 부여하는 것이 중요합니다. @login_required나 사용자 역할 확인을 통해 권한을 세분화할 수 있습니다.

from flask_jwt_extended import jwt_required, get_jwt_identity

@app.route('/admin')
@jwt_required()
def admin():
    current_user = get_jwt_identity()
    if current_user['role'] != 'admin':
        return jsonify({"msg": "접근 권한이 없습니다."}), 403
    return jsonify({"msg": "관리자 접근 허용"})

 

 

 

9. 보안 테스트 및 모니터링

주기적으로 애플리케이션의 취약점을 테스트하고 모니터링하여 보안을 강화합니다. OWASP ZAP과 같은 도구를 사용하여 취약점을 점검할 수 있습니다.

 

다음 시간에는 Flask를 이용한 비동기 작업 처리에 대해 알아보겠습니다!

 

 

 

 

 

- 이전 수업 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST