📌 개념 정리
Flask-Login은 Flask 애플리케이션에 사용자 인증 및 세션 관리를 쉽게 구현할 수 있도록 도와주는 확장입니다. 이 확장을 사용하면 로그인, 로그아웃, 세션 유지 등을 간편하게 관리할 수 있습니다.
- Flask-Login의 주요 기능
- 사용자 로그인, 로그아웃 처리
- 로그인한 사용자만 접근할 수 있는 보호된 페이지 제공
- 세션을 사용하여 사용자 상태 유지
🚦 동작 원리 및 구조
- Flask 애플리케이션 생성 및 설정
- app.py 파일에서 Flask 애플리케이션을 생성하고, flask_login.LoginManager()를 통해 로그인 관리자를 초기화합니다.
- login_manager.login_view에 로그인 뷰를 설정하여, 로그인이 필요한 페이지에 접근할 때 자동으로 로그인 페이지로 리디렉션됩니다.
- 로그인 처리
- 사용자가 로그인할 때, 입력한 사용자명과 비밀번호를 확인하고, 일치하면 login_user()를 호출하여 세션에 사용자 정보를 저장합니다.
- 로그인 실패 시, flash()로 오류 메시지를 표시합니다.
- 세션 관리 및 보호된 페이지
- 로그인한 사용자만 접근 가능한 페이지는 @login_required 데코레이터를 사용하여 보호됩니다.
- load_user() 함수는 Flask-Login이 사용자를 로딩할 때 호출되며, 세션에 저장된 user_id로 사용자 객체를 반환합니다.
💻 코드 예시 및 흐름 분석
app.py
from flask import Flask
from flask_login import LoginManager
from models import User
from routes import configure_route # routes.py에서 라우팅을 관리한다고 가정
app = Flask(__name__)
app.secret_key = 'flask-secret-key' # 세션을 안전하게 관리하기 위한 secret_key 설정
# 로그인 매니저 설정
login_manager = LoginManager()
login_manager.init_app(app) # 이미 `init_app(app)`으로 연결
# 로그인 뷰 설정
login_manager.login_view = 'login'
# 사용자 로딩 함수 설정 (사용자가 로그인할 때 호출)
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id) # 사용자가 로그인할 때 세션에 저장된 `user_id`로 사용자 객체를 로드
# 라우팅 함수들을 routes.py에서 설정한다고 가정
configure_route(app)
if __name__ == '__main__':
app.run(debug=True)
흐름 분석:
- Flask 애플리케이션을 설정하고, 로그인 관리자 LoginManager를 초기화합니다.
- 로그인 뷰 login을 설정하여, 로그인이 필요한 페이지는 자동으로 로그인 페이지로 리디렉션됩니다.
- user_loader 함수는 세션에 저장된 user_id로 사용자를 로딩합니다.
routes.py
from flask import render_template, request, redirect, url_for, flash
from models import User, users
from flask_login import login_user, logout_user, login_required
def configure_route(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']
# 사용자 찾기 (username을 사용하여 User 객체 반환)
user = User.get(username)
# 사용자와 비밀번호 검증
if user and users[username]['password'] == password:
login_user(user) # Flask-Login으로 로그인 처리
return redirect(url_for('index')) # 로그인 후 메인 페이지로 리디렉션
else:
flash('Invalid username or password') # 잘못된 로그인 정보 처리
return render_template('login.html') # GET 요청시 로그인 페이지 렌더링
# 로그아웃 처리
@app.route('/logout')
def logout():
logout_user() # Flask-Login으로 로그아웃 처리
return redirect(url_for('index')) # 로그아웃 후 메인 페이지로 리디렉션
# 보호된 페이지
@app.route('/protected')
@login_required # 로그인된 사용자만 접근 가능
def protected():
return "<h1>Protected Page</h1> <a href='/logout'>Logout</a>"
흐름 분석:
- /login에서 POST 요청이 들어오면, 사용자 이름과 비밀번호를 확인하고, 올바르면 로그인하고 메인 페이지로 리디렉션합니다.
- 로그아웃은 /logout에서 처리하며, 로그아웃 후 메인 페이지로 리디렉션합니다.
- /protected 페이지는 로그인한 사용자만 접근할 수 있습니다.
models.py
from flask_login import UserMixin
users = {'admin': {'password': 'pw123'}}
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
흐름 분석:
- User 클래스는 Flask-Login의 UserMixin을 상속하여 사용자가 로그인할 때 필요한 속성을 갖습니다.
- get() 메서드는 사용자 이름을 사용하여 사용자 객체를 반환합니다.
login.html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="post">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
</form>
</body>
</html>
흐름 분석:
- 사용자가 로그인 페이지에서 사용자명과 비밀번호를 입력하고 제출하면, POST 요청으로 로그인 처리가 이루어집니다.
index.html
<!DOCTYPE html>
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Welcome to the Home Page</h1>
<a href="/login">Login</a> |
<a href="/logout">Logout</a> |
<a href="/protected">Protected Page</a>
</body>
</html>
흐름 분석:
- 메인 페이지에서 로그인, 로그아웃, 보호된 페이지로 이동할 수 있는 링크를 제공합니다.
🧪 실전 사례
이 예제는 Flask와 Flask-Login을 활용하여 로그인 시스템을 구현하는 간단한 예제입니다. 실제 프로젝트에서는 로그인 시스템을 추가하여 사용자 인증 및 권한 관리를 할 수 있습니다.
🧠 고급 팁 or 자주 하는 실수
- 세션 보안: secret_key는 강력한 값으로 설정해야 하며, 프로덕션 환경에서는 os.environ을 통해 환경 변수로 관리하는 것이 좋습니다.
- 폼 검증: 실제로는 로그인 폼에서 username과 password에 대한 추가적인 검증을 해야 합니다. 예를 들어, 비밀번호 암호화를 사용하는 것이 권장됩니다.
✅ 마무리 요약 및 복습 포인트
- Flask-Login을 사용하여 로그인 시스템을 구축하는 방법을 배웠습니다.
- login_required 데코레이터를 사용하여 보호된 페이지를 만들었습니다.
- 로그인 시 사용자 정보를 세션에 저장하고, 로그아웃 시 세션을 삭제하는 방법을 구현했습니다.
'기술블로그-Flask편' 카테고리의 다른 글
🚀 Flask 프로젝트에서 routes.py와 services의 역할 이해하기(1-2) (0) | 2025.04.24 |
---|---|
🚀 Git Flow 브랜치 전략 초기 셋팅 가이드(1-1) (0) | 2025.04.24 |
Flask 문의 내역 이메일 발송 시스템 구현 with 파머 (0) | 2025.04.23 |
📌 SMTP,프로토콜,통신 규약 이란? (0) | 2025.04.23 |
Flask : 서비스 기획부터 API 개발까지: 시스템 설계의 전체 흐름(with 프론트엔드 소통) (0) | 2025.04.23 |