[파이썬] Flask의 인증과 권한 관리

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로 다양한 유형의 웹 애플리케이션을 더 안전하게 개발할 수 있습니다.