<aside>
</aside>
μλ νμΈμ! FastAPI 8κ° μκ°μ λλ€! βοΈ
7κ°μμλ μμ‘΄μ± μ£Όμ
(Depends
)μ ν΅ν΄ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ ꡬ쑰λ₯Ό κ°μ νλ λ°©λ²μ λ°°μ μ΅λλ€. νΉμ μλν¬μΈνΈκ° νμλ‘ νλ κΈ°λ₯μ κΉλνκ² μ£Όμ
λ°μ μ μμμ£ !
μ΄λ² μκ°μλ λͺ¨λ μμ² λλ λλΆλΆμ μμ²μ λν΄ κ³΅ν΅μ μΌλ‘ μ²λ¦¬ν΄μΌ νλ λ‘μ§μ μ μ©νλ λ λ€λ₯Έ λ°©λ²μΈ **λ―Έλ€μ¨μ΄(Middleware)**μ λν΄ μμλ΄ λλ€. λ§μΉ API μλ²μ λ¬Έμ§κΈ°μ²λΌ, μμ²μ΄ λ€μ΄μ€κ±°λ μλ΅μ΄ λκ°κΈ° μ νμ νΉμ μμ μ μννκ² ν μ μμ΄μ. πββοΈ
λλΆμ΄, μΉ κ°λ° μ (νΉν νλ‘ νΈμλμ λ°±μλλ₯Ό λΆλ¦¬ν λ) λ°λμ λ§μ£ΌμΉκ² λλ CORS(Cross-Origin Resource Sharing) μ΄μμ μ΄λ₯Ό FastAPIμμ μ°μνκ² ν΄κ²°νλ λ°©λ²κΉμ§ ν¨κ» λ€λ£° μμ μ λλ€. νλ‘ νΈμλ κ°λ°μμ μννκ² νμ νκΈ° μν νμ κ΄λ¬Έμ΄μ£ ! π€
μ, κ·ΈλΌ API μλ²μ λ¬Έμ§κΈ°, λ―Έλ€μ¨μ΄μ μΉ λΈλΌμ°μ μ 보μ μ₯λ²½ CORSμ λν΄ μμλ³ΌκΉμ?
μ΄λ² 8κ°μμλ FastAPI μ ν리μΌμ΄μ μ μμ²κ³Ό μλ΅ μ²λ¦¬ κ³Όμ μ **μ€κ° λ¨κ³(Middleware)**λ₯Ό μΆκ°νμ¬ κ³΅ν΅ λ‘μ§μ μ μ©νλ λ°©λ²μ λ°°μλλ€. λ―Έλ€μ¨μ΄λ λͺ¨λ μμ²μ΄ κ²½λ‘ μλ ν¨μμ λλ¬νκΈ° μ , κ·Έλ¦¬κ³ λͺ¨λ μλ΅μ΄ ν΄λΌμ΄μΈνΈμκ² μ μ‘λκΈ° μ μ μ€νλ μ μλ μ½λ μ‘°κ°μ λλ€. μ΄λ₯Ό νμ©νμ¬ μμ² λ‘κΉ , 컀μ€ν ν€λ μΆκ°, κΈ°λ³Έμ μΈ μΈμ¦ νμΈ λ± λ€μν **ν‘λ¨ κ΄μ¬μ¬(Cross-cutting Concerns)**λ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
FastAPIλ Starletteμ λ―Έλ€μ¨μ΄ μμ€ν
μ κ·Έλλ‘ μ¬μ©νλ©°, @app.middleware("http")
λ°μ½λ μ΄ν°λ ASGI λ―Έλ€μ¨μ΄ ν΄λμ€λ₯Ό ν΅ν΄ ꡬνν μ μμ΅λλ€.
λν, μΉ λΈλΌμ°μ μ **λμΌ μΆμ² μ μ±
(Same-Origin Policy, SOP)**μΌλ‘ μΈν΄ λ°μνλ CORS(Cross-Origin Resource Sharing) λ¬Έμ λ₯Ό μ΄ν΄νκ³ , FastAPIμ CORSMiddleware
λ₯Ό μ¬μ©νμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ μ€μ΅ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ€λ₯Έ λλ©μΈ(μΆμ²)μμ μ€νλλ νλ‘ νΈμλ μ ν리μΌμ΄μ
(μ: React, Vue μ±)μ΄ FastAPI λ°±μλ APIμ μμ νκ² ν΅μ ν μ μλλ‘ μ€μ νλ λ°©λ²μ λ°°μ°κ² λ©λλ€.
μ΄ κ°μλ₯Ό λ§μΉλ©΄ μ¬λ¬λΆμ λ€μμ ν μ μκ² λ©λλ€:
@app.middleware("http")
λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μ»€μ€ν
λ―Έλ€μ¨μ΄λ₯Ό ꡬννκ³ , μμ² μ νμ λ‘μ§μ μΆκ°ν μ μμ΅λλ€.CORSMiddleware
λ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ
μ CORS μ§μμ μ€μ νκ³ , μ£Όμ μ΅μ
(allow_origins
, allow_methods
λ±)μ ꡬμ±ν μ μμ΅λλ€.