FastAPI 서버개발, CORS의 필요성과 보안 고려사항

FastAPI는 현대적인 웹 프레임워크 중 하나로, Python을 기반으로 하여 빠르고 효율적으로 API 서버를 개발할 수 있도록 돕습니다. 특히 비동기 처리를 지원하기 때문에 높은 성능을 자랑합니다. 본 강좌에서는 FastAPI 서버 개발에 있어서 CORS(Cross-Origin Resource Sharing)의 필요성과 관련된 보안 고려사항에 대해 자세히 설명하겠습니다.

1. CORS란 무엇인가?

CORS는 Cross-Origin Resource Sharing의 약자로, 다른 출처(Origin)의 서버와 자원을 공유하기 위한 메커니즘입니다. 기본적으로 웹 브라우저는 보안상의 이유로 다른 출처의 자원 요청을 제한하고 있습니다. 예를 들어, A.com에서 실행되는 스크립트는 B.com의 API에 접근할 수 없습니다. 하지만, 적절한 CORS 헤더를 서버에서 설정함으로써 이러한 제한을 해제할 수 있습니다.

1.1 CORS의 필요성

CORS는 여러 서비스가 서로 연동될 필요가 있는 현대 웹 환경에서 필수적입니다. 프론트엔드와 백엔드가 다른 출처에 있을 경우, 프론트엔드에서 API를 호출할 때 CORS 설정이 필요합니다. 만약 CORS가 설정되지 않은 경우, 웹 브라우저는 요청을 차단하게 되어 사용자에게 원활한 서비스 제공이 어려워집니다.

2. FastAPI에서 CORS 설정하기

FastAPI에서는 CORS에 대한 설정이 매우 간단합니다. fastapi.middleware.cors 모듈을 통해 쉽게 CORS 미들웨어를 추가할 수 있습니다. 아래 예제를 통해 FastAPI에서 CORS 설정을 어떻게 하는지 살펴보겠습니다.

2.1 FastAPI 애플리케이션 생성 및 CORS 추가

python
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# CORS 미들웨어 설정
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 모든 출처 허용
    allow_credentials=True,
    allow_methods=["*"],  # 모든 HTTP 메서드 허용
    allow_headers=["*"],  # 모든 HTTP 헤더 허용
)

@app.get("/")
async def read_root():
    return {"Hello": "World"}
    

위 코드에서 allow_origins=["*"]는 모든 출처의 요청을 허용하는 설정입니다. 실제 운영 환경에서는 특정 도메인만 허용하는 것이 좋습니다.

3. 보안 고려사항

CORS 설정은 보안과 관련하여 매우 중요한 요소입니다. 적절한 CORS 정책을 설정하지 않을 경우, 원치 않는 출처에서 API에 접근하거나 악의적인 요청이 발생할 수 있습니다. 따라서 아래와 같은 보안 고려사항을 반드시 점검해야 합니다.

3.1 신뢰할 수 있는 출처만 허용하기

CORS를 설정할 때는 신뢰할 수 있는 출처만을 허용해야 합니다. 예를 들어, allow_origins=["https://example.com"]와 같이 특정 도메인만 허용할 수 있습니다. 이는 보안의 기본입니다.

3.2 데이터 검증과 인증

모든 API 요청에 대해 적절한 인증과 데이터 검증을 수행해야 합니다. FastAPI에서는 OAuth2, JWT 같은 토큰 기반 인증 메커니즘을 통해 API 인증을 쉽게 구현할 수 있습니다.

3.3 HTTP 메서드 제한하기

API에서 허용하는 HTTP 메서드를 제한함으로써 불필요한 접근을 차단할 수 있습니다. 예를 들어, GET과 POST 메서드만을 허용하는 방식으로 설정할 수 있습니다. 아래는 메서드를 제한하는 예시입니다.

python
app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://example.com"],
    allow_credentials=True,
    allow_methods=["GET", "POST"],  # 제한된 HTTP 메서드 허용
    allow_headers=["*"],
)

3.4 CSRF 보호

Cross-Site Request Forgery(CSRF) 공격에 대해 주의해야 합니다. FastAPI에서는 CSRF 보호를 위해 적절한 인증 토큰을 사용해야 하며, 중요한 상태 변화가 포함된 요청에 대해 추가적인 확인 절차를 두는 것이 좋습니다.

4. CORS와 보안 확인 예제

아래는 CORS와 보안 고려사항을 적용한 FastAPI의 전체 예제입니다. 이 예제에서는 기본적인 CORS 설정과 함께 데이터 검증을 포함하여 실제 API 사용을 보여줍니다.

python
from fastapi import FastAPI, HTTPException, Depends
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, EmailStr
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()

# CORS 미들웨어 설정
app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://example.com"],
    allow_credentials=True,
    allow_methods=["GET", "POST"],
    allow_headers=["*"],
)

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

class User(BaseModel):
    email: EmailStr
    password: str

@app.post("/users/")
async def create_user(user: User, token: str = Depends(oauth2_scheme)):
    # 사용자 데이터 검증과 저장 로직
    if not user.email or not user.password:
        raise HTTPException(status_code=400, detail="Invalid user data")
    return {"email": user.email, "message": "User created successfully!"}

@app.get("/")
async def read_root():
    return {"Hello": "World"}

5. 결론

FastAPI에서 CORS 설정은 필수적이며, 올바른 CORS 정책을 설정하여 보안상의 문제를 예방하는 것이 중요합니다. 실제 운영 단계에서는 보다 세부적인 보안 고려사항을 반드시 점검하고, 필요에 따라 추가적인 보안 수단을 적용해야 합니다. FastAPI의 유연함을 활용하여 안전하면서도 강력한 API 서버를 구축해보세요.

이 글이 FastAPI에서 CORS를 설정하고 보안 고려사항을 이해하는 데 도움이 되었기를 바랍니다.