[python] Flask-RESTful에서 인증을 위한 두 단계 인증(2FA) 방법
안녕하세요! Flask-RESTful을 사용하여 웹 애플리케이션을 개발하는 경우, 보안을 강화하기 위해 두 단계 인증(2FA)을 구현하는 것이 중요합니다. 이번 블로그 포스트에서는 Flask-RESTful에서 인증을 위한 두 단계 인증 방법을 알아보겠습니다.
1. Flask-RESTful 확장팩 설치
Flask-RESTful에서 두 단계 인증을 구현하기 위해서는 “Flask-Security”와 같은 확장팩을 설치해야 합니다. pip
명령어를 사용하여 Flask-RESTful에 필요한 확장팩을 설치해주세요.
pip install Flask-Security
2. User 모델에 필드 추가
User 모델에 두 단계 인증을 위한 필드를 추가해야 합니다. 휴대폰 번호나 이메일 주소를 통해 인증 코드가 전송되는 방식과 같이 원하는 필드를 추가하세요.
from flask_security import UserMixin
from flask_security import SQLAlchemyUserDatastore
from your_application import db, app
# User 모델 정의
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), unique=True)
password = db.Column(db.String(255))
# 2FA 필드 추가
phone_number = db.Column(db.String(20), unique=True)
email = db.Column(db.String(255), unique=True)
two_factor_enabled = db.Column(db.Boolean, default=False)
# User 모델과 SQLAlchemyUserDatastore 연결
user_datastore = SQLAlchemyUserDatastore(db, User)
3. 인증을 위한 API 엔드포인트 생성
Flask-RESTful에는 다양한 API 엔드포인트를 생성할 수 있습니다. 두 단계 인증 관련 엔드포인트를 생성하여 사용자가 인증 코드를 받고 확인할 수 있도록 구현해보겠습니다.
from flask import request, jsonify
from flask_restful import Resource
from your_application import app
class TwoFactorAuth(Resource):
def post(self):
# 사용자가 휴대폰 번호나 이메일 주소를 통해 인증 코드 요청을 보냄
data = request.get_json()
username = data.get('username')
user = user_datastore.find_user(username=username)
if not user:
return {'message': 'User not found'}, 404
# 사용자에게 인증 코드 발송 (휴대폰 번호로 SMS를 보내거나 이메일을 전송)
verification_code = generate_verification_code() # 인증 코드를 생성하는 함수 호출
send_verification_code(user.phone_number, verification_code) # 인증 코드를 사용자에게 전송하는 함수 호출
return {'message': 'Verification code sent'}, 200
def put(self):
# 사용자가 인증 코드를 확인하면서 두 단계 인증을 활성화
data = request.get_json()
username = data.get('username')
verification_code = data.get('verification_code')
user = user_datastore.find_user(username=username)
if not user:
return {'message': 'User not found'}, 404
if verify_verification_code(user.phone_number, verification_code): # 인증 코드를 확인하는 함수 호출
user.two_factor_enabled = True
user_datastore.commit()
return {'message': 'Two-factor authentication enabled'}, 200
return {'message': 'Invalid verification code'}, 400
# API 엔드포인트를 Flask-RESTful에 등록
api.add_resource(TwoFactorAuth, '/twofactor/auth')
4. 인증된 사용자만 API에 접근할 수 있도록 구현
마지막으로, 두 단계 인증이 활성화된 사용자만이 API에 접근할 수 있도록 구현해보겠습니다. Flask-Security
를 사용하여 인증된 사용자만이 API를 호출할 수 있도록 데코레이터를 추가해주세요.
from flask_security.decorators import login_required
# 인증된 사용자만 API에 접근할 수 있도록 데코레이터 추가
@app.route('/api/endpoint')
@login_required
def protected_endpoint():
# 인증된 사용자만이 접근할 수 있는 로직 구현
return jsonify({'message': 'This data is protected and requires authentication'}), 200
마무리
이제 Flask-RESTful에서 두 단계 인증(2FA) 방법을 구현하는 방법을 알아보았습니다. 이를 통해 애플리케이션의 보안을 강화하고 사용자 데이터를 안전하게 보호할 수 있습니다.
더 자세한 내용은 Flask-Security 문서를 참고해주세요.