FastAPI - Header Parameters

Kjjeddยท2026๋…„ 1์›” 13์ผ

FastAPI

๋ชฉ๋ก ๋ณด๊ธฐ
9/16
post-thumbnail

๐Ÿ“ฌ Header Parameter

FastAPI์—์„œ Header ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋‹จ์ˆœํžˆ โ€œ์š”์ฒญ ์ •๋ณดโ€๋ฅผ ์ฝ๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋‹ค.

Header๋Š” ์š”์ฒญ์˜ ๋งฅ๋ฝ(Context)๊ณผ ์š”์ฒญ์ž์˜ ์ •์ฒด์„ฑ์„ ๋‹ด๋Š” ํ•ต์‹ฌ ํ†ต๋กœ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Header๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์™œ ํ•„์š”ํ•œ์ง€, FastAPI์—์„œ ์–ด๋–ค ๊ฐœ๋…์œผ๋กœ ๋‹ค๋ค„์ง€๋Š”์ง€๋ฅผ ์ฒœ์ฒœํžˆ ๊ตฌ์กฐ์ ์œผ๋กœ ์ •๋ฆฌํ•œ๋‹ค.


๐Ÿ“š ์–ด์›์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ

Header๋Š” ์˜์–ด๋กœ ๋จธ๋ฆฌ ๋ผ๋Š” ๋œป์ด๋‹ค.

HTTP ๋ฉ”์‹œ์ง€๋„ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ ์˜๋ฏธ ์‚ฌ๋žŒ์— ๋น„์œ ํ•˜๋ฉด
Header ์š”์ฒญ์˜ ๋ฉ”ํƒ€ ์ •๋ณด ๋จธ๋ฆฌ (ํŒ๋‹จ, ์ •์ฒด์„ฑ)
Body ์‹ค์ œ ์ „๋‹ฌ ๋ฐ์ดํ„ฐ ๋ชธํ†ต (๋‚ด์šฉ๋ฌผ)

์ฆ‰, Header๋Š” โ€œ์ด ์š”์ฒญ์ด ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์™”๋Š”์ง€โ€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

๐Ÿ“Œ Header๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ
๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋‹ค

โœ‰๏ธ ํŽธ์ง€๋กœ ๋น„์œ ํ•˜๋ฉด

HTTP ์š”์ฒญ์„ ํŽธ์ง€๋กœ ์ƒ๊ฐํ•ด๋ณด์ž.

ํŽธ์ง€ ์š”์†Œ HTTP ์š”์ฒญ
๋ด‰ํˆฌ์— ์ ํžŒ ์ •๋ณด Header
ํŽธ์ง€ ๋‚ด์šฉ Body
๋ฐ›๋Š” ์‚ฌ๋žŒ ์ฃผ์†Œ Host ํ—ค๋”
๋ณด๋‚ธ ์‚ฌ๋žŒ ์ •๋ณด User-Agent ํ—ค๋”

๋ด‰ํˆฌ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ํŽธ์ง€๋Š” ์–ด๋””์„œ ์™”๋Š”์ง€, ์–ด๋””๋กœ ๊ฐ€์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

HTTP ์š”์ฒญ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

โš ๏ธ Header๊ฐ€ ์—†์œผ๋ฉด ์š”์ฒญ์€ ์˜๋ฏธ๋ฅผ ์žƒ๋Š”๋‹ค

๐Ÿงญ Header์—๋Š” ์–ด๋–ค ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐˆ๊นŒ?

Header์—๋Š” ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค.

ํ—ค๋” ์˜ˆ์‹œ ์˜๋ฏธ
User-Agent ์š”์ฒญ์„ ๋ณด๋‚ธ ํด๋ผ์ด์–ธํŠธ ์ •๋ณด
Authorization ์ธ์ฆ ํ† ํฐ
Content-Type Body ๋ฐ์ดํ„ฐ ํ˜•์‹
Accept ์›ํ•˜๋Š” ์‘๋‹ต ํƒ€์ž…

FastAPI๋Š” ์ด Header ๊ฐ’๋“ค์„ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ์ง์ ‘ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.


๐Ÿš€ FastAPI์—์„œ Header์˜ ์—ญํ• 

