시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 Flask & FastAPI>, Dave Lee 지음. BJ Public 출판.
내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.
이전 내용(메모앱 1단계 - 3단계)
4단계: 사용자 인증
◆ Flask-Login을 활용한 사용자 인증 구현
이전 내용에서 작성한 코드에 사용자 인증 (Flask-Login) 확장을 활용하여 로그인, 로그아웃, 사용자 세션 관리를 수행한다.
1. Flask-Login 및 Werkzeug(밸저크) 설치
밸저크는 비밀번호를 해시하기 위해 사용된다.
※ “비밀번호 해싱“은 보안을 강화하기 위해 사용되는 기술 중 하나로, 사용자의 비밀번호를 안전하게 저장하는 방법이다. 기본 아이디어는 일방향 함수를 사용하여 비밀번호를 변환하고, 이 변환된 값(해시)을 저장하는 것이다.
(출처:https://hangbok-archive.com/)
pip install Flask-Login==0.6.3
Flask-Login은 이전에 이미 설치하였으므로 생략.
pip install Werkzeug==3.0.1
2. 세션 및 쿠키 활용을 위해 SECRET_KEY 추가
'SQLALCHEMY_DATABASE_URI' 밑에 추가
# SQLAlchemy의 수정 추적 기능 비활성화 (성능상의 이유로 권장)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 세션 및 쿠키에 대한 보안 향상을 위해 필요한 비밀 키 설정
app.config['SECRET_KEY'] = 'mysecretkey'
3. app.py 파일에 Flask-Login 관련 설정 추가
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
# LoginManager 인스턴스 생성
login_manager = LoginManager() # Flask 애플리케이션과 LoginManager 인스턴스 연결
login_manager.init_app(app) # 애플리케이션에 LoginManager 적용
login_manager.login_view = 'login' # 로그인 페이지의 뷰 함수 이름 설정
4. 사용자 모델을 정의하고, 데이터베이스 스키마에 반영
from werkzeug.security import generate_password_hash, check_password_hash
# 데이터베이스 모델 정의
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True) # 사용자 id 기본키로 설정
username = db.Column(db.String(100), unique=True, nullable=False) # 사용자 이름, 중복 불가 및 필수 입력
email = db.Column(db.String(100), unique=True, nullable=False) # 이메일 주소, 중복 불가 및 필수 입력
password_hash = db.Column(db.String(512), nullable=False) # 사용자 비밀번호, 필수 입력
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
5. Flask-Login이 현재 로그인한 사용자를 로드할 수 있도록 사용자 로딩 함수 정의 (데코레이터 적용)
# 사용자 ID로 사용자를 로드하는 콜백 함수 정의(사용자 로드 함수에 데코레이터 적용)
@login_manager.user_loader
def load_user(user_id):
# 주어진 user_id로 사용자 조회 후 반환
return User.query.get(int(user_id))
6. 회원가입 기능 추가
사용자가 시스템에 등록할 수 있게 된다.
# 회원 가입 기능 추가
@app.route('/signup', methods=['GET', 'POST'])
def signup():
if request.method == 'POST':
username = request.form['username']
email = request.form['email']
password = request.form['password']
user = User(username=username, email=email)
user.set_password(password)
db.session.add(user)
db.session.commit()
return jsonify({'message': 'Account created successfully'}), 201
return render_template('signup.html')
7. 로그인 및 로그아웃을 처리하기 위한 라우트 추가
# 로그인 뷰 정의
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
user = User.query.filter_by(username=request.form['username']).first()
if user and user.check_password(request.form['password']):
login_user(user)
return jsonify({'message': 'Logged in successfully'}), 200
return abort(401, description="Invalid credentials")
return render_template('login.html')
# 로그아웃 뷰 정의
@app.route('/logout')
@login_required
def logout():
logout_user()
return jsonify({'message': 'Logged out successfully'}), 200
▶ 이렇게 사용자 인증 기능을 통합하면, 프로젝트는 로그인 및 로그아웃 기능을 제공하며 사용자별 메모 관리가 가능해진다. 사용자 인증 기능은 기존의 CRUD 기능과 함께 웹 애플리케이션의 보안성을 강화하고, 사용자 경험을 향상시킨다.
다음 내용
'[파이썬 Projects] > <파이썬 웹개발>' 카테고리의 다른 글
[파이썬] 플라스크(Flask) - 플라스크 프로젝트 - 메모앱(4) (0) | 2024.08.13 |
---|---|
[파이썬] 플라스크(Flask) - 플라스크 프로젝트 - 메모앱(3) (0) | 2024.08.08 |
[파이썬] 플라스크(Flask) - 플라스크 프로젝트 - 메모앱(1) (0) | 2024.07.23 |
[파이썬] 플라스크(Flask) - 성능 개선 팁 (2) | 2024.07.23 |
[파이썬] 플라스크(Flask) - 테스팅(testing) (2) | 2024.07.22 |