Strict Content-Type Checking - FastAPI
핵심 포인트
- 1FastAPI는 기본적으로 JSON 요청 본문에 대해 엄격한 Content-Type 헤더 검사를 수행하여 특정 시나리오의 CSRF 공격으로부터 보호합니다.
- 2이러한 CSRF 위험은 주로 애플리케이션이 로컬 네트워크에서 인증 없이 실행되어 네트워크 내 모든 요청을 신뢰하는 경우에 해당됩니다.
- 3클라이언트 호환성을 위해 `strict_content_type=False`로 설정하여 엄격한 검사를 비활성화할 수 있지만, 이는 해당 CSRF 보호 기능을 제거합니다.
FastAPI는 기본적으로 JSON 요청 본문에 대해 엄격한 Content-Type 헤더 검사를 적용합니다. 이는 JSON 요청이 유효한 Content-Type 헤더(예: application/json)를 포함해야만 본문이 JSON으로 파싱되도록 합니다.
이 기본 동작은 특정 시나리오에서 발생하는 Cross-Site Request Forgery (CSRF) 공격으로부터 보호하는 역할을 합니다. 이러한 공격은 브라우저가 특정 조건에서 CORS preflight check 없이 스크립트가 요청을 보낼 수 있다는 사실을 악용합니다. 그 조건은 다음과 같습니다:
Content-Type헤더가 없는 경우 (예:fetch()를Blobbody와 함께 사용하는 경우).- 어떠한 인증 자격 증명도 보내지 않는 경우.
이러한 유형의 공격은 주로 애플리케이션이 localhost나 내부 네트워크에서 실행되고, 애플리케이션에 인증이 설정되어 있지 않아 동일 네트워크의 모든 요청을 신뢰한다고 가정할 때 관련성이 높습니다.
예를 들어, 로컬 AI 에이전트가 http://localhost:8000/v1/agents/multivac에서 API를 제공하고, 같은 호스트에 프론트엔드가 있는 경우를 상정할 수 있습니다. 애플리케이션이 로컬에서 실행되므로 인증을 설정하지 않고 로컬 네트워크의 접근을 신뢰한다고 가정합니다. 이때 사용자가 https://evilhackers.example.com과 같은 악성 웹사이트를 열면, 해당 웹사이트는 fetch()를 Blob body와 함께 사용하여 http://localhost:8000/v1/agents/multivac 로컬 API에 요청을 보낼 수 있습니다. 악성 웹사이트의 호스트와 로컬 앱의 호스트가 다르더라도, 인증 자격 증명을 보내지 않고 브라우저가 Content-Type 헤더 누락으로 인해 JSON을 보내는 것으로 인식하지 않기 때문에 브라우저는 CORS preflight request를 트리거하지 않습니다. 이를 통해 악성 웹사이트는 로컬 AI 에이전트가 사용자의 전 직장 상사에게 메시지를 보내는 등의 작업을 수행하게 할 수 있습니다.
애플리케이션이 오픈 인터넷에 배포되는 경우, 네트워크를 신뢰하고 인증 없이 권한이 있는 요청을 허용하지 않으므로 이러한 유형의 공격은 적용되지 않습니다. 공격자는 브라우저 상호작용 없이 스크립트를 실행하여 API에 요청을 보낼 수 있기 때문에, 보통 이러한 경우에는 권한 있는 엔드포인트를 이미 보호하고 있을 것입니다. 이 위험은 주로 앱이 로컬 네트워크에서 실행되며 그것이 유일한 보호 수단으로 가정될 때 관련성이 있습니다.
만약 Content-Type 헤더를 보내지 않는 클라이언트를 지원해야 하는 경우, FastAPI 인스턴스를 생성할 때 를 설정하여 엄격한 검사를 비활성화할 수 있습니다.
from fastapi import FastAPI
app = FastAPI(strict_content_type=False)이 설정을 사용하면
Content-Type 헤더가 없는 요청의 본문이 JSON으로 파싱되며, 이는 FastAPI의 이전 버전들과 동일한 동작 방식입니다. 이 동작과 설정은 FastAPI 0.132.0에서 추가되었습니다.