[python] Flask-RESTful에서 인증과 권한 관리 방법

개요

Flask-RESTful은 Flask를 기반으로 한 RESTful 웹 서비스를 쉽게 구축할 수 있게 도와주는 라이브러리입니다. 인증과 권한 관리는 웹 서비스에서 중요한 보안 요소이며, 이를 Flask-RESTful에서 어떻게 처리할 수 있는지 알아보겠습니다.

인증(Authentication) 방법

인증은 사용자가 자신의 신원을 증명하는 과정을 말합니다. Flask-RESTful에서는 다양한 인증 방법을 지원합니다. 예를 들어, HTTP 헤더에 인증 토큰을 담아 보내는 방법, 기본 인증(Basic Authentication), OAuth 등이 있습니다.

HTTP 헤더 인증

HTTP 헤더에 인증 토큰을 담아 보내면 서버는 이를 통해 사용자의 신원을 확인하고 인증할 수 있습니다. Flask-RESTful에서는 flask_httpauth 모듈을 사용하여 간편하게 HTTP 헤더 인증을 구현할 수 있습니다.

from flask import Flask
from flask_restful import Api, Resource
from flask_httpauth import HTTPTokenAuth

app = Flask(__name__)
api = Api(app)
auth = HTTPTokenAuth()

tokens = {
    "secret_token": "user1"
}

@auth.verify_token
def verify_token(token):
    if token in tokens.values():
        return True
    return False

class SecretResource(Resource):
    @auth.login_required
    def get(self):
        return {"message": "This is a secret resource!"}

api.add_resource(SecretResource, "/secret")

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

위 예제에서는 HTTPTokenAuth()를 사용하여 HTTP 헤더 인증을 구현하였습니다. verify_token 데코레이터를 사용하여 토큰의 유효성을 검사하고, @auth.login_required 데코레이터를 사용하여 인증이 필요한 리소스를 설정할 수 있습니다.

기본 인증(Basic Authentication)

기본 인증은 사용자의 아이디와 비밀번호를 입력하여 인증하는 방식입니다. Flask-RESTful에서도 기본 인증을 쉽게 구현할 수 있습니다.

from flask import Flask
from flask_restful import Api, Resource
from flask_httpauth import HTTPBasicAuth

app = Flask(__name__)
api = Api(app)
auth = HTTPBasicAuth()

users = {
    "user1": "password1",
    "user2": "password2"
}

@auth.verify_password
def verify_password(username, password):
    if username in users and users[username] == password:
        return True
    return False

class ProtectedResource(Resource):
    @auth.login_required
    def get(self):
        return {"message": "This resource is protected!"}

api.add_resource(ProtectedResource, "/protected")

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

위 예제에서는 HTTPBasicAuth()를 사용하여 기본 인증을 구현하였습니다. verify_password 데코레이터를 사용하여 사용자의 아이디와 비밀번호를 확인하고, @auth.login_required 데코레이터를 사용하여 인증이 필요한 리소스를 설정할 수 있습니다.

권한(Authorization) 관리 방법

권한 관리는 인증된 사용자가 어떤 작업을 수행할 수 있는지 제한하는 과정을 말합니다. Flask-RESTful에서는 데코레이터를 사용하여 간편하게 권한 관리를 구현할 수 있습니다.

from flask import Flask
from flask_restful import Api, Resource
from flask_httpauth import HTTPTokenAuth

app = Flask(__name__)
api = Api(app)
auth = HTTPTokenAuth()

tokens = {
    "admin_token": "admin",
    "user_token": "user"
}

@auth.verify_token
def verify_token(token):
    if token in tokens.values():
        return True
    return False

def admin_required(fn):
    @auth.login_required
    def wrapper(*args, **kwargs):
        token = auth.current_user()
        if token == "admin":
            return fn(*args, **kwargs)
        else:
            return {"message": "Admin access required!"}
    return wrapper

class ProtectedResource(Resource):
    @admin_required
    def get(self):
        return {"message": "This resource requires admin access!"}

api.add_resource(ProtectedResource, "/protected")

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

위 예제에서는 admin_required 데코레이터를 사용하여 admin 권한이 있는 사용자만이 해당 리소스에 접근할 수 있도록 설정하였습니다. auth.current_user()를 사용하여 현재 사용자를 확인하고, 권한에 따라 작업을 제한할 수 있습니다.

결론

Flask-RESTful은 강력한 인증과 권한 관리 기능을 제공하여 웹 서비스의 보안을 강화할 수 있습니다. HTTP 헤더 인증, 기본 인증과 함께 권한 관리를 적절히 구현하여 안전한 RESTful 웹 서비스를 개발해보세요.

참고 자료