Flask

Chapter 5-1 Flask Authentication / Flask-login

Chansman 2025. 4. 22. 20:51

📌 개념 정리

Flask-Login은 Flask 프레임워크에서 사용자 인증을 쉽고 효율적으로 구현할 수 있도록 도와주는 파이썬 라이브러리입니다. 로그인, 로그아웃, 사용자 세션 유지 및 보호된 페이지 접근 제어와 같은 기본적인 사용자 인증 관련 기능을 손쉽게 처리할 수 있습니다.

이 라이브러리를 사용하면 복잡한 인증 로직을 간결하고 효율적으로 구성할 수 있으며, 특히 세션 관리와 인증 프로세스를 자동화하여 개발자의 업무를 크게 줄여줍니다.


🚦 동작 원리 및 구조

Flask-Login은 다음 세 가지 주요 기능을 제공합니다:

  1. 사용자 인증 관리: 로그인, 로그아웃 처리 및 현재 로그인한 사용자의 정보 관리
  2. 세션 관리: 로그인한 상태를 유지하고 세션을 관리하여 사용자 경험을 개선
  3. 보호된 페이지 접근 제한: 인증되지 않은 사용자의 보호된 페이지 접근을 자동으로 차단하고 로그인 페이지로 리디렉션

💻 코드 예시 및 단계별 흐름 분석

🔹 프로젝트 구조

project/
├── app.py
├── models.py
├── routes.py
└── templates/
    ├── index.html
    └── login.html

1️⃣ app.py

  • Flask 앱 설정 및 로그인 관리 객체 초기화
from flask import Flask
from flask_login import LoginManager
from models import User

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 세션 보안을 위한 시크릿 키 설정

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'  # 인증되지 않은 사용자를 위한 로그인 페이지

@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)

from routes import configure_routes
configure_routes(app)

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

2️⃣ models.py

  • 사용자 모델 정의 및 간단한 사용자 데이터 관리
from flask_login import UserMixin

# 예제 사용자 데이터
users = {'admin': {'password': 'secret'}}

class User(UserMixin):
    def __init__(self, username):
        self.id = username

    @staticmethod
    def get(user_id):
        if user_id in users:
            return User(user_id)
        return None

3️⃣ routes.py

  • 경로 설정 및 로그인, 로그아웃, 보호된 페이지 구성
from flask import render_template, redirect, url_for, request, flash
from flask_login import login_user, logout_user, login_required
from models import User, users

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

    @app.route('/login', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            username = request.form['username']
            password = request.form['password']
            user = User.get(username)
            if user and users[username]['password'] == password:
                login_user(user)
                return redirect(url_for('index'))
            else:
                flash('잘못된 사용자 이름 또는 비밀번호입니다.')
        return render_template('login.html')

    @app.route('/logout')
    def logout():
        logout_user()
        return redirect(url_for('index'))

    @app.route('/protected')
    @login_required
    def protected():
        return '<h1>인증된 사용자만 접근 가능한 페이지입니다.</h1> <a href="/logout">로그아웃</a>'

4️⃣ templates/index.html

  • 홈 페이지 템플릿
<!DOCTYPE html>
<html>
<head>
    <title>Home Page</title>
</head>
<body>
    <h1>홈 페이지에 오신 것을 환영합니다!</h1>
    <a href="/login">로그인</a> | 
    <a href="/logout">로그아웃</a> |
    <a href="/protected">보호된 페이지</a>
</body>
</html>

5️⃣ templates/login.html

  • 로그인 페이지 템플릿
<!DOCTYPE html>
<html>
<head>
    <title>로그인</title>
</head>
<body>
    <h1>로그인</h1>
    <form method="post">
        사용자 이름: <input type="text" name="username" /><br />
        비밀번호: <input type="password" name="password" /><br />
        <input type="submit" value="로그인" />
    </form>
</body>
</html>

🧪 실전 사례

  • 사용자가 /login 페이지에서 로그인하면, 인증된 사용자만 접근 가능한 /protected 페이지에 접근할 수 있습니다.
  • 로그인하지 않은 상태에서 /protected 페이지에 접근하면 자동으로 로그인 페이지로 리디렉션됩니다.

🧠 고급 팁 & 자주 하는 실수

  • 비밀번호 보안: 실 서비스에서는 bcrypt나 argon2와 같은 알고리즘을 사용하여 비밀번호를 해시로 안전하게 저장해야 합니다.
  • 세션 관리 강화: 로그인 상태 유지를 위해 세션 타임아웃 설정 및 remember_me 옵션 사용을 고려하세요.
  • 로그인 실패 처리: 로그인 시 실패 메시지 처리 외에도 실패 횟수를 기록하고 일정 횟수 초과 시 계정을 잠그는 등의 추가 보안 장치를 마련하는 것이 좋습니다.

마무리 요약 및 복습 포인트

  • Flask-Login을 통해 손쉽게 사용자 인증 기능 구현 가능
  • 로그인과 로그아웃 기능은 각각 login_user(), logout_user() 함수를 사용
  • 보호된 페이지 접근 시 @login_required 데코레이터 사용
  • 예제를 통해 간단한 사용자 인증 시스템 구축 및 관리 가능

이 가이드를 활용하여 보다 안전하고 효율적인 Flask 애플리케이션을 구축해 보세요! 😊