λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Back-end & Server/FastAPI

[FastAPI] 미듀웨어

728x90
λ°˜μ‘ν˜•

 

🐰 FastAPI κ³΅μ‹λ¬Έμ„œλ₯Ό λ³΄λ©΄μ„œ 개인적으둜 μ •λ¦¬ν•œ κΈ€ μž…λ‹ˆλ‹€.

 

미듀웨어λ₯Ό FastAPI μ‘μš© ν”„λ‘œκ·Έλž¨μ— μΆ”κ°€ν•  수 μžˆλ‹€. 

"미듀웨어"λŠ” νŠΉμ • 경둜 μž‘λ™μ— μ˜ν•΄ 처리되기 μ „, λͺ¨λ“  μš”μ²­μ— λŒ€ν•΄μ„œ λ™μž‘ν•˜λŠ” ν•¨μˆ˜, λͺ¨λ“  응닡이 λ°˜ν™˜λ˜κΈ° 전에도 λ™μΌν•˜κ²Œ λ™μž‘

  1. μ‘μš© ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ˜€λŠ” μš”μ²­μ„ κ°€μ Έμ˜¨λ‹€.
  2. μš”μ²­ λ˜λŠ” λ‹€λ₯Έ ν•„μš”ν•œ μ½”λ“œλ₯Ό μ‹€ν–‰ μ‹œν‚¬ 수 μžˆλ‹€.
  3. μš”μ²­μ„ μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ 경둜 μž‘λ™μœΌλ‘œ μ „λ‹¬ν•˜μ—¬ μ²˜λ¦¬ν•œλ‹€.
  4. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 경둜 μž‘μ—…μ—μ„œ μƒμ„±ν•œ 응닡을 λ°›λŠ”λ‹€.
  5. 응닡 λ˜λŠ” λ‹€λ₯Έ ν•„μš”ν•œ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” λ™μž‘μ„ ν•  수 μžˆλ‹€.
  6. 응닡을 λ°˜ν™˜ν•œλ‹€.

 

미듀웨어 λ§Œλ“€κΈ°

ν•¨μˆ˜ 상단에 @app.middleware("http") λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

import time

from fastapi import FastAPI, Request
import asyncio

app = FastAPI()

# request의 μˆ˜ν–‰μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” 미듀웨어


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    formatted_time = time.strftime("%H:%M:%S", time.gmtime(process_time))
    response.headers["X-Process-Time"] = formatted_time
    return response


@app.get("/")
async def getItem():
    await asyncio.sleep(5)
    return {"message": "Success"}

 

μ‚¬μš©μž μ •μ˜ ν—€λ”λŠ” X- 접두사λ₯Ό μ‚¬μš©ν•˜μ—¬ μΆ”κ°€ν•œλ‹€.

 

 

CORS(Cross-Origin Resource Sharing)

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°œμƒν•˜λŠ” 동일 좜처 μ •μ±…(Same-Origin Policy)을 μš°νšŒν•˜μ—¬ λ‹€λ₯Έ 좜처(도메인, ν”„λ‘œν† μ½œ λ˜λŠ” ν¬νŠΈκ°€ λ‹€λ₯Έ)의 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•  수 있게 ν•΄μ£ΌλŠ” λ©”μ»€λ‹ˆμ¦˜.

 

동일 좜처 정책은 λ³΄μ•ˆμƒμ˜ 이유둜 μ›Ή λΈŒλΌμš°μ €μ—μ„œ μ μš©λ˜λŠ” μ •μ±…μœΌλ‘œ, μŠ€ν¬λ¦½νŠΈλ‚˜ μŠ€νƒ€μΌ μ‹œνŠΈ λ“±μ˜ λ¦¬μ†ŒμŠ€κ°€ μ›Ή νŽ˜μ΄μ§€μ˜ μΆœμ²˜μ™€ λ™μΌν•œ μΆœμ²˜μ—μ„œ 온 것인지λ₯Ό ν™•μΈν•˜κ³ , λ‹€λ₯Έ μΆœμ²˜μ—μ„œ 온 λ¦¬μ†ŒμŠ€μ—λŠ” 접근을 μ œν•œν•œλ‹€.

 

κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ μΆœμ²˜μ—μ„œ ν•„μš”ν•œ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” 상황이 λ°œμƒν•˜λŠ”λ°, μ΄λ•Œ CORSλ₯Ό μ‚¬μš©ν•œλ‹€.

 

μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ νŠΉμ • μΆœμ²˜λ‘œλΆ€ν„°μ˜ μš”μ²­μ„ ν—ˆμš©ν•˜λŠ” κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” 방식

