[python] Flask-RESTful에서 기능 별 인증 및 권한 부여 방법

Flask-RESTful은 Flask 프레임워크를 기반으로 한 RESTful API 개발을 위한 도구이다. 이 도구를 사용하여 웹 애플리케이션을 만들 때, 인증과 권한 부여는 중요한 요소이다. Flask-RESTful은 다양한 방법으로 인증과 권한 부여를 구현할 수 있지만, 여기서는 기능 별 인증과 권한 부여 방법을 알아보고자 한다.

1. 사용자 인증

사용자 인증은 API에 접근하는 사용자의 신원을 확인하는 과정이다. Flask-RESTful에서 사용자 인증을 위해 일반적으로 flask-httpauth 라이브러리를 사용할 수 있다. 이 라이브러리는 다양한 인증 메커니즘을 지원하며, 가장 일반적인 메커니즘은 Basic 인증과 Token 인증이다.

2. 기능 별 권한 부여

API의 각 기능에는 특정한 권한이 필요할 수 있다. Flask-RESTful에서 기능 별 권한 부여를 구현하기 위해 flask_jwt_extended 라이브러리를 사용할 수 있다. 이 라이브러리는 JWT(Json Web Token)를 사용하여 사용자에게 접근 권한을 할당한다.

Example Code

아래는 Flask-RESTful에서 사용자 인증과 기능 별 권한 부여를 구현하는 예제 코드이다.

from flask import Flask, jsonify
from flask_restful import Api, Resource
from flask_httpauth import HTTPBasicAuth, HTTPTokenAuth
from flask_jwt_extended import JWTManager, jwt_required, get_jwt_identity

app = Flask(__name__)
api = Api(app)
auth = HTTPBasicAuth()
token_auth = HTTPTokenAuth(scheme='Bearer')
jwt = JWTManager(app)

# 테스트용 사용자 데이터
users = {
    'user1': 'pass1',
    'user2': 'pass2'
}

# Basic 인증
@auth.verify_password
def verify_password(username, password):
    if username in users and password == users[username]:
        return username

# Token 인증
@token_auth.verify_token
def verify_token(token):
    # 토큰 검증 로직 구현
    return True

# 토큰 생성
@app.route('/login', methods=['POST'])
def login():
    # 로그인 로직 구현
    token = 'generated_token'  # 토큰 생성 예시
    return jsonify({'access_token': token})

# API 핸들러
class ProtectedResource(Resource):
    @jwt_required  # JWT 인증이 필요한 핸들러
    def get(self):
        current_user = get_jwt_identity()  # 현재 사용자
        return jsonify({'message': f'Hello, {current_user}!'})

api.add_resource(ProtectedResource, '/protected')

if __name__ == '__main__':
    app.run()

위의 예제 코드에서는 flask-httpauthflask_jwt_extended 라이브러리를 사용하여 Basic 인증과 Token 인증, 그리고 JWT를 이용한 권한 부여를 구현하였다. @auth.verify_password 데코레이터를 사용하여 Basic 인증을 처리하고, @token_auth.verify_token 데코레이터를 사용하여 Token 인증을 처리한다. @jwt_required 데코레이터를 사용하여 JWT 인증이 필요한 핸들러를 정의하였다.

더 자세한 내용은 Flask-RESTful, flask_httpauth, flask_jwt_extended 문서를 참고하기 바란다.

References