이전 403 인증 오류 상태 코드 사용하기

이전 403 인증 오류 상태 코드 사용하기 (Use Old 403 Authentication Error Status Codes)

FastAPI 버전 0.122.0 이전에는, 인증 실패 후 내장된 보안 유틸리티들이 클라이언트에게 오류를 반환할 때 HTTP 상태 코드 403 Forbidden 을 사용했어요.

FastAPI 버전 0.122.0부터는 HTTP 사양인 RFC 7235, RFC 9110을 따라, 더 적절한 HTTP 상태 코드 401 Unauthorized 를 사용하고 응답에 타당한 WWW-Authenticate 헤더를 반환해요.

하지만 어떤 이유로 여러분의 클라이언트들이 예전 동작에 의존하고 있다면, 보안 클래스에서 make_not_authenticated_error 메서드를 오버라이드해서 예전 동작으로 되돌릴 수 있어요.

예를 들어, 기본인 401 Unauthorized 대신 403 Forbidden 오류를 반환하는 HTTPBearer의 서브클래스를 만들 수 있어요:

from typing import Annotated

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

app = FastAPI()


class HTTPBearer403(HTTPBearer):
    def make_not_authenticated_error(self) -> HTTPException:
        return HTTPException(
            status_code=status.HTTP_403_FORBIDDEN, detail="Not authenticated"
        )


CredentialsDep = Annotated[HTTPAuthorizationCredentials, Depends(HTTPBearer403())]


@app.get("/me")
def read_me(credentials: CredentialsDep):
    return {"message": "You are authenticated", "token": credentials.credentials}

💡 팁: 함수가 예외 인스턴스를 반환하지, 예외를 던지지(raise) 않는다는 점을 눈여겨보세요. 던지는 것은 나머지 내부 코드에서 처리돼요.

더 알아보기 (Learn more)