주둜 API 호좜, Ajax μš”μ²­κ³Ό 같은 비동기 μš”μ²­μ— 많이 μ‚¬μš©λœλ‹€.

 

일반적으둜 μ„œλ²„ μΈ‘μ—μ„œ 응닡 헀더에 Access-Control-Allow-Origin 헀더λ₯Ό μ„€μ •ν•˜μ—¬ νŠΉμ • μΆœμ²˜λ‘œλΆ€ν„°μ˜ μš”μ²­μ„ ν—ˆμš©ν•œλ‹€.

ν—€λ”μ˜ κ°’μœΌλ‘œ 좜처λ₯Ό λͺ…μ‹œν•˜κ±°λ‚˜, *λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  좜처 ν—ˆμš©.

 

FastAPIλŠ” CORSMiddlewareλ₯Ό μ‚¬μš©ν•˜μ—¬ CORSλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

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"}

 

add_middleware의 μΈμžλ“€μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • allow_origins : ꡐ차-좜처 μš”μ²­μ„ 보낼 수 μžˆλŠ” 좜처의 리슀트
  • allow_origin_regex : ꡐ차-좜처 μš”μ²­μ„ 보낼 수 μžˆλŠ” 좜처λ₯Ό μ •κ·œν‘œν˜„μ‹ λ¬Έμžμ—΄λ‘œ λ‚˜νƒ€λƒ„(ex. 'https://.*\.example\.org') 
  • allow_credentials : ꡐ차-좜처 μš”μ²­μ‹œ μΏ ν‚€ 지원 μ—¬λΆ€λ₯Ό μ„€μ •, 기본값은 False, True일 경우 allow_originsλŠ” λ°˜λ“œμ‹œ νŠΉμ • μΆœμ €λ₯Ό 지정해야함.
  • allow_methods : ꡐ차-좜처 μš”μ²­μ„ ν—ˆμš©ν•˜λŠ” HTTP λ©”μ†Œλ“œ 리슀트, 기본값은 ['GET']
  • allow_headers : ꡐ차-좜처λ₯Ό μ§€μ›ν•˜λŠ” HTTP μš”μ²­ ν—€λ”μ˜ 리슀트, 기본값은 []
  • expose_headers : λΈŒλΌμš°μ €μ— μ ‘κ·Όν•  수 μžˆμ–΄μ•Ό ν•˜λŠ” λͺ¨λ“  응닡 헀더λ₯Ό 가리킴, 기본값은 []
  • max_age : λΈŒλΌμš°μ €κ°€ CORS 응닡을 μΊμ‹œμ— μ €μž₯ν•˜λŠ” μ΅œλŒ€ μ‹œκ°„μ„ 초 λ‹¨μœ„λ‘œ μ„€μ •, 기본값은 600

 

λ―Έλ“€μ›¨μ–΄λŠ” 두 가지 νŠΉμ •ν•œ μ’…λ₯˜μ˜ HTTP μš”μ²­μ— μ‘λ‹΅ν•œλ‹€.

  • CORS 사전 μš”μ²­
    • Origin or Access-Control-Request-Method 헀더와 ν•¨κ»˜ μ „μ†‘ν•˜λŠ” λͺ¨λ“  OPTIONS μš”μ²­
    • 이 경우 λ―Έλ“€μ›¨μ–΄λŠ” λ“€μ–΄μ˜€λŠ” μš”μ²­μ„ κ°€λ‘œμ±„ μ μ ˆν•œ CORS 헀더와, 정보 μ œκ³΅μ„ μœ„ν•œ 200 or 400 응닡

 

  • λ‹¨μˆœ μš”μ²­
    • Origin 헀더λ₯Ό 가진 λͺ¨λ“  μš”μ²­
    • 이 경우 λ―Έλ“€μ›¨μ–΄λŠ” μš”μ²­μ„ μ •μƒμ μœΌλ‘œ μ „λ‹¬ν•˜μ§€λ§Œ, μ μ ˆν•œ CORS 헀더λ₯Ό 응닡에 포함
728x90
λ°˜μ‘ν˜•

'Back-end & Server > FastAPI' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[FastAPI] 파일 λΆ„ν•   (0) 2024.02.23
[FastAPI] Relational Database  (0) 2024.02.22
[FastAPI] 경둜 μž‘λ™ μ„€μ •  (0) 2024.02.20
[FastAPI] Form  (0) 2024.02.20
[FastAPI] λͺ¨λΈ  (0) 2024.02.20