Flask 웹 애플리케이션 보안 개발

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Flask 를 사용하여 웹 애플리케이션을 개발할 때 중요한 보안 고려 사항을 살펴봅니다. Cross-Site Scripting (XSS), Cross-Site Request Forgery (CSRF), JSON 보안, 보안 헤더, 그리고 안전한 쿠키 옵션과 같은 주제를 다룰 것입니다. 이 단계를 따르면 Flask 애플리케이션의 보안을 강화하는 방법을 배우게 됩니다.

참고: 코드 파일을 직접 생성하고 환경에서 실행해야 합니다. Web 5000 에서 Flask 서비스 상태를 미리 볼 수 있습니다.

Cross-Site Scripting (XSS)

Cross-Site Scripting (XSS) 는 공격자가 사용자가 보는 웹 페이지에 악성 스크립트를 주입할 수 있도록 하는 취약점입니다. Flask 에서 XSS 공격을 방지하려면 다음 지침을 따르십시오.

  • 항상 텍스트를 이스케이프하여 임의의 HTML 태그가 포함되는 것을 방지합니다.
  • Jinja2 템플릿의 도움 없이 HTML 을 생성할 때는 주의하십시오.
  • Markup 클래스를 사용하여 사용자가 제출한 데이터를 이스케이프합니다.
  • 업로드된 파일에서 HTML 또는 텍스트 파일을 보내는 것을 피하십시오.

예제 코드:

## app.py

from flask import Flask, render_template_string, Markup

app = Flask(__name__)

@app.route('/')
def index():
    value = '<script>alert("XSS Attack")</script>'
    safe_value = Markup.escape(value)
    return render_template_string('<input value="{{ value }}">', value=safe_value)

코드를 실행하려면 app.py라는 파일에 저장하고 flask run 명령을 실행하십시오.

Cross-Site Request Forgery (CSRF)

Cross-Site Request Forgery (CSRF) 는 사용자가 웹사이트에서 의도하지 않은 작업을 수행하도록 속이는 공격입니다. Flask 에서 CSRF 공격을 방지하려면 다음 지침을 따르십시오.

  • 서버 콘텐츠를 수정하는 요청을 검증하기 위해 일회성 토큰을 사용합니다.
  • 쿠키에 토큰을 저장하고 폼 데이터와 함께 전송합니다.
  • 서버에서 수신된 토큰과 쿠키에 저장된 토큰을 비교합니다.

예제 코드:

## app.py

from flask import Flask, request, session, redirect, url_for

app = Flask(__name__)
app.secret_key = 'secret_key'

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/delete', methods=['POST'])
def delete_user():
    if request.method == 'POST':
        token = request.form.get('token')
        if token and token == session.get('csrf_token'):
            ## Delete user profile
            return redirect(url_for('index'))
    return 'Invalid request'

if __name__ == '__main__':
    app.run()

코드를 실행하려면 app.py라는 파일에 저장하고 flask run 명령을 실행하십시오.

JSON 보안

Flask 에서 JSON 응답의 보안을 보장하는 것은 중요합니다. Flask 0.10 이전 버전에서는 보안 취약점으로 인해 최상위 배열이 JSON 으로 직렬화되지 않았습니다. 그러나 이 동작이 변경되어 이제 최상위 배열이 직렬화됩니다. 이러한 보안 개선 사항을 활용하려면 최신 버전의 Flask 를 사용하는 것이 좋습니다.

보안 헤더

브라우저는 보안을 제어하기 위해 다양한 응답 헤더를 인식합니다. Flask 애플리케이션에서 다음 보안 헤더를 검토하고 사용하는 것이 좋습니다.

  • HTTP Strict Transport Security (HSTS): 브라우저에게 모든 HTTP 요청을 HTTPS 로 변환하도록 지시합니다.
  • Content Security Policy (CSP): 다양한 유형의 리소스를 어디에서 로드할 수 있는지 지정합니다.
  • X-Content-Type-Options: 브라우저가 응답 콘텐츠 유형을 준수하도록 강제합니다.
  • X-Frame-Options: 외부 사이트가 iframe 에 사이트를 포함하는 것을 방지합니다.

Flask 애플리케이션에서 HTTPS 및 보안 헤더를 관리하기 위해 Flask-Talisman 확장을 사용할 수 있습니다.

Flask 에서 쿠키를 설정할 때, 민감한 데이터를 보호하기 위해 보안 옵션을 고려하는 것이 중요합니다. 권장되는 몇 가지 옵션은 다음과 같습니다.

  • Secure: 쿠키를 HTTPS 트래픽으로만 제한합니다.
  • HttpOnly: JavaScript 를 사용하여 쿠키 내용을 읽는 것을 방지합니다.
  • SameSite: 외부 사이트의 요청과 함께 쿠키가 전송되는 방식을 제한합니다.

예제 코드:

## app.py

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/')
def index():
    response = make_response('Hello, world!')
    response.set_cookie('username', 'flask', secure=True, httponly=True, samesite='Lax')
    return response

if __name__ == '__main__':
    app.run()

코드를 실행하려면 app.py라는 파일에 저장하고 flask run 명령을 실행하십시오.

HTTP Public Key Pinning (HPKP)

HTTP Public Key Pinning (HPKP) 는 브라우저가 특정 인증서 키만을 사용하여 서버를 인증하도록 지시하는 보안 기능입니다. 이는 보안을 강화할 수 있지만, 잘못 설정하거나 업그레이드하면 되돌리기가 어렵습니다. HPKP 를 사용할 때는 주의를 기울이고 적절한 구성을 확인하십시오.

요약

이 랩에서는 Flask 를 사용하여 웹 애플리케이션을 개발할 때 중요한 보안 고려 사항을 살펴보았습니다. Cross-Site Scripting (XSS) 및 Cross-Site Request Forgery (CSRF) 공격을 방지하기 위한 조치, JSON 응답 보안, 보안 헤더 및 쿠키 옵션 설정에 대해 다루었습니다. 이러한 보안 관행을 따르면 Flask 애플리케이션의 보안을 강화하고 잠재적인 취약성으로부터 사용자 데이터를 보호할 수 있습니다.