37. CORS (Cross-Origin Resource Sharing)
1. CORS (Cross-Origin Resource Sharing)
- CORS 또는 "Cross-Origin Resource Sharing"은 백엔드는 프론트엔드와 통신하고 있으며, 서로 다른 "origin"에 있는 상황을 나타낸다.
- 웹 페이지 상의 제한된 자원을 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 구조이다.
2. Origin
- origin은 프로토콜(
http
,https
), 도메인(myapp.com
,localhost
,localhost.tiangolo.com
), 포트(80
,443
,8080
) 등의 조합이다. - 다음과 같은 조합은 서로 다른 origins을 의미한다.
1] http://localhost
2] https://localhost
3] http://localhost:8080
- 모두
localhost
가 있지만, 서로 다른 프로토콜 또는 포트를 사용하기 때문에 다른 "origins"이다.
3. Steps
http://localhost:8080
에서 실행 중인 프론트엔드가 있고, 그 프론트엔드의 JavaScript는http://localhost
에서 실행 중인 백엔드와 통신을 시도한다고 가정해 보자.- 그 후 브라우저는 HTTP
OPTIONS
request를 백엔드에 보내고, 만약 백엔드가 이 다른 origin(http://localhost:8080
)으로부터의 통신을 승인하는 적절한 headers를 보내면 그 브라우저는 프론트엔드에 있는 JavaScript로 하여금 request를 백엔드로 보내도록 한다. - 이를 가능하게 하려면, 백엔드에 "allowed origins" 리스트가 있어야 한다.
4. Wildcards
- 목록을
"*"
("wildcard")로 선언하여 모두 허용됨을 나타내는 것도 가능하다. - 하지만 Cookies, 그리고 Bearer Tokens 등과 함께 사용되는 것과 같은 인증 headers와 같은 자격 증명과 관련된 모든 것을 제외하고 특정 유형의 통신만 허용한다.
- 따라서 모든 것이 올바르게 작동하려면 allowed origins를 명시적으로 지정하는 것이 좋다.
5. Use CORSMiddleware
CORSMiddleware
를 사용하여 FastAPI 애플리케이션에서 다음과 같이 구성할 수 있다.
1] CORSMiddleware
를 임포트한다.
2] 문자열로 된 allowed origins의 리스트를 생성한다.
3] FastAPI 애플리케이션에 "middleware"로 추가한다.
- 또한 백엔드가 다음과 같은 것을 허용하도록 지정할 수도 있다.
1] 인증 headers, Cookies 등과 같은 credentials
2] POST
, PUT
과 같은 특정 HTTP 메소드 또는 "*"
3] 특정 HTTP headers 또는 "*"
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost.tiangolo.com",
"https://localhost.tiangolo.com",
"http://localhost",
"http://localhost:8080",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def main():
return {"message": "Hello World"}
CORSMiddleware
구현에서 사용하는 기본 매개변수는 기본적으로 제한적이므로 브라우저가 도메인 간 컨텍스트에서 사용할 수 있도록 하려면 특정 origins, 메서드 또는 headers를 명시적으로 활성화해야 한다.