
FastAPI์์ Header ํ๋ผ๋ฏธํฐ๋ ๋จ์ํ โ์์ฒญ ์ ๋ณดโ๋ฅผ ์ฝ๋ ๊ธฐ๋ฅ์ด ์๋๋ค.
Header๋ ์์ฒญ์ ๋งฅ๋ฝ(Context)๊ณผ ์์ฒญ์์ ์ ์ฒด์ฑ์ ๋ด๋ ํต์ฌ ํต๋ก๋ค.
์ด๋ฒ ๊ธ์์๋ Header๊ฐ ๋ฌด์์ธ์ง, ์ ํ์ํ์ง, FastAPI์์ ์ด๋ค ๊ฐ๋ ์ผ๋ก ๋ค๋ค์ง๋์ง๋ฅผ ์ฒ์ฒํ ๊ตฌ์กฐ์ ์ผ๋ก ์ ๋ฆฌํ๋ค.
Header๋ ์์ด๋ก ๋จธ๋ฆฌ ๋ผ๋ ๋ป์ด๋ค.
HTTP ๋ฉ์์ง๋ ์ฌ๋์ฒ๋ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
| ๊ตฌ์ฑ ์์ | ์๋ฏธ | ์ฌ๋์ ๋น์ ํ๋ฉด |
|---|---|---|
| Header | ์์ฒญ์ ๋ฉํ ์ ๋ณด | ๋จธ๋ฆฌ (ํ๋จ, ์ ์ฒด์ฑ) |
| Body | ์ค์ ์ ๋ฌ ๋ฐ์ดํฐ | ๋ชธํต (๋ด์ฉ๋ฌผ) |
์ฆ, Header๋ โ์ด ์์ฒญ์ด ์ด๋ค ์ํฉ์์ ์๋์งโ๋ฅผ ์ค๋ช ํ๋ค.
HTTP ์์ฒญ์ ํธ์ง๋ก ์๊ฐํด๋ณด์.
| ํธ์ง ์์ | HTTP ์์ฒญ |
|---|---|
| ๋ดํฌ์ ์ ํ ์ ๋ณด | Header |
| ํธ์ง ๋ด์ฉ | Body |
| ๋ฐ๋ ์ฌ๋ ์ฃผ์ | Host ํค๋ |
| ๋ณด๋ธ ์ฌ๋ ์ ๋ณด | User-Agent ํค๋ |
๋ดํฌ ์ ๋ณด๊ฐ ์์ผ๋ฉด ํธ์ง๋ ์ด๋์ ์๋์ง, ์ด๋๋ก ๊ฐ์ผ ํ๋์ง ์ ์ ์๋ค.
HTTP ์์ฒญ๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
Header์๋ ๋ฐ์ดํฐ ์์ฒด๊ฐ ์๋๋ผ ๋ฐ์ดํฐ๋ฅผ ์ค๋ช ํ๋ ์ ๋ณด๊ฐ ๋ด๊ธด๋ค.
| ํค๋ ์์ | ์๋ฏธ |
|---|---|
| User-Agent | ์์ฒญ์ ๋ณด๋ธ ํด๋ผ์ด์ธํธ ์ ๋ณด |
| Authorization | ์ธ์ฆ ํ ํฐ |
| Content-Type | Body ๋ฐ์ดํฐ ํ์ |
| Accept | ์ํ๋ ์๋ต ํ์ |
FastAPI๋ ์ด Header ๊ฐ๋ค์ ํจ์ ํ๋ผ๋ฏธํฐ์ฒ๋ผ ์ง์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
FastAPI์์ Header๋ Query, Path, Cookie์ ๊ฐ์ โํ๋ผ๋ฏธํฐ ์ถ์ฒโ ์ค ํ๋๋ค.
| ํ๋ผ๋ฏธํฐ ์ข ๋ฅ | ์์น | ๋น์ |
|---|---|---|
| Path | URL ๊ฒฝ๋ก | ๋ฐฐ์ก์ง ์ฃผ์ |
| Query | ?key=value | ์์ฒญ ์ต์ |
| Header | ์์ฒญ ํค๋ | ๋ดํฌ ์ ๋ณด |
| Body | ์์ฒญ ๋ณธ๋ฌธ | ์์ ์ ๋ด์ฉ๋ฌผ |
์ด์ Header ํ๋ผ๋ฏธํฐ๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ์ฝ๋๋ก ํ์ธํด๋ณด์.
from typing import Annotated
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/items/")
async def read_items(
user_agent: Annotated[str | None, Header()] = None
):
return {"User-Agent": user_agent}
์ด ์ฝ๋์ ์๋ฏธ๋ฅผ ํ ์ค๋ก ์ฝ์ผ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ฒฐ๊ณผ:
{"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"}
๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ๋ณด๋ด๋ User-Agent ํค๋ ๊ฐ์ด ๊ทธ๋๋ก ์ถ๋ ฅ ๋๋ค.
FastAPI๋ Header()๋ฅผ ๋ณด๋ ์๊ฐ ์ด ํ๋ผ๋ฏธํฐ๋ฅผ Header ์ ์ฉ์ผ๋ก ํด์ํ๋ค.
Header ํ๋ผ๋ฏธํฐ์๋ Query, Path์๋ ์๋ ์์ฃผ ์ค์ํ ์๋ ๋ณํ ๊ท์น์ด ํ๋ ์๋ค.
๋ฐ๋ก ์ธ๋์ค์ฝ์ด(_) โ ํ์ดํ(-) ์๋ ๋ณํ์ด๋ค.
HTTP Header ์ด๋ฆ์ ํ์ดํ(-)์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ค์ด๋ค.
ํ์ง๋ง Python ๋ณ์๋ช ์๋ ํ์ดํ์ ์ฌ์ฉํ ์ ์๋ค.
# โ ๋ฌธ๋ฒ ์ค๋ฅ user-agent = "Mozilla" ๊ทธ๋์ FastAPI๋ Python ์นํ์ ์ธ ์ด๋ฆ์ ์ฐ๋ฉด HTTP ํ์ค Header ์ด๋ฆ์ผ๋ก ์๋ ๋ณํํด์ค๋ค.
| Python ๋ณ์๋ช | ์ค์ ์ฐพ๋ Header |
|---|---|
| user_agent | User-Agent |
| content_type | Content-Type |
| x_token | X-Token |
@app.get("/items/")
async def read_items(user_agent: Annotated[str | None, Header()] = None):
return {"User-Agent": user_agent}
์ด ์ฝ๋๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ ๊ฒ ํด์๋๋ค.
์์ฃผ ํน์ํ ์ํฉ์์๋ ์ธ๋์ค์ฝ์ด๊ฐ ํฌํจ๋ Header ์ด๋ฆ์ ๊ทธ๋๋ก ์จ์ผ ํ ์๋ ์๋ค.
์ด๋ด ๋ ์ฌ์ฉํ๋ ์ต์
์ด convert_underscores=False๋ค.
@app.get("/items/")
async def read_items(
strange_header: Annotated[str | None, Header(convert_underscores=False)] = None
):
return {"strange_header": strange_header}
์ด ๊ฒฝ์ฐ FastAPI๋
๋ฅผ ๊ทธ๋๋ก ์ฐพ๋๋ค.
ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ๊ธฐ๋ณธ ์ค์ (์๋ ๋ณํ ON)์ ์ ์งํ๋ ๊ฒ์ด ์์ ํ๋ค.
๊ธฐ๋ณธ๊ฐ์ด ์์ผ๋ฉด ํด๋น Header๋ ์ ํ์ด๋ค.
user_agent: Annotated[str | None, Header()] = None ๊ธฐ๋ณธ๊ฐ์ ์ ๊ฑฐํ๋ฉด ํ์ Header๊ฐ ๋๋ค.
@app.get("/secure/")
async def secure_endpoint(authorization: Annotated[str, Header()]):
return {"token": authorization}
Authorization Header ์์ด ์์ฒญํ๋ฉด
๊ฐ์ Header๊ฐ ์ฌ๋ฌ ๋ฒ ์ ๋ฌ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ด๋๋ list ํ์ ์ผ๋ก ์ ์ธํ๋ฉด ๋๋ค.
@app.get("/items/")
async def read_items(x_token: Annotated[list[str] | None, Header()] = None):
return {"X-Token values": x_token}
์์ฒญ์ด ์ด๋ ๊ฒ ์ค๋ฉด
X-Token: foo X-Token: bar ์๋ต์ ์ด๋ ๊ฒ ๋๋ค.
{ "X-Token values": ["bar", "foo"] } FastAPI์ ํ๋ผ๋ฏธํฐ๋ค์ ๋ชจ๋ ๋์ผํ ํจํด์ ๋ฐ๋ฅธ๋ค.
| ์ข ๋ฅ | ์ ์ธ ํํ |
|---|---|
| Query | Annotated[str, Query()] |
| Path | Annotated[str, Path()] |
| Header | Annotated[str, Header()] |
| Cookie | Annotated[str, Cookie()] |
| ๊ฐ๋ | ํต์ฌ ์๋ฏธ |
|---|---|
| Header | ์์ฒญ์ ๋งฅ๋ฝ๊ณผ ์ ์ฒด์ฑ |
| ์ญํ | ์ธ์ฆ, ํ๊ฒฝ, ์์ฒญ ์กฐ๊ฑด ์ ๋ฌ |
| ์ ์ธ ๋ฐฉ์ | Annotated + Header() |
| ์๋ ๋ณํ | _ โ - ์๋ ์ฒ๋ฆฌ |
| ํ์ ์ฌ๋ถ | ๊ธฐ๋ณธ๊ฐ ์ ๋ฌด๋ก ๊ฒฐ์ |
| ์ค๋ณต Header | list ํ์ ์ผ๋ก ์ฒ๋ฆฌ |