ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐Ÿ Custom Django middleware request response โ€” what devs get wrong
Dev.toDev.to
Security

Django Middleware Request/Response ์กฐ์ž‘์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์œ ์ถœ ๋ฐฉ์–ด ๋ฐ ์„ค๊ณ„ ์ตœ์ ํ™”

๐Ÿ Custom Django middleware request response โ€” what devs get wrong

Python-T Point2026๋…„ 5์›” 27์ผ7๋ถ„intermediate

Context

Django์˜ Middleware ๊ตฌ์กฐ๋Š” Request/Response ์‚ฌ์ดํด ์ „์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ•๋ ฅํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์  ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ Custom Middleware ๋„์ž… ์‹œ Request Body ํƒˆ์ทจ ๋ฐ Response Body ๋ณ€์กฐ์™€ ๊ฐ™์€ ์‹ฌ๊ฐํ•œ Security Hole์ด ๋ฐœ์ƒํ•จ.

Technical Solution

  • call ๋ฉ”์„œ๋“œ ๋‚ด Request.POST ์ง์ ‘ ์ ‘๊ทผ์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์ž๊ฒฉ ์ฆ๋ช… ํƒˆ์ทจ ๋กœ์ง ๋ถ„์„
  • Response.content ์ง์ ‘ ๋ณ€์กฐ ๋ฐ Content-Length ์žฌ๊ณ„์‚ฐ์„ ํ†ตํ•œ HTTP ์œ ํšจ์„ฑ ์œ ์ง€ ๋ฐ Payload ์ฃผ์ž…
  • Middleware Stack ์„ค์ • ์ˆœ์„œ์— ๋”ฐ๋ฅธ Request ์ฒ˜๋ฆฌ ํ๋ฆ„๊ณผ ์ƒํ˜ธ์ž‘์šฉ ๋ถ„์„
  • Version Control์„ ๊ฑฐ์น˜์ง€ ์•Š์€ ์„œ๋ฒ„ ๋‚ด ์ง์ ‘ ํŒŒ์ผ ์ˆ˜์ •์œผ๋กœ ์ธํ•œ Trust Boundary ๋ถ•๊ดด ํ™•์ธ
  • RequestFactory ๊ธฐ๋ฐ˜์˜ Middleware ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ๋น„์ •์ƒ ์‘๋‹ต ๊ฒฝ๋กœ ๊ฒ€์ฆ

1. ๋ชจ๋“  Custom Middleware์˜ __call__ ๋ฉ”์„œ๋“œ ๋‚ด ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ฐ ๋ณ€์กฐ ๋กœ์ง ์ „์ˆ˜ ์กฐ์‚ฌ

2. Middleware ์„ค์ • ํŒŒ์ผ(settings.py)์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ๊ฐ•์ œ ๊ด€๋ฆฌ

3. HTTP Header ๊ธฐ๋ฐ˜์˜ ๊ถŒํ•œ ๋ถ€์—ฌ(์˜ˆ: X-NO-RATE) ์‹œ ์ธ์ฆ ๋กœ์ง ๋ˆ„๋ฝ ์—ฌ๋ถ€ ๊ฒ€ํ† 

4. RequestFactory๋ฅผ ํ™œ์šฉํ•ด Streaming Response ๋ฐ ๋‹ค์–‘ํ•œ Content-Type์— ๋Œ€ํ•œ Edge Case ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰

์›๋ฌธ ์ฝ๊ธฐ