파이썬 FastAPI와 JWT를 활용한 다중 계정 로그인 및 권한 관리 시스템 구현 방법

개요

웹 애플리케이션에서 다중 계정 로그인 및 권한 관리 시스템을 구현하는 것은 중요한 요소입니다. 이를 위해 파이썬의 FastAPI 프레임워크와 JWT(JSON Web Token)을 활용하면 보안과 효율적인 인증 시스템을 구현할 수 있습니다. 이번 블로그 포스트에서는 FastAPI와 JWT를 이용하여 다중 계정 로그인 및 권한 관리 시스템을 구현하는 방법을 알아보겠습니다.

FastAPI 소개

FastAPI는 파이썬의 웹 프레임워크 중 하나로, 훌륭한 성능과 직관적인 문법을 제공합니다. 비동기 처리를 통해 빠른 속도를 보장하며, 자동 생성되는 API 문서와 풍부한 기능을 갖춘 관리 대시보드 등 개발 생산성을 높여줍니다.

JWT 소개

JWT(JSON Web Token)는 웹 표준으로서, 클라이언트와 서버 간의 인증 정보를 안전하게 전송하는 데 사용됩니다. JWT는 토큰 안에 필요한 정보를 담아 JSON 형태로 인코딩된 문자열로 구성되어 있습니다. 이 토큰은 서버에서 생성되고 클라이언트로 전송되어 인증에 활용됩니다.

다중 계정 로그인 시스템 구현 방법

  1. FastAPI 설치: 먼저 FastAPI를 설치해야 합니다. 터미널에서 pip install fastapi 명령어를 실행하여 FastAPI를 설치합니다.

  2. JWT 라이브러리 설치: JWT를 사용하기 위해 PyJWT 라이브러리를 설치합니다. 터미널에서 pip install PyJWT 명령어를 실행합니다.

  3. 계정 모델 생성: 로그인 시스템을 위해 사용자 계정 모델을 생성합니다. 다음은 간단한 사용자 모델 예시입니다.

from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str
  1. JWT 토큰 생성 함수 생성: JWT 토큰을 생성하기 위한 함수를 작성합니다.
import jwt
from datetime import datetime, timedelta

def create_access_token(username: str):
    payload = {
        'exp': datetime.utcnow() + timedelta(minutes=30),
        'sub': username
    }
    return jwt.encode(payload, 'secret_key', algorithm='HS256')
  1. 로그인 API 구현: FastAPI를 사용하여 로그인 API를 구현합니다.
from fastapi import FastAPI, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from .models import User
from .auth import create_access_token

app = FastAPI()
security = HTTPBearer()

@app.post('/login')
def login(user: User):
    # 사용자 인증 로직 구현
    authorized = True
    if authorized:
        token = create_access_token(user.username)
        return {'access_token': token}
    else:
        raise HTTPException(status_code=401, detail='Invalid credentials')

@app.get('/protected')
def protected(credentials: HTTPAuthorizationCredentials = security):
    # 토큰 유효성 검사 로직 구현
    try:
        payload = jwt.decode(credentials.credentials, 'secret_key', algorithms=['HS256'])
        return {'user': payload['sub']}
    except jwt.exceptions.DecodeError:
        raise HTTPException(status_code=401, detail='Invalid token')
  1. 권한 확인 데코레이터 추가: 특정 API에 접근하기 전에 권한을 확인하는 데코레이터를 작성합니다.
from functools import wraps

def authorize():
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            # 권한 확인 로직 구현
            authorized = True
            if authorized:
                return func(*args, **kwargs)
            else:
                raise HTTPException(status_code=403, detail='Access denied')
        return wrapper
    return decorator

@app.get('/admin')
@authorize()
def admin_only():
    return {'message': 'Only admin can access this API'}
  1. API 테스트: Postman 등을 사용하여 API를 테스트합니다. 로그인 API를 통해 토큰을 발급 받고, 이를 활용해 보호된 API에 접근해볼 수 있습니다.

마무리

이렇게 FastAPI와 JWT를 활용하여 다중 계정 로그인 및 권한 관리 시스템을 구현할 수 있습니다. FastAPI는 훌륭한 성능과 강력한 기능을 제공하며, JWT를 통해 보안적인 요소를 강화할 수 있습니다. 이를 통해 안전하고 효율적인 웹 애플리케이션을 개발할 수 있습니다.

#FastAPI #JWT