[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 문서를 참고해주세요.