Flask

Chapter 4-8(1) Flask 애플리케이션에서 HTTP 기본 인증 사용

Chansman 2025. 4. 22. 20:45

📌 개념 정리

Flask는 파이썬 기반의 웹 프레임워크로, 간단한 웹 애플리케이션을 빠르게 구축할 수 있게 도와줍니다. Flask는 기본적으로 경량화된 구조를 제공하며, 필요한 라이브러리나 기능을 추가해가며 확장할 수 있습니다. 이번 예제에서는 Flask와 flask_httpauth 라이브러리를 사용하여 사용자 인증을 구현하고, 보호된 페이지를 구현하는 방법을 다루고 있습니다.

🚦 동작 원리 및 구조

이 Flask 애플리케이션은 기본적으로 두 가지 페이지를 제공합니다:

  1. 홈 페이지 (/ 경로) - 기본적으로 사용자가 접속할 수 있는 페이지입니다.
  2. 보호된 페이지 (/protected 경로) - 인증된 사용자만 접근할 수 있는 페이지입니다.

인증 흐름:

  • 사용자가 페이지에 접근하면, flask_httpauth 라이브러리의 verify_password 함수를 사용해 사용자 인증을 처리합니다.
  • 인증된 사용자만 protected 페이지에 접근할 수 있습니다.

구조:

  • app.py: 애플리케이션의 핵심 로직을 포함한 파일입니다. Flask 서버를 실행하고, 두 페이지(index, protected)를 제공합니다. 인증 기능도 여기에서 처리됩니다.
  • index.html: 홈 페이지로, 사용자가 접근할 수 있는 기본적인 페이지입니다.
  • secret.html: 보호된 페이지로, 인증된 사용자만 접근할 수 있습니다.

💻 코드 예시 및 흐름 분석

1. app.py

from flask import Flask, jsonify, render_template
from flask_httpauth import HTTPBasicAuth

app = Flask(__name__)
auth = HTTPBasicAuth()

# 사용자 정보
users = {
    "admin": "secret",  # 사용자명: 비밀번호
    "guest": "pw123"
}

# 인증 함수 정의
@auth.verify_password
def verify_password(username, password):
    if username in users and users[username] == password:
        return username  # 인증 성공 시 사용자명 반환

# 인증된 사용자만 접근 가능한 페이지
@app.route('/protected')
@auth.login_required  # 로그인된 사용자만 접근 가능
def protected():
    return render_template('secret.html')  # 보호된 콘텐츠를 렌더링

# 기본 홈 페이지
@app.route('/')
def index():
    return render_template('index.html')  # 홈 페이지

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

2. index.html

<!DOCTYPE html>
<html>

  <head>
    <title>Home Page</title>
  </head>

  <body>
    <h1>Welcome to the Home Page</h1>
    <a href="/protected">Go to Protected Resource</a>
  </body>

</html>

3. secret.html

<!DOCTYPE html>
<html>

  <head>
    <title>Secret Page</title>
  </head>

  <body>
    <h1>Secret Page</h1>
    <p>Welcome to the secret page!</p>
    <a href="/">Home</a>
    <a href="/logout">Logout</a>
  </body>

</html>

🧪 실전 사례

이 애플리케이션은 간단한 사용자 인증을 구현한 예제입니다. flask_httpauth 라이브러리를 사용하여 로그인 기능을 구현하고, 인증된 사용자만 접근할 수 있는 보호된 페이지를 제공합니다. 예를 들어, 홈 페이지에서는 누구나 접근할 수 있지만, 보호된 페이지는 admin 또는 guest와 같은 사용자 이름과 비밀번호를 입력해야만 열 수 있습니다.

🧠 고급 팁 or 자주 하는 실수

  • 세션 관리: 기본적인 인증은 Basic Authentication을 사용하여 처리하지만, 실제 서비스에서는 session이나 JWT를 사용하여 사용자 상태를 관리하는 것이 일반적입니다.
  • 보안: 비밀번호를 평문으로 저장하는 것은 보안상 좋지 않습니다. hashlib 같은 라이브러리로 비밀번호를 해시화해서 저장하는 것이 안전합니다.
  • 로그인 실패 처리: 인증 실패 시 사용자에게 어떤 피드백을 제공할지 고민해보세요. 예를 들어, 실패 횟수를 추적하여 일정 횟수 이상 실패하면 계정을 잠그는 등의 추가 보안 조치를 고려할 수 있습니다.

✅ 마무리 요약 및 복습 포인트

  • Flask를 사용하여 간단한 웹 애플리케이션을 만들 수 있습니다.
  • flask_httpauth 라이브러리를 통해 기본 인증을 구현할 수 있습니다.
  • 인증이 필요한 페이지에 접근할 때 @auth.login_required 데코레이터를 사용하여 인증을 요구할 수 있습니다.
  • 실제 서비스에서는 세션 관리비밀번호 보안 등을 강화해야 합니다.