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. 실행 및 테스트
Flask 애플리케이션을 실행합니다:
python app.py
브라우저에서 http://127.0.0.1:5000/login에 접속합니다.
아이디
testuser
와 비밀번호testpass
로 로그인하여 테스트합니다.
7. 결론
이 글에서는 Flask-Login을 사용하여 Flask 애플리케이션에 사용자 인증 기능을 구현하는 방법을 알아보았습니다. Flask-Login은 간단한 설정으로 강력한 인증 기능을 제공하며, 추가적인 사용자 권한 관리나 세션 설정도 손쉽게 확장할 수 있습니다.
더 나은 보안을 위해 다음 단계를 고려할 수 있습니다:
- 비밀번호를 데이터베이스에 저장하기 전에 해싱하기
- HTTPS를 사용하여 데이터를 암호화하기
- CSRF 공격 방지 설정 추가
이 포스팅이 도움이 되길 바라며, 더 많은 Flask 관련 포스팅을 기대해주세요!
'Python > Python Flask' 카테고리의 다른 글
Flask를 활용한 OAuth와 소셜 로그인 통합 방법 (0) | 2025.09.14 |
---|---|
Flask에서 사용자 인증: 세션 관리 및 쿠키 사용 (0) | 2025.09.11 |
Flask로 RESTful API와 JSON 데이터 처리하기 (0) | 2025.09.09 |
Flask로 RESTful API 엔드포인트 만들기 (0) | 2025.09.08 |
Flask RESTful API 기본 개념 (0) | 2025.09.07 |