FastAPI์—์„œ Header๋Š” Query, Path, Cookie์™€ ๊ฐ™์€ โ€œํŒŒ๋ผ๋ฏธํ„ฐ ์ถœ์ฒ˜โ€ ์ค‘ ํ•˜๋‚˜๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ ์ข…๋ฅ˜ ์œ„์น˜ ๋น„์œ 
Path URL ๊ฒฝ๋กœ ๋ฐฐ์†ก์ง€ ์ฃผ์†Œ
Query ?key=value ์š”์ฒญ ์˜ต์…˜
Header ์š”์ฒญ ํ—ค๋” ๋ด‰ํˆฌ ์ •๋ณด
Body ์š”์ฒญ ๋ณธ๋ฌธ ์ƒ์ž ์•ˆ ๋‚ด์šฉ๋ฌผ
๐Ÿ‘‰ FastAPI๋Š”
ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๋งŒ ๋ณด๊ณ  ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค
๐Ÿ‘‰ ์–ด๋””์—์„œ ์˜จ ๊ฐ’์ธ์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„ํ•œ๋‹ค

๐Ÿงช ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ณด๊ธฐ

์ด์ œ 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}

์ด ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ฅผ ํ•œ ์ค„๋กœ ์ฝ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

"์ด ์š”์ฒญ์˜ Header ์ค‘์—์„œ
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 ํ—ค๋” ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ ๋œ๋‹ค.

๐Ÿ” ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ด€์ฐฐ ํฌ์ธํŠธ

  • user_agent๋Š” ํ•จ์ˆ˜์˜ ์ผ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค
  • ํ•˜์ง€๋งŒ Query ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์•„๋‹ˆ๋‹ค
  • Header()๋ฅผ ๋ช…์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Header์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค

FastAPI๋Š” Header()๋ฅผ ๋ณด๋Š” ์ˆœ๊ฐ„ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ Header ์ „์šฉ์œผ๋กœ ํ•ด์„ํ•œ๋‹ค.


๐Ÿ”„ ์ž๋™ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ (Underscore โ†” Hyphen)

Header ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” Query, Path์—๋Š” ์—†๋Š” ์•„์ฃผ ์ค‘์š”ํ•œ ์ž๋™ ๋ณ€ํ™˜ ๊ทœ์น™์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

๋ฐ”๋กœ ์–ธ๋”์Šค์ฝ”์–ด(_) โ†’ ํ•˜์ดํ”ˆ(-) ์ž๋™ ๋ณ€ํ™˜์ด๋‹ค.


โ“ ์™œ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ• ๊นŒ?

HTTP Header ์ด๋ฆ„์€ ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์ด๋‹ค.

  • User-Agent
  • Content-Type
  • Accept-Language

ํ•˜์ง€๋งŒ Python ๋ณ€์ˆ˜๋ช…์—๋Š” ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

# โŒ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ user-agent = "Mozilla" 

๊ทธ๋ž˜์„œ FastAPI๋Š” Python ์นœํ™”์ ์ธ ์ด๋ฆ„์„ ์“ฐ๋ฉด HTTP ํ‘œ์ค€ Header ์ด๋ฆ„์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

๐Ÿ” ์ž๋™ ๋ณ€ํ™˜ ๊ทœ์น™

Python ๋ณ€์ˆ˜๋ช… ์‹ค์ œ ์ฐพ๋Š” Header
user_agent User-Agent
content_type Content-Type
x_token X-Token
๐Ÿ‘‰ ๊ฐœ๋ฐœ์ž๋Š” snake_case๋กœ ์“ฐ๊ณ 
๐Ÿ‘‰ FastAPI๊ฐ€ HTTP ๊ทœ์น™์„ ๋Œ€์‹  ๋งž์ถฐ์ค€๋‹ค

๐Ÿ“Œ ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ?

@app.get("/items/")
async def read_items(user_agent: Annotated[str | None, Header()] = None):
    return {"User-Agent": user_agent}

์ด ์ฝ”๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ํ•ด์„๋œ๋‹ค.

"์š”์ฒญ Header ์ค‘์—์„œ
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๋Š”

  • strange-header โŒ
  • strange_header โญ•

๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐพ๋Š”๋‹ค.

