[FastAPI] FastAPI로 알아보는 CORS

Origin이란?

Origin은 Protocol, Domain, Port 묶음을 이르는 말이다. (Path나 Query String 등은 해당하지 않는다.)
전부 다른 Origin이다.

Same-Origin Policy (SOP)

SOP는 같은 Origin에서만 Resource를 공유할 수 있다는 원칙이다. 단 예외가 있는데, CORS 정책을 지킨 리소스 요청에 대해서는 허용한다.
따라서 리소스를 다른 Origin 에서 불러오고자 한다면 CORS 정책을 지켜야 한다는 것이다.

Cross-Origin Resource Sharing (CORS)

그렇다면 CORS는 무엇이냐, CORS란 HTTP 헤더를 통해 한 Origin에서 실행 중인 웹 어플리케이션이 다른 Origin의 리소스에 접근할 수 있도록 브라우저에 권한을 부여하는 정책이다.

FastAPI의 CORSMiddleware 사용하기

FastAPI에서는 CORSMiddleware라는 모듈을 통해 CORS를 제어할 수 있다.
먼저 아래와 같이 CORSMiddleware를 import 해준다.
from fastapi.middleware.cors import CORSMiddleware
Python
복사
아래와 같이 Resource 요청을 허용할 Origin을 적어준다.
origins = ["*"] origins = [ "http://localhost.tiangolo.com", "https://localhost.tiangolo.com", "http://localhost", "http://localhost:8080", ]
Python
복사
마지막으로 middleware를 등록한다.
app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) #위의 설정은 모든 origin, 모든 cookie, 모든 method, 모든 header를 allow한다.
Python
복사
allow_credentials는 cross-origin request에서 cookie를 포함할 것인지를 나타낸다. 기본값은 False이다.
allow_methods는 cross-origin request로 허용할 method 들을 나타내고, 기본값은 ['GET'] 이다.
allow_headers는 cross-origin request로 허용할 HTTP Header의 목록이다. Accept, Accpet-Language, Content-Language, Content-Type은 CORS에서 항상 허용되는 HTTP Header이고, 나머지 Header에 대해서 허용 여부를 결정한다. 기본값은 [] 이다.
아래와 같은 arguments도 존재한다.
allow_origin_regex는 정규 표현식을 이용해서 origin을 허용할 수 있게 해주는 매개변수이다.
expose_headers는 Indicate any response headers that should be made accessible to the browser. Defaults to [] 라는데 사실 뭔지 이해를 못했다..ㅠ
max_age는 CORS Response를 브라우저에서 cache하는 최대 시간을 지정할 수 있는 parameter이고, 기본값은 600이다.
CORS에 대해서 더 자세한 정보는 아래 REF)의 모질라 문서를 읽어보도록 하자. 특히 CORS의 세가지 시나리오에 대해서 알면 좋은데 글이 길어져서 나중에 정리해보도록 하겠다.
REF)