Python/Python Flask

Flask 사용자 인증: Flask-Login으로 사용자 인증 구현하기

임베디드 친구 2025. 9. 10. 19:57
728x90
반응형

Flask 사용자 인증: Flask-Login으로 사용자 인증 구현하기

Flask는 파이썬으로 작성된 마이크로 웹 프레임워크로, 간단한 설정과 강력한 기능으로 많은 개발자들에게 사랑받고 있습니다. 웹 애플리케이션 개발 시 사용자 인증은 필수적인 요소 중 하나입니다. Flask에서는 Flask-Login이라는 확장 패키지를 통해 쉽게 사용자 인증을 구현할 수 있습니다.

이번 포스팅에서는 Flask-Login을 사용하여 사용자 인증을 구현하는 방법을 단계별로 알아보겠습니다.


1. Flask-Login 소개

Flask-Login은 Flask 애플리케이션에서 사용자 세션을 관리하고 인증 상태를 확인하는 데 도움을 주는 확장 패키지입니다. Flask-Login의 주요 기능은 다음과 같습니다:

  • 사용자 로그인 및 로그아웃 관리
  • 로그인한 사용자의 세션 유지
  • 특정 페이지에 대한 접근 제한

2. Flask-Login 설치

먼저 Flask-Login을 설치해야 합니다. 아래 명령어를 사용하여 Flask-Login을 설치합니다:

pip install flask-login

3. 프로젝트 구조

예제를 구현하기 위해 간단한 Flask 프로젝트를 설정합니다. 프로젝트 디렉토리 구조는 다음과 같습니다:

project/
│
├── app.py           # 메인 애플리케이션 파일
├── templates/       # HTML 템플릿 디렉토리
│   ├── login.html
│   └── home.html
└── static/          # 정적 파일 디렉토리

4. 코드 구현

4.1 기본 설정

아래는 app.py 파일의 기본 코드입니다:

from flask import Flask, render_template, redirect, url_for, request, flash
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user

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

# Flask-Login 초기화
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

# 사용자 데이터베이스 (예제용)
users = {
    'testuser': {'password': 'testpass'}
}

# 사용자 모델
class User(UserMixin):
    def __init__(self, id):
        self.id = id

# 사용자 로더
@login_manager.user_loader
def load_user(user_id):
    return User(user_id) if user_id in users else None

@app.route('/')
@login_required
def home():
    return render_template('home.html', username=current_user.id)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username in users and users[username]['password'] == password:
            user = User(username)
            login_user(user)
            flash('로그인 성공!', 'success')
            return redirect(url_for('home'))
        else:
            flash('로그인 실패. 아이디 또는 비밀번호를 확인하세요.', 'danger')
    return render_template('login.html')

@app.route('/logout')
@login_required
def logout():
    logout_user()
    flash('로그아웃되었습니다.', 'success')
    return redirect(url_for('login'))

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

4.2 HTML 템플릿

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>로그인</title>
</head>
<body>
    <h1>로그인</h1>
    <form method="post">
        <label for="username">아이디:</label>
        <input type="text" name="username" id="username" required><br>
        <label for="password">비밀번호:</label>
        <input type="password" name="password" id="password" required><br>
        <button type="submit">로그인</button>
    </form>
    {% with messages = get_flashed_messages(with_categories=true) %}
    {% if messages %}
        <ul>
        {% for category, message in messages %}
            <li class="{{ category }}">{{ message }}</li>
        {% endfor %}
        </ul>
    {% endif %}
    {% endwith %}
</body>
</html>

home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>홈</title>
</head>
<body>
    <h1>환영합니다, {{ username }}님!</h1>
    <a href="{{ url_for('logout') }}">로그아웃</a>
</body>
</html>

5. 주요 코드 설명

5.1 사용자 모델

UserMixin을 상속받아 사용자 모델을 정의합니다. 이는 Flask-Login에서 사용자의 인증 상태를 관리하는 데 필요한 메서드를 포함합니다.

5.2 사용자 로더

@login_manager.user_loader 데코레이터를 사용하여 Flask-Login이 사용자 세션을 복원할 때 사용자 객체를 반환하도록 설정합니다.

5.3 login_required 데코레이터

@login_required 데코레이터를 사용하여 인증된 사용자만 특정 페이지에 접근할 수 있도록 제한합니다.

5.4 로그인 및 로그아웃

login_user()logout_user() 함수를 사용하여 사용자의 로그인 및 로그아웃 상태를 관리합니다.


6. 실행 및 테스트

  1. Flask 애플리케이션을 실행합니다:

    python app.py
  2. 브라우저에서 http://127.0.0.1:5000/login에 접속합니다.

  3. 아이디 testuser와 비밀번호 testpass로 로그인하여 테스트합니다.


7. 결론

이 글에서는 Flask-Login을 사용하여 Flask 애플리케이션에 사용자 인증 기능을 구현하는 방법을 알아보았습니다. Flask-Login은 간단한 설정으로 강력한 인증 기능을 제공하며, 추가적인 사용자 권한 관리나 세션 설정도 손쉽게 확장할 수 있습니다.

더 나은 보안을 위해 다음 단계를 고려할 수 있습니다:

  • 비밀번호를 데이터베이스에 저장하기 전에 해싱하기
  • HTTPS를 사용하여 데이터를 암호화하기
  • CSRF 공격 방지 설정 추가

이 포스팅이 도움이 되길 바라며, 더 많은 Flask 관련 포스팅을 기대해주세요!

반응형