[파이썬] RESTful API를 위한 인증 및 권한 부여

RESTful API는 현대적인 웹 개발에서 광범위하게 사용되고 있습니다. 하지만 API를 보호하고 무단 액세스로부터 보안을 유지하기 위해 인증 및 권한 부여 기능을 구현해야 합니다. 이 블로그 포스트에서는 파이썬으로 RESTful API를 보호하기 위한 인증 및 권한 부여 방법에 대해 알아보겠습니다.

1. JWT(JSON Web Token) 인증

JWT는 RESTful API의 인증 방식으로 널리 사용되는 방법 중 하나입니다. JWT는 클라이언트와 서버 간의 안전한 정보 교환을 위해 사용되며, 인증에 필요한 모든 정보를 토큰에 포함합니다.

파이썬에서 JWT를 사용하기 위해 PyJWT 패키지를 설치해야 합니다. 다음은 JWT 인증을 구현하는 간단한 코드 예시입니다:

import jwt

def generate_token(user_id):
    payload = {'user_id': user_id}
    secret_key = 'your_secret_key'
    token = jwt.encode(payload, secret_key, algorithm='HS256')
    return token

def verify_token(token):
    secret_key = 'your_secret_key'
    try:
        payload = jwt.decode(token, secret_key, algorithms='HS256')
        return payload['user_id']
    except jwt.ExpiredSignatureError:
        # Token expired
        return None
    except jwt.InvalidTokenError:
        # Invalid token
        return None

위의 코드에서 generate_token 함수는 사용자 ID를 받아 토큰을 생성하는 함수입니다. verify_token 함수는 토큰을 검증하고 사용자 ID를 반환하거나 만료된 토큰이나 잘못된 토큰인 경우 None을 반환합니다.

2. OAuth 2.0을 통한 인증 및 권한 부여

OAuth 2.0은 사용자가 서드파티 애플리케이션에게 제한된 접근 권한을 부여하고 API를 안전하게 보호하기 위한 인증 및 권한 부여 프로토콜입니다. OAuth 2.0 인증을 파이썬으로 구현하려면 oauthlibrequests_oauthlib 패키지를 설치해야 합니다.

OAuth 2.0을 사용하여 인증을 구현하는 예제 코드는 다음과 같습니다:

from oauthlib.oauth2 import BackendApplicationClient
from requests_oauthlib import OAuth2Session

def get_access_token():
    token_url = 'your_token_url'
    client_id = 'your_client_id'
    client_secret = 'your_client_secret'
    client = BackendApplicationClient(client_id=client_id)
    oauth = OAuth2Session(client=client)
    token = oauth.fetch_token(token_url=token_url, client_id=client_id, client_secret=client_secret)
    access_token = token['access_token']
    return access_token

def make_api_request():
    api_url = 'your_api_url'
    access_token = get_access_token()
    headers = {'Authorization': f'Bearer {access_token}'}
    response = requests.get(api_url, headers=headers)
    return response.json()

위의 코드에서 get_access_token 함수는 클라이언트 ID, 클라이언트 시크릿 등을 사용하여 액세스 토큰을 가져오는 함수입니다. make_api_request 함수는 액세스 토큰을 사용하여 API 요청을 만들고 응답을 반환합니다.

3. RBAC(Role-Based Access Control)

Role-Based Access Control (RBAC)은 사용자에게 역할을 부여하고 해당 역할에 대한 권한을 부여하여 시스템의 보안을 강화하는 방법입니다. RBAC을 구현하기 위한 파이썬 예제 코드는 다음과 같습니다:

class User:
    def __init__(self, roles):
        self.roles = roles

class Role:
    def __init__(self, name, permissions):
        self.name = name
        self.permissions = permissions

def has_permission(user, permission):
    for role in user.roles:
        if permission in role.permissions:
            return True
    return False

# Example usage
admin_role = Role('admin', ['create', 'read', 'update', 'delete'])
user = User([admin_role])
print(has_permission(user, 'read'))  # Output: True
print(has_permission(user, 'execute'))  # Output: False

위의 코드에서 UserRole 클래스는 사용자 및 역할을 나타냅니다. has_permission 함수는 사용자의 역할 및 권한을 확인하여 지정된 권한을 가지고 있는지 여부를 반환합니다.

이러한 방법들은 RESTful API를 위한 인증 및 권한 부여를 구현하는 일반적인 방법입니다. 이 중 하나를 선택하여 API의 보안을 강화하고 인증된 요청만 허용하도록 설정할 수 있습니다.