
CORSλ μμ²μ λ§λ κΈ°μ μ΄ μλλ€.
μ νν λ§νλ©΄ λΈλΌμ°μ κ° μλ΅μ μ¬μ©ν μ μλμ§ νλ¨νλ κ·μΉμ΄λ€.
μλ²λ μμ²μ μ μμ μΌλ‘ μ²λ¦¬νκ³ μλ΅μ 보λΈλ€.
νμ§λ§ λΈλΌμ°μ κ° κ·Έ μλ΅μ JavaScriptμ λ겨μ€μ§ λ§μ§λ₯Ό κ²°μ νλ€.
μλ₯Ό λ€μ΄,
νλ‘ νΈμλλ http://localhost:5500μμ μ€ν μ€μ΄κ³ ,
λ°±μλλ http://localhost:8000μμ μ€ν μ€μ΄λΌκ³ κ°μ νμ.
μ΄ λμ port numberκ° λ€λ₯΄κΈ° λλ¬Έμ μΆμ²κ° λ€λ₯΄λ€.
βοΈμ΄λ λΈλΌμ°μ λ 보μ μ μ±
λλ¬Έμ λ€λ₯Έ μΆμ²λ‘μ μμ²μ κΈ°λ³Έμ μΌλ‘ μ°¨λ¨νλ€.
π CORSλ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ΄λ€.
[1] νλ‘ νΈμλ (λ€λ₯Έ Origin)
|
| API μμ²
v
[2] λ°±μλ μλ²
|
| μ μ μλ΅ + CORS ν€λ
v
[3] λΈλΌμ°μ
|
| CORS ν€λ κ²μ¬
|
| ββ νμ©λ Origin β JavaScriptμ μλ΅ μ λ¬
| ββ νμ© μ λ¨ β CORS μλ¬ λ°μ
v
[4] νλ‘ νΈμλ JS
λΈλΌμ°μ λ μλ΅ ν€λμ ν¬ν¨λ CORS κ΄λ ¨ ν€λλ₯Ό νμΈνλ€.
Access-Control-Allow-Origin: http://localhost:5500 Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: Content-Type
CORS μλ¬λ₯Ό μ²μ 보면 ν·κ°λ¦¬λ μ΄μ κ° μλ€.
μ΄κ±΄ λͺ¨μμ΄ μλλ€.
μμ²μ μ±κ³΅νκ³ , μλ΅λ λμ°©νλ€.
λ¨μ§ λΈλΌμ°μ κ° JavaScript μ κ·Όμ μ°¨λ¨νμ λΏμ΄λ€
200 OKμΈλ° Consoleμλ CORS μλ¬κ° μ°ν μλ€.
λΈλΌμ°μ μλ λμΌ μΆμ² μ μ±
(Same-Origin Policy)μ΄λΌλ κ·μΉμ΄ μλ€.
μΉ νμ΄μ§μ JavaScriptκ° λ€λ₯Έ μΆμ²μ λ°μ΄ν°μ ν¨λΆλ‘ μ κ·Όνμ§ λͺ»νκ² λ§λ 보μ μ₯μΉλ€.
μλ₯Ό λ€μ΄ μ² μκ° μν μ¬μ΄νΈμ λ‘κ·ΈμΈν μνλΌκ³ ν΄λ³΄μ.
λμΌ μΆμ² μ μ±
μ΄ μλ€λ©΄, μ
μ± μ¬μ΄νΈκ° μ² μμ λΈλΌμ°μ λ₯Ό ν΅ν΄
μν APIλ₯Ό νΈμΆν΄μ κ³μ’ μ 보λ₯Ό λΉΌκ° μλ μλ€.
νλμ μΉ μλΉμ€ ꡬ쑰λ νλ‘ νΈμλμ λ°±μλκ° λΆλ¦¬λμ΄ μλ κ²½μ°κ° λ§λ€.
μ μμ μΈ μμ²μΈλ°λ μΆμ²κ° λ€λ₯΄λ€λ μ΄μ λ‘ λ§νλ©΄ κ³€λνλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ±μ₯ν κ² λ°λ‘CORS
π λ°±μλκ° λΈλΌμ°μ μκ²
βμ΄ μΆμ²μμ μ€λ μμ²μ νμ©νλ€βλΌκ³ μλ €μ£Όλ λ°©μ
[νλ‘ νΈμλ]
|
| API μμ²
v
[λ°±μλ]
|
| μλ΅ + CORS ν€λ
v
[λΈλΌμ°μ ]
|
| CORS ν€λ κ²μ¬
| ββ νμ© β JSμμ μλ΅ μ¬μ© κ°λ₯
| ββ μ°¨λ¨ β CORS μλ¬
v
[νλ‘ νΈμλ JS]
μλ²λ μλ΅ ν€λμ
βμ΄ μΆμ²λ νμ©λ¨βμ΄λΌλ μ 보λ₯Ό λ΄μ 보λΈλ€.
λΈλΌμ°μ λ κ·Έ ν€λλ₯Ό λ³΄κ³ νλ¨νλ€.
νμ©λ μΆμ²λ©΄ μλ΅ λ°μ΄ν°λ₯Ό JavaScriptμμ μ¬μ©ν μ μκ² νλ€.
FastAPIλ CORSMiddlewareλ₯Ό κΈ°λ³Έ μ 곡νλ€.
κΈ°μ‘΄ λ°±μλ μ½λμ λ―Έλ€μ¨μ΄λ§ μΆκ°νλ©΄ λλ€.
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# νμ©ν μΆμ² λͺ©λ‘
origins = [
"http://localhost:5500", # νλ‘ νΈμλ κ°λ° μλ²
"http://localhost:3000", # React λ± νλ‘ νΈμλ
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins, # νμ©ν μΆμ²
allow_credentials=True, # μΏ ν€ ν¬ν¨ μμ² νμ©
allow_methods=["*"], # λͺ¨λ HTTP λ©μλ νμ©
allow_headers=["*"], # λͺ¨λ HTTP ν€λ νμ©
)
@app.get("/")
async def root():
return {"message": "CORS μ€μ μλ£"}
μλ²λ₯Ό μ¬μμνκ³ λ€μ μμ²νλ©΄
μ΄λ²μλ μ μμ μΌλ‘ μλ΅μ΄ λ€μ΄μ¨λ€.
originsμλ νλ‘ νΈμλ μΆμ²λ§ μ λλ€.origins = [
"http://localhost:5500",
"https://myapp.com"
]
| μ΅μ | μ€λͺ |
|---|---|
allow_origins |
νμ©ν μΆμ² λͺ©λ‘ (["*"] κ°λ₯) |
allow_credentials |
μΏ ν€Β·Authorization ν€λ ν¬ν¨ μμ² νμ© |
allow_methods |
νμ©ν HTTP λ©μλ |
allow_headers |
νμ©ν μμ² ν€λ |
β οΈ credentials + μμΌλμΉ΄λ μ£Όμ
allow_credentials=True μνμμλ
allow_origins=["*"]λ₯Ό μ¬μ©ν μ μλ€.
(μΏ ν€λ μΈμ¦ μ 보λ₯Ό ν¬ν¨νλ μμ²μ μΆμ²λ₯Ό λͺ
νν μ§μ ν΄μΌ ν¨)
# β μλͺ»λ μ€μ (λμ x)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # μμΌλμΉ΄λ
allow_credentials=True, # credentials νμ±ν
)
# β
μ¬λ°λ₯Έ μ€μ
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # λͺ
μμ μΆμ²
allow_credentials=True,
)