โš ๏ธ ์ฃผ์˜
์ผ๋ถ€ ํ”„๋ก์‹œยท์„œ๋ฒ„๋Š”
์–ธ๋”์Šค์ฝ”์–ด๊ฐ€ ํฌํ•จ๋œ Header๋ฅผ
์ฐจ๋‹จํ•˜๊ธฐ๋„ ํ•œ๋‹ค

ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด ๊ธฐ๋ณธ ์„ค์ •(์ž๋™ ๋ณ€ํ™˜ ON)์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.


๐Ÿ“ฆ ํ•„์ˆ˜ Header vs ์„ ํƒ Header

โœ”๏ธ ์„ ํƒ Header

๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น Header๋Š” ์„ ํƒ์ด๋‹ค.

user_agent: Annotated[str | None, Header()] = None 
  • Header ์—†์–ด๋„ OK
  • ๊ฐ’์ด ์—†์œผ๋ฉด None

โ— ํ•„์ˆ˜ Header

๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ฑฐํ•˜๋ฉด ํ•„์ˆ˜ Header๊ฐ€ ๋œ๋‹ค.

@app.get("/secure/")
async def secure_endpoint(authorization: Annotated[str, Header()]):
    return {"token": authorization}

Authorization Header ์—†์ด ์š”์ฒญํ•˜๋ฉด

  • FastAPI๊ฐ€ ์ž๋™์œผ๋กœ 422 ์—๋Ÿฌ ๋ฐ˜ํ™˜
  • ์ง์ ‘ ๊ฒ€์‚ฌ ์ฝ”๋“œ ์ž‘์„ฑํ•  ํ•„์š” ์—†์Œ
๐Ÿ‘‰ ์„ ์–ธ๋งŒ์œผ๋กœ
๊ฒ€์ฆ ๋กœ์ง์ด ์™„์„ฑ๋œ๋‹ค

๐Ÿ“š ์ค‘๋ณต Header ์ฒ˜๋ฆฌ (list ํƒ€์ž…)

๊ฐ™์€ 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"] } 
๐Ÿ“Œ ์‹ค๋ฌด์—์„œ๋Š” ์ž์ฃผ ์“ฐ์ด์ง€ ์•Š์ง€๋งŒ
Set-Cookie, ๋‹ค์ค‘ ํ† ํฐ ๊ฐ™์€ ๊ฒฝ์šฐ์— ํ™œ์šฉ๋œ๋‹ค

๐Ÿงฉ Header ํŒŒ๋ผ๋ฏธํ„ฐ ์„ ์–ธ ํŒจํ„ด ์ •๋ฆฌ

FastAPI์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์€ ๋ชจ๋‘ ๋™์ผํ•œ ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค.

์ข…๋ฅ˜ ์„ ์–ธ ํ˜•ํƒœ
Query Annotated[str, Query()]
Path Annotated[str, Path()]
Header Annotated[str, Header()]
Cookie Annotated[str, Cookie()]
๐Ÿ‘‰ Annotated + Param ํด๋ž˜์Šค
๐Ÿ‘‰ ์ด ์กฐํ•ฉ์ด FastAPI์˜ ํ•ต์‹ฌ ์„ค๊ณ„๋‹ค

๐Ÿง  ์ „์ฒด ๊ฐœ๋… ์š”์•ฝ

๊ฐœ๋… ํ•ต์‹ฌ ์˜๋ฏธ
Header ์š”์ฒญ์˜ ๋งฅ๋ฝ๊ณผ ์ •์ฒด์„ฑ
์—ญํ•  ์ธ์ฆ, ํ™˜๊ฒฝ, ์š”์ฒญ ์กฐ๊ฑด ์ „๋‹ฌ
์„ ์–ธ ๋ฐฉ์‹ Annotated + Header()
์ž๋™ ๋ณ€ํ™˜ _ โ†’ - ์ž๋™ ์ฒ˜๋ฆฌ
ํ•„์ˆ˜ ์—ฌ๋ถ€ ๊ธฐ๋ณธ๊ฐ’ ์œ ๋ฌด๋กœ ๊ฒฐ์ •
์ค‘๋ณต Header list ํƒ€์ž…์œผ๋กœ ์ฒ˜๋ฆฌ
profile
Gongbuhaja

0๊ฐœ์˜ ๋Œ“๊ธ€