프로그래밍/Python

[Python 강의] 21강 - 사용자 인증 및 권한 부여

월횽 2024. 10. 28. 06:30
728x90
반응형
SMALL

안녕하세요! 그레이 해커 월횽입니다. 오늘은 Flask에서 사용자 인증 및 권한 부여에 대해 알아보겠습니다. 대부분의 웹 애플리케이션에서는 사용자의 로그인, 로그아웃 기능과 권한 부여가 필요합니다. 오늘은 이러한 기능을 구현하기 위한 Flask-Login 라이브러리를 활용한 간단한 사용자 인증 시스템을 만들어보겠습니다.

 

 

1. 사용자 인증과 권한 부여의 기본 개념

· 인증(Authentication): 사용자가 누구인지 확인하는 과정으로, 주로 로그인을 통해 이루어집니다.
· 권한 부여(Authorization): 사용자가 특정 기능이나 자원에 접근할 수 있는지를 결정하는 과정입니다. 예를 들어, 관리자만이 특정 페이지에 접근할 수 있게 할 수 있습니다.

 

 

2. Flask-Login 라이브러리 소개

Flask-Login은 Flask에서 인증 기능을 쉽게 구현할 수 있도록 도와주는 라이브러리입니다. 이 라이브러리는 사용자의 로그인 상태를 관리하고, 특정 페이지에 접근할 수 있는 권한을 제어하는 데 유용합니다.

728x90

Flask-Login 설치

먼저 Flask-Login을 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요.

pip install Flask-Login

 

 

 

3. 기본적인 사용자 모델 정의하기

Flask-Login을 사용하려면 사용자 모델을 정의하고, 로그인 상태를 관리할 수 있어야 합니다. 아래와 같이 사용자 모델을 정의할 수 있습니다.

반응형
from flask import Flask, render_template, redirect, url_for, request
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SECRET_KEY'] = 'secret_key'
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'

# 사용자 모델 정의
class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(150), unique=True, nullable=False)
    password = db.Column(db.String(150), nullable=False)

# 데이터베이스 초기화
@app.before_first_request
def create_tables():
    db.create_all()

# 사용자 로드 함수 정의
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

 

 

 

4. 사용자 등록 및 로그인 기능 구현

 

사용자 등록

@app.route('/signup', methods=['GET', 'POST'])
def signup():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        new_user = User(username=username, password=password)
        db.session.add(new_user)
        db.session.commit()
        return redirect(url_for('login'))
    return render_template('signup.html')

 

SMALL

사용자 로그인

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username, password=password).first()
        if user:
            login_user(user)
            return redirect(url_for('dashboard'))
    return render_template('login.html')

 

 

사용자 로그아웃

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('login'))

 

 

 

5. 권한이 필요한 페이지 만들기

특정 페이지에 접근할 때 로그인된 사용자만 접근할 수 있도록 할 수 있습니다. 이때 @login_required 데코레이터를 사용합니다.

@app.route('/dashboard')
@login_required
def dashboard():
    return f'환영합니다, {current_user.username}님!'

 

로그인하지 않은 사용자가 /dashboard 페이지에 접근하려고 하면 /login 페이지로 리디렉션됩니다.

 

 

6. 비밀번호 보안

실제 애플리케이션에서는 비밀번호를 평문으로 저장하면 안 됩니다. 보안을 위해 해시 함수를 사용하여 비밀번호를 안전하게 저장할 수 있습니다. 이를 위해 Werkzeug의 generate_password_hash와 check_password_hash 함수를 사용할 수 있습니다.

from werkzeug.security import generate_password_hash, check_password_hash

# 비밀번호 해시화
hashed_password = generate_password_hash(password)

# 해시된 비밀번호와 입력된 비밀번호 비교
if check_password_hash(user.password, password):
    login_user(user)

 

 

 

7. Flask-Login 정리

· Flask-Login을 사용하면 간단하게 사용자 로그인, 로그아웃, 인증을 관리할 수 있습니다.
· @login_required 데코레이터로 특정 페이지에 로그인된 사용자만 접근할 수 있도록 할 수 있습니다.
· 비밀번호는 해시 함수를 사용하여 안전하게 저장해야 합니다.

 

다음 시간에는 Flask 애플리케이션 배포에 대해 알아보겠습니다!

 

 

 

 

 

- 이전 수업 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST