[python] FastAPI에서 인가 접근 제어 구현하기

FastAPI는 Python으로 구축된 빠르고 현대적인 웹 프레임워크입니다. 이를 활용하여 웹 애플리케이션을 개발할 때, 보안을 고려하여 인가 접근 제어를 구현해야 합니다. 이번 블로그 포스트에서는 FastAPI에서 인가 접근 제어를 구현하는 방법을 살펴보겠습니다.

라이브러리 설치

FastAPI에서 인가 접근 제어를 구현하기 위해 다음과 같은 추가 라이브러리를 설치해야 합니다.

pip install fastapi
pip install pyjwt

JWT(JSON Web Token) 사용하기

인가 접근 제어를 구현하기 위해 JWT(JSON Web Token)를 사용할 것입니다. JWT는 사용자 인증에 사용되는 비교적 간단한 토큰 기반 인증 방식입니다.

먼저, JWT를 생성하여 클라이언트에게 제공해야 합니다. 이를 위해 다음과 같은 코드를 작성할 수 있습니다.

import jwt

secret_key = "mysecretkey"

def create_token(username: str) -> str:
    payload = {"username": username}
    token = jwt.encode(payload, secret_key, algorithm="HS256")
    return token

위의 코드에서 create_token 함수는 사용자 이름을 인자로 받아 JWT를 생성하고 반환합니다. jwt.encode 함수를 사용하여 JWT를 생성할 수 있습니다. 이때, secret_key는 서버에서만 알고 있는 비밀 키입니다.

라우트 보호하기

인가 접근 제어를 구현하기 위해 FastAPI의 미들웨어를 사용할 수 있습니다. 미들웨어는 클라이언트의 요청을 가로채고 처리하기 전에 추가적인 동작을 수행할 수 있습니다.

다음 예제 코드는 미들웨어를 사용하여 JWT 유효성을 검사하는 방법을 보여줍니다.

from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials

security = HTTPBearer()

app = FastAPI()

@app.get("/protected")
def protected_route(credentials: HTTPAuthorizationCredentials = Depends(security)):
    try:
        token = credentials.credentials
        decoded_token = jwt.decode(token, secret_key, algorithms=["HS256"])
        username = decoded_token["username"]
        return {"message": f"Welcome, {username}!"}
    except jwt.DecodeError:
        raise HTTPException(status_code=401, detail="Invalid token")
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

위의 코드에서 /protected 경로에 대한 GET 요청을 보호하기 위해 protected_route 함수에 credentials 매개변수를 추가하였습니다. 이 함수는 클라이언트의 JWT를 받아 유효성을 검사하고 JWT에 포함된 사용자 이름을 반환합니다. 만약 JWT가 유효하지 않을 경우 HTTPException을 발생시킵니다.

결론

이와 같이 FastAPI에서 인가 접근 제어를 구현하는 방법을 알아보았습니다. JWT를 사용하여 사용자 인증을 처리하고 미들웨어를 활용하여 보호할 경로에 대한 접근을 제한할 수 있습니다. 보안에 신경을 쓰며 안전한 웹 애플리케이션을 개발할 수 있습니다.