고급 미들웨어
고급 미들웨어 (Advanced Middleware)
메인 튜토리얼에서 Custom Middleware를 애플리케이션에 추가하는 방법을 읽었어요.
그리고 CORSMiddleware로 CORS 처리하는 방법도 읽었죠.
이번 섹션에서는 다른 미들웨어들을 어떻게 쓰는지 볼 거예요.
출처: 공식문서
ASGI 미들웨어 추가하기
FastAPI는 Starlette에 기반하고 ASGI(비동기 서버 게이트웨이 인터페이스) 명세를 구현하므로, 어떤 ASGI 미들웨어든 사용할 수 있어요.
미들웨어는 ASGI 명세를 따르기만 하면 FastAPI나 Starlette용으로 만들어지지 않아도 동작해요.
일반적으로 ASGI 미들웨어는 첫 번째 인자로 ASGI 앱을 받을 것으로 기대하는 클래스들이에요.
그래서 서드파티 ASGI 미들웨어 문서에는 아마 이렇게 하라고 나와 있을 거예요.
from unicorn import UnicornMiddleware
app = SomeASGIApp()
new_app = UnicornMiddleware(app, some_config="rainbow")
하지만 FastAPI(사실 Starlette)는 더 단순한 방법을 제공해요. 내부 미들웨어들이 서버 오류를 처리하고 커스텀 예외 핸들러가 제대로 동작하도록 보장해 주죠.
그러려면(CORS 예시에서처럼) app.add_middleware()를 사용하면 돼요.
from fastapi import FastAPI
from unicorn import UnicornMiddleware
app = FastAPI()
app.add_middleware(UnicornMiddleware, some_config="rainbow")
app.add_middleware()는 첫 번째 인자로 미들웨어 클래스를 받고, 미들웨어에 전달할 추가 인자들을 그 뒤에 받아요.
통합된 미들웨어들
FastAPI에는 일반적인 사용 사례를 위한 여러 미들웨어가 포함돼 있어요. 다음에 이들을 어떻게 사용하는지 볼게요.
기술적 세부 사항
다음 예시들에서는
from starlette.middleware.something import SomethingMiddleware를 쓸 수도 있어요.FastAPI가
fastapi.middleware에 여러 미들웨어를 제공하는 건 개발자(여러분)를 위한 편의일 뿐이에요. 대부분의 미들웨어는 실제로 Starlette에서 바로 온 거예요.
HTTPSRedirectMiddleware
모든 들어오는 요청이 https 또는 wss여야 한다고 강제해요.
http나 ws로 들어오는 요청은 보안 스킴(secure scheme)으로 리다이렉트돼요.
Python 3.10+
from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
app = FastAPI()
app.add_middleware(HTTPSRedirectMiddleware)
@app.get("/")
async def main():
return {"message": "Hello World"}
TrustedHostMiddleware
HTTP Host Header 공격을 방어하기 위해, 모든 들어오는 요청이 올바르게 설정된 Host 헤더를 갖도록 강제해요.
Python 3.10+
from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware
app = FastAPI()
app.add_middleware(
TrustedHostMiddleware, allowed_hosts=["example.com", "*.example.com"]
)
@app.get("/")
async def main():
return {"message": "Hello World"}
다음 인자들이 지원돼요.
allowed_hosts- 호스트 이름으로 허용해야 할 도메인 이름들의 목록.*.example.com같은 와일드카드 도메인은 서브도메인 매칭을 지원해요. 어떤 호스트 이름이든 허용하려면allowed_hosts=["*"]를 쓰거나 미들웨어를 생략하세요.www_redirect-True로 설정하면, 허용된 호스트의 non-www 버전으로의 요청은 www 버전으로 리다이렉트돼요. 기본값은True예요.
들어오는 요청이 올바르게 검증되지 않으면 400 응답이 보내져요.
GZipMiddleware
Accept-Encoding 헤더에 "gzip"이 포함된 어떤 요청에 대해서든 GZip 응답을 처리해요.
미들웨어는 표준 응답과 스트리밍 응답 둘 다 처리해요.
Python 3.10+
from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware
app = FastAPI()
app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=5)
@app.get("/")
async def main():
return "somebigcontent"
다음 인자들이 지원돼요.
minimum_size- 이 최소 크기(바이트)보다 작은 응답은 GZip 하지 마세요. 기본값은500이에요.compresslevel- GZip 압축 중에 사용돼요. 1에서 9 사이의 정수예요. 기본값은9예요. 값이 낮을수록 압축이 빠르지만 파일이 커지고, 값이 높을수록 압축이 느리지만 파일이 작아져요.
다른 미들웨어들
다른 ASGI 미들웨어도 많아요.
예를 들어:
다른 사용 가능한 미들웨어를 보려면 Starlette의 Middleware 문서와 ASGI Awesome List를 확인해 보세요.
더 알아보기 (Learn more)
이 문서는 FastAPI 공식 문서 - Advanced Middleware를 한국어로 정리한 번역이에요. 원문에서 최신 내용과 더 다양한 예시를 확인하세요.