Flask는 간편하면서도 유연한 웹 애플리케이션 프레임워크로서, 인증과 권한 관리를 구현하는 데에 매우 효과적입니다. 이 글에서는 Flask를 사용하여 인증과 권한 기능을 구현하는 방법에 대해 알아보겠습니다.
사용자 인증
사용자 인증은 웹 애플리케이션에서 사용자가 자신의 신원을 확인하는 프로세스로, 로그인 기능을 구현하는 것과 관련이 있습니다. Flask를 사용하여 사용자 인증을 구현하는 가장 간단한 방법은 Flask-Login이라는 라이브러리를 사용하는 것입니다.
Flask-Login은 Flask 애플리케이션에 사용자 인증 기능을 추가하는 데 도움을 줍니다. 사용자 모델을 정의하고, 로그인, 로그아웃 등의 기능을 처리하는 메서드를 정의하기만 하면 됩니다.
from flask import Flask
from flask_login import UserMixin, LoginManager, login_user, login_required, logout_user
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
login_manager = LoginManager(app)
login_manager.login_view = 'login'
class User(UserMixin):
def __init__(self, id):
self.id = id
def get_id(self):
return str(self.id)
users = {'user_id': {'username': 'user@example.com', 'password_hash': generate_password_hash('password')}}
@login_manager.user_loader
def load_user(user_id):
return User(user_id)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user_id = None
for id, user in users.items():
if user['username'] == username and check_password_hash(user['password_hash'], password):
user_id = id
break
if user_id is not None:
user = User(user_id)
login_user(user)
return redirect('/')
else:
flash('Invalid username or password')
return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect('/')
@app.route('/')
@login_required
def index():
return 'Welcome, ' + current_user.get_id()
권한 관리
사용자 인증 후에는 애플리케이션 내에서 사용자의 권한을 관리하는 것이 중요합니다. Flask-Login은 간단한 사용자 인증을 위해 만들어졌기 때문에 권한 관리 기능은 내장되어 있지 않습니다. 예를 들어, 특정 페이지에 접근할 수 있는지 여부를 확인하기 위해 간단한 데코레이터 함수를 작성할 수 있습니다.
from functools import wraps
from flask import abort
from flask_login import current_user
def role_required(role):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.is_authenticated or current_user.role != role:
abort(403) # 권한이 없는 경우 403 오류 반환
return f(*args, **kwargs)
return decorated_function
return decorator
@app.route('/admin')
@login_required
@role_required('admin')
def admin():
return 'Admin Page'
위 예제에서는 role_required
데코레이터 함수를 작성하여 특정 페이지에 접근할 수 있는 권한이 있는지 확인하고, 권한이 없는 경우 403 오류를 반환합니다. current_user.role
은 사용자 모델에 권한 속성을 포함하여 해당 사용자의 권한을 확인하는 데 사용됩니다.
결론
Flask를 사용하여 웹 애플리케이션에서 사용자 인증과 권한 관리를 구현하는 것은 매우 간단합니다. Flask-Login 라이브러리를 사용하면 사용자 인증 기능을 쉽게 구현할 수 있으며, 간단한 데코레이터 함수를 작성하여 권한 관리 기능을 추가할 수 있습니다.
이를 통해 Flask로 다양한 유형의 웹 애플리케이션을 더 안전하게 개발할 수 있습니다.