[python] FastAPI에 인증 및 권한 부여 구현하기

FastAPI는 Python으로 빠르게 API를 구축할 수 있는 강력한 프레임워크입니다. 이번 블로그 포스트에서는 FastAPI 애플리케이션에 인증과 권한 부여를 구현하는 방법에 대해 알아보겠습니다.

1. 사용자 모델 생성하기

FastAPI는 자체적인 인증 및 권한 부여 시스템을 제공하지 않기 때문에, 우선적으로 사용자 모델을 생성해야 합니다. 예를 들어, 다음과 같이 사용자 모델을 정의할 수 있습니다:

from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str
    email: str
    role: str

2. JWT (JSON Web Tokens)를 사용한 인증

FastAPI에서는 JWT를 사용하여 인증을 처리하는 것이 일반적입니다. 이를 위해서는 pyjwt와 같은 JWT 라이브러리를 설치해야 합니다. 다음 예제는 JWT를 생성하고 검증하는 함수를 보여줍니다:

import jwt

def create_access_token(data: dict, secret_key: str, algorithm: str, expires_in: int):
    encoded_jwt = jwt.encode(data, secret_key, algorithm=algorithm)
    return encoded_jwt

def verify_access_token(token: str, secret_key: str, algorithm: str):
    try:
        decoded_jwt = jwt.decode(token, secret_key, algorithms=[algorithm])
        return decoded_jwt
    except jwt.JWTError:
        return None

3. 인증 및 권한 부여 기능 구현하기

FastAPI의 라우터를 사용하여 인증 및 권한 부여 기능을 구현할 수 있습니다. 예를 들어, 다음과 같이 loginprotected라는 두 개의 엔드포인트를 생성할 수 있습니다:

from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/login")

app = FastAPI()

@app.post("/login")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    # 사용자 인증 확인 로직 구현

    # JWT 생성
    access_token = create_access_token(
        data={"username": form_data.username},  # 사용자 식별 정보
        secret_key="supersecret",  # 비밀 키
        algorithm="HS256",  # 알고리즘
        expires_in=3600  # 토큰 유효 시간 (초)
    )

    return {"access_token": access_token, "token_type": "bearer"}

@app.get("/protected")
async def protected(token: str = Depends(oauth2_scheme)):
    user = verify_access_token(token, "supersecret", "HS256")
    if not user:
        raise HTTPException(status_code=401, detail="Invalid token")

    # 사용자 권한 확인 로직 구현

    return {"message": "Protected endpoint"}

위 코드에서 /login 엔드포인트는 사용자 인증을 처리하고, JWT를 생성하여 응답으로 반환합니다. /protected 엔드포인트는 인가되지 않은 사용자로부터의 요청을 방지하기 위해 oauth2_scheme을 사용하여 토큰을 검증합니다.

마치며

이번 포스트에서는 FastAPI에서 인증과 권한 부여를 구현하는 방법에 대해 알아보았습니다. FastAPI의 간결성과 빠른 속도를 활용하여 안전한 API를 개발할 수 있습니다.

더 자세한 내용과 예제 코드는 FastAPI 공식 문서를 참고해주세요.