[python] FastAPI에서 노출되지 않은 API 엔드포인트 구현하기

FastAPI는 강력한 웹 프레임워크로서 API를 빠르게 구축할 수 있는 기능을 제공합니다. 그러나 때로는 외부에 노출되지 않아야 하는 API 엔드포인트를 구현해야 할 수도 있습니다. 이러한 경우에는 FastAPI의 보안 기능을 활용하여 간단하게 해결할 수 있습니다.

1. FastAPI의 보안 기능 활용하기

FastAPI는 OAuth2 및 JWT(JSON Web Token) 같은 보안 기능을 내장하고 있습니다. 이러한 기능을 활용하면 토큰 기반의 인증 및 인가를 구현할 수 있으며, API 엔드포인트에 접근하는 사용자를 제어할 수 있습니다.

2. API 엔드포인트 숨기기

일부 API 엔드포인트를 외부에 노출되지 않도록 숨기기 위해 @app.route() 데코레이터를 사용할 수 있습니다. 이 데코레이터는 특정 URL 경로에 대한 요청을 처리하는 함수를 등록하는 역할을 합니다. 따라서 이를 활용하여 노출되지 않아야 할 API 엔드포인트를 등록하면 됩니다.

from fastapi import FastAPI

app = FastAPI()

@app.route("/hidden", methods=["GET"])
def hidden_endpoint():
    return {"message": "This endpoint is hidden."}

위 예제에서는 /hidden 경로에 대한 GET 요청을 처리하는 hidden_endpoint 함수를 등록하였습니다. 이 엔드포인트는 외부에 노출되지 않으며, 내부에서만 호출할 수 있습니다.

3. 인증 및 인가 적용하기

일부 API 엔드포인트에는 인증 및 인가가 필요한 경우가 있을 수 있습니다. 이를 위해 FastAPI의 보안 관련 데코레이터인 @app.route() 데코레이터를 사용하여 적절한 설정을 해주어야 합니다.

from fastapi import FastAPI, Depends
from fastapi.security import OAuth2PasswordBearer, HTTPBearer

app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

def get_current_user(token: str = Depends(oauth2_scheme)):
    # 토큰을 검증하고 현재 사용자를 가져오는 로직 작성
    # 예제에서는 단순히 토큰을 반환하도록 구현하였습니다.
    return token

@app.route("/protected", methods=["GET"])
def protected_endpoint(token: str = Depends(HTTPBearer())):
    current_user = get_current_user(token)
    return {"message": f"Protected endpoint for user: {current_user}"}

위 예제에서는 /protected 경로에 대한 GET 요청을 처리하는 protected_endpoint 함수를 등록하였습니다. 이 엔드포인트에는 인증 및 인가가 필요하며, get_current_user 함수를 통해 현재 사용자를 가져옵니다. 이를 위해 OAuth2PasswordBearerHTTPBearer를 사용하여 토큰 기반의 인증을 구현하였습니다.

결론

FastAPI는 노출되지 않아야 하는 API 엔드포인트를 구현하는 데 간단하게 사용할 수 있는 보안 기능을 제공합니다. 앞서 언급한 예제를 통해 숨겨야 하는 엔드포인트를 등록하고 인증 및 인가를 적용하는 방법을 알아보았습니다. 이를 통해 FastAPI를 보다 안전하게 사용할 수 있습니다.


참조: