python / / 2024. 8. 16. 09:47

[fastapi] Cookie 매개변수 사용하기

1. Annotated란?

Annotated는 Python 3.9 이상에서 사용할 수 있는 기능으로, 타입 힌트에 추가적인 메타데이터를 포함시킬 수 있게 해준다. FastAPI에서는 이를 활용하여 라우트 함수의 매개변수에 추가 정보를 제공하거나, 의존성을 주입하는 데 사용한다.

2. 기본적인 Annotated와 Cookie 사용법

쿠키 데이터를 라우트 함수에서 처리하기 위해 Annotated와 함께 Cookie 매개변수를 사용할 수 있다. 이를 통해 쿠키를 더 명확하고 구조적으로 처리할 수 있다.

아래는 Annotated를 사용한 기본적인 쿠키 처리 예제입니다:

from fastapi import FastAPI, Cookie
from typing import Annotated

app = FastAPI()

@app.get("/get-cookie/")
def read_cookie(my_cookie: Annotated[str | None, Cookie()] = None):
    return {"my_cookie": my_cookie}

여기서 Annotated를 사용하여 my_cookie 매개변수가 str 타입의 쿠키 값을 받도록 지정했다. Cookie()는 FastAPI의 쿠키 주입 기능을 활성화한다. str | None 타입 힌트를 통해 쿠키가 존재하지 않을 때 None을 반환하도록 했다.

3. 여러 쿠키를 처리하기

여러 개의 쿠키를 동시에 처리해야 하는 경우에도 Annotated를 사용하면 각 쿠키를 깔끔하게 처리할 수 있다.

from fastapi import FastAPI, Cookie
from typing import Annotated

app = FastAPI()

@app.get("/get-cookies/")
def read_cookies(
    cookie1: Annotated[str | None, Cookie()],
    cookie2: Annotated[str | None, Cookie()] = None
):
    return {"cookie1": cookie1, "cookie2": cookie2}

이 예제에서는 cookie1cookie2라는 두 개의 쿠키를 처리한다. cookie2는 기본값이 None으로 설정되어 있어, 클라이언트가 해당 쿠키를 전송하지 않아도 문제가 없다.

4. 쿠키 기본값 설정하기

쿠키가 존재하지 않을 경우 기본값을 설정할 수도 있다. 이를 통해 클라이언트가 쿠키를 전송하지 않더라도, 애플리케이션이 정상적으로 동작하도록 할 수 있다.

from fastapi import FastAPI, Cookie
from typing import Annotated

app = FastAPI()

@app.get("/get-cookie-default/")
def read_cookie_with_default(my_cookie: Annotated[str, Cookie()] = "default_value"):
    return {"my_cookie": my_cookie}

위 코드에서 my_cookie는 기본값으로 "default_value"를 가집니다. 클라이언트가 my_cookie 쿠키를 전송하지 않으면 기본값이 반환된다.

5. 쿠키 유효성 검사 및 추가 기능

AnnotatedCookie를 결합하면 쿠키의 유효성을 검사하거나 추가적인 메타데이터를 활용할 수 있다. 예를 들어, 쿠키 값이 특정 형식을 따라야 할 경우 Annotated를 통해 이를 검증할 수 있다.

from fastapi import FastAPI, Cookie, HTTPException
from typing import Annotated

app = FastAPI()

@app.get("/validate-cookie/")
def validate_cookie(my_cookie: Annotated[str, Cookie()] = None):
    if my_cookie is None or not my_cookie.startswith("valid_"):
        raise HTTPException(status_code=400, detail="Invalid cookie value")
    return {"my_cookie": my_cookie}

이 예제에서는 my_cookie 쿠키가 "valid_"로 시작하는지 확인하고, 그렇지 않은 경우 HTTP 400 오류를 반환한다.

6. 실제 애플리케이션에서의 활용 예

실제 애플리케이션에서 AnnotatedCookie를 사용하면 더욱 명확하고 유지보수하기 쉬운 코드를 작성할 수 있다. 예를 들어, 사용자 인증 쿠키를 처리하는 엔드포인트를 다음과 같이 구현할 수 있다.

from fastapi import FastAPI, Cookie, HTTPException
from typing import Annotated

app = FastAPI()

@app.get("/dashboard/")
def dashboard(session_token: Annotated[str | None, Cookie()] = None):
    if session_token != "expected_token":
        raise HTTPException(status_code=403, detail="Unauthorized")
    return {"message": "Welcome to your dashboard"}

이 코드는 session_token 쿠키가 존재하고, 특정 값과 일치하는 경우에만 대시보드 접근을 허용한다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유