안녕하세요! 그레이 해커 월횽입니다. 오늘은 Flask에서 사용자 인증 및 권한 부여에 대해 알아보겠습니다. 대부분의 웹 애플리케이션에서는 사용자의 로그인, 로그아웃 기능과 권한 부여가 필요합니다. 오늘은 이러한 기능을 구현하기 위한 Flask-Login 라이브러리를 활용한 간단한 사용자 인증 시스템을 만들어보겠습니다.
1. 사용자 인증과 권한 부여의 기본 개념
· 인증(Authentication): 사용자가 누구인지 확인하는 과정으로, 주로 로그인을 통해 이루어집니다.
· 권한 부여(Authorization): 사용자가 특정 기능이나 자원에 접근할 수 있는지를 결정하는 과정입니다. 예를 들어, 관리자만이 특정 페이지에 접근할 수 있게 할 수 있습니다.
2. Flask-Login 라이브러리 소개
Flask-Login은 Flask에서 인증 기능을 쉽게 구현할 수 있도록 도와주는 라이브러리입니다. 이 라이브러리는 사용자의 로그인 상태를 관리하고, 특정 페이지에 접근할 수 있는 권한을 제어하는 데 유용합니다.
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')
사용자 로그인
@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 애플리케이션 배포에 대해 알아보겠습니다!
- 이전 수업 목록
'프로그래밍 > Python' 카테고리의 다른 글
[Python 강의] 23강 - Flask 웹소켓(WebSockets) (1) | 2024.10.30 |
---|---|
[Python 강의] 22강 - Flask 애플리케이션 배포 (0) | 2024.10.29 |
[Python 강의] 20강 - Flask와 데이터베이스 연동 (0) | 2024.10.25 |
[Python 강의] 19강 - 웹 개발 기초 (0) | 2024.10.24 |
[Python 강의] 18강 - 네트워킹 프로그래밍 (0) | 2024.10.23 |