๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Django] ๐Ÿ” CSRF ํ† ํฐ, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ?

by Mandy's 2025. 7. 24.

๐Ÿ’ก CSRF ํ† ํฐ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

CSRF(Cross-Site Request Forgery)๋Š”
์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๋Š” ์›น ๊ณต๊ฒฉ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
Django์—์„œ๋Š” ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด CSRF ํ† ํฐ์ด๋ผ๋Š” ๋ณด์•ˆ ์žฅ์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”„ CSRF ํ† ํฐ์˜ ์ž‘๋™ ์›๋ฆฌ

โœ… 1. ์„œ๋ฒ„๊ฐ€ ํ† ํฐ์„ ์ƒ์„ฑํ•˜์—ฌ ์ „์†ก

  • ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋ฉด, Django๋Š” CSRF ํ† ํฐ์„ ์ƒ์„ฑํ•ด HTML ๋‚ด <form>์— ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์ด ํ† ํฐ์€ ๋งค๋ฒˆ ๋‹ค๋ฅด๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

โœ… 2. ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ ์‹œ ํ† ํฐ์„ ํฌํ•จํ•ด์•ผ ํ•จ

  • ์‚ฌ์šฉ์ž๊ฐ€ ํผ์„ ์ œ์ถœํ•  ๋•Œ, ๊ฐ™์€ CSRF ํ† ํฐ์„ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ {% csrf_token %} ํ…œํ”Œ๋ฆฟ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ <form> ๋‚ด๋ถ€์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

โœ… 3. ์„œ๋ฒ„๋Š” ์š”์ฒญ์˜ ํ† ํฐ์„ ๊ฒ€์ฆ

  • ์„œ๋ฒ„๋Š” ์š”์ฒญ์— ํฌํ•จ๋œ ํ† ํฐ์ด ์„ธ์…˜์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด, Django๋Š” 403 Forbidden ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์š”์ฒญ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

โŒ ํ† ํฐ์ด ์—†์œผ๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

<form method="POST">
    <label for="email">Email:</label>
    <input name="email" type="email">
    <button type="submit">Submit</button>
</form>
  • ์œ„์ฒ˜๋Ÿผ ํ† ํฐ์ด ์—†๋Š” POST ํผ์€ Django์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ!
  • 403 Forbidden (CSRF verification failed)๊ฐ€ ๋œจ๋ฉฐ ์š”์ฒญ ๊ฑฐ๋ถ€

โœ… CSRF ํ† ํฐ ์ œ๋Œ€๋กœ ์“ฐ๊ธฐ

<form method="POST">
    {% csrf_token %}
    <label for="email">Email:</label>
    <input name="email" type="email">
    <button type="submit">Submit</button>
</form>
  • {% csrf_token %}์„ ๋„ฃ์œผ๋ฉด, Django๊ฐ€ ์ž๋™์œผ๋กœ hidden input์œผ๋กœ ํ† ํฐ์„ ์‚ฝ์ž…ํ•ด์ค๋‹ˆ๋‹ค.

โœ๏ธ ์ •๋ฆฌํ•˜๋ฉด

๋™์ž‘ ์ˆœ์„œ ์„ค๋ช…

1 ์„œ๋ฒ„๊ฐ€ ํ† ํฐ ์ƒ์„ฑ ๋ฐ ํŽ˜์ด์ง€์— ์‚ฝ์ž…
2 ์‚ฌ์šฉ์ž๋Š” ํ† ํฐ์„ ํ•จ๊ป˜ ์ œ์ถœ
3 ์„œ๋ฒ„๋Š” ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆ
4 ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ ์ฐจ๋‹จ (403 ์—๋Ÿฌ ๋ฐœ์ƒ)

๐Ÿท๏ธ ๊ด€๋ จ ํ‚ค์›Œ๋“œ

#CSRF, #Django, #Form๋ณด์•ˆ, #POST์š”์ฒญ, #403์—๋Ÿฌ, #์›น๋ณด์•ˆ, #์žฅ๊ณ ๊ธฐ์ดˆ


ํ•„์š”ํ•˜๋‹ค๋ฉด Ajax์—์„œ CSRF ํ† ํฐ์„ ํฌํ•จํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ด์–ด์„œ ์ •๋ฆฌํ•ด๋“œ๋ฆด๊ฒŒ์š”!