๐ก 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 ํ ํฐ์ ํฌํจํ๋ ๋ฐฉ๋ฒ๋ ์ด์ด์ ์ ๋ฆฌํด๋๋ฆด๊ฒ์!