๋ฐ๋ธ์น์ต์ค ์คํ์ ์ํ '์ ์ ๋ณด์ ํ ์คํ (SAST)'
๋ฐ๋ธ์น์ต์ค ์คํ์ ์ํ '์ ์ ๋ณด์ ํ ์คํ (SAST)' ๊ด๋ จ
์ด์ ๊ธ '๊ฐ๋ฐ๊ณผ ๋ณด์ ํตํฉ '๋ฐ๋ธ์น์ต์ค' ์ค์ํด์ง๋ ์ด์ '์์ ๋ฐ๋ธ์น์ต์ค์ ๊ฐ๋ ๊ณผ ์ด๋ฅผ ์ํ ์คํ์์ค ๋ณด์ ํ ์คํธ ์๋ํ ๋๊ตฌ๋ฅผ ๋ค๋ค์ต๋๋ค. ํฌ๊ฒ ์ ์ ๋ณด์ ํ ์คํ (SAST), ๋์ ๋ณด์ ํ ์คํ (DAST), ์ํํธ์จ์ด ๊ตฌ์ฑ์์(SCA) ๋ถ์ผ๋ณ๋ก ๋๊ตฌ๋ฅผ ๊ฐ๋จํ ์๊ฐํ๋๋ฐ์. ์ด๋ฒ ๊ธ์์๋ Bandit ์์ ์ ํจ๊ป ์ ์ ๋ณด์ ํ ์คํ ์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
์ ์ ๋ณด์ ํ ์คํ (SAST)
์ ์ ๋ณด์ ํ ์คํ ์ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ SQL ์ธ์ ์ , ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS), ์๊ฒฉ ์ฝ๋ ์คํ ์ทจ์ฝ์ , ๊ถํ ์ค์ฉ ๋ฌธ์ ๋ฑ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ์๋ณํ๋ ํ ์คํธ ๋ฐฉ๋ฒ์ ๋๋ค. ์ค์ ํ๋ก๊ทธ๋จ์ ์คํํ์ง ์๊ณ ์ฝ๋๋ง์ ๋ถ์ํ์ฌ ํ ์คํธ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ์ ์ (static)์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ์ ๋ณด์ ํ ์คํ ์ ์ฃผ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฅ์ 1) ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ์์ ์ทจ์ฝ์ ๋ฐ๊ฒฌ
์ ์ ๋ณด์ ํ ์คํ ์ ์์ค ์ฝ๋๋ฅผ ๊ฒ์ฌํ๋ฏ๋ก, ์์ค ์ฝ๋๊ฐ ์์ฑ๋๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ์์๋ถํฐ ๋ณด์ ๋ฌธ์ ๋ฅผ ๊ฒ์ฌํ๊ณ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ ํ๋ฐ๋ถ๋ ์ด์ ๋จ๊ณ์์ ์ทจ์ฝ์ ์ ๋ฐ๊ฒฌํ์ ๋๋ณด๋ค ๋ค์ด๊ฐ ๋น์ฉ๊ณผ ๋ ธ๋ ฅ์ ์ค์ผ ์ ์์ต๋๋ค. ์ ์ ํ ์ค์ต์ผ๋ก ์ ์ฌ์ ์ธ ๋ฐ์ดํฐ ์ ์ถ ์ํ์ ์ด๊ธฐ์ ์ฐจ๋จํ ์ ์๋ ์์๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค. SQL ์ธ์ ์ ์ทจ์ฝ์ ์ด ์๋ ์ฝ๋๋ฅผ ๊ฒ์ฌํ์ฌ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ ์ฌ๋ก๋ฅผ ์ค๋นํ์ต๋๋ค.
์ฅ์ 2) ๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง
์ ์ ๋ณด์ ํ ์คํ ์ ์ค์ ์คํ ํ๊ฒฝ๊ณผ ๋ฌด๊ดํ๊ฒ ์์ค์ฝ๋๋ฅผ ๊ฒ์ฌํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ก ์ ์ผ๋ก ๋ชจ๋ ์คํ ๊ฒฝ๋ก๋ฅผ ํ ์คํธํ์ฌ ๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์กํ ๋ถ๊ธฐ ๋ก์ง์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ ์ ๋ณด์ ํ ์คํ ์ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํ์ฌ ์ทจ์ฝ์ ์ ์ฐพ์๋ผ ์ ์์ต๋๋ค. ๋์ ๋ณด์ ํ ์คํ ์ ๊ฒฝ์ฐ๋ ์ฝ๋ ์งํ ๊ฒฝ๋ก๋ฅผ ํ ์คํธ ๊ณผ์ ์์ ๋์น๋ค๋ฉด, ํน์ ์ฝ๋๋ฅผ ํ ์คํธํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ฅ์ 3) ๊ฒ์ฌ ํ๊ฒฝ ์ฉ์ด์ฑ
์ ์ ๋ณด์ ํ ์คํ ์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์๊ณ ์์ค ์ฝ๋๋ง์ผ๋ก ๋ถ์์ ์งํํฉ๋๋ค. ๋ฐ๋ผ์ ํน์ ์ด์ ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์์ต๋๋ค. ์ฝ๋๋ง ์๋ค๋ฉด ์ด๋์๋ ํ ์คํธํ ์ ์์ด ๋ณ๋์ ์๋ฒ ๋ฆฌ์์ค๊ฐ ํ์ ์๊ณ , ๊น๊ณผ ๊ฐ์ ์ฝ๋ ์ ์ฅ์์์๋ ์ฝ๊ฒ ๊ฒ์ฌ๋ฅผ ์ํํ ์ ์์ด ์๋ํ๊ฐ ์์ํฉ๋๋ค.
๋ค๋ง ์ด๋ฌํ ์ ์ ๋ณด์ ํ ์คํ ์๋ ๋ช ๊ฐ์ง ๋จ์ ์ด ์กด์ฌํฉ๋๋ค.
๋จ์ 1) ์คํ(False Positive) ๋ฌธ์
์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ๋ ๋ณต์กํ ์ฝ๋ ํจํด์ ์๋ชป ํด์ํ์ฌ ์ค์ ๋ก๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋ ์ฝ๋๋ฅผ ๋ณด์ ์ทจ์ฝ์ ์ผ๋ก ์๋ชป ๊ฐ์งํ ์ ์์ต๋๋ค. ์คํ์ ๋ถํ์ํ ๋ ธ์ด์ฆ๋ฅผ ๋ฐ์์์ผ ๋ฌธ์ ๋์์ ๋ํ ์ด์ ์ ๋ถ์ฐ์ํค๊ณ ์์ฐ์ฑ์ ๋จ์ด๋จ๋ฆด ์ ์์ต๋๋ค. ํนํ ์ด๋ฐ ์คํ ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋์ ๋ณด์ ํ ์คํ ๋ณด๋ค ์ ์ ๋ณด์ ํ ์คํ ์์ ๋ ๋ง์ด ๋ฐ์ํฉ๋๋ค. ์๋ ์ค์ต์์ ์คํ ๋ฌธ์ ๋ฅผ ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จ์ 2) ๋ฏธํ(False Negative) ๋ฌธ์
์ฝ๋๋ฅผ ๋ถ์ํ๋ ์ ์ ๋ถ์ ๋ฐฉ์์ ํ๊ณ๋ก ์ธํด ํน์ ์ ํ์ ์ทจ์ฝ์ ์ ํ์งํ์ง ๋ชปํ๋ ๋ฌธ์ ๋ ์์ต๋๋ค. ๋ฐํ์์์ ์ค์ ์ด ์๋ชป๋์ด ๋ฐ์ํ๋ ๋ฌธ์ ๋ ์ธ๋ถ ๋ฐ์ดํฐ์ ์์กด์ ์ธ ์ทจ์ฝ์ ์ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ์ผ ์์คํ ์ ๋ํ ๊ถํ ๋ถ์ฌ ์ค์ ์ด ํ์ ํด ๋ฐ์ํ๋ ๋ฐ์ดํฐ ์ ์ถ ๋ฌธ์ ๋ ์ ์ ๋ณด์ ํ ์คํ ์ผ๋ก ๊ฒ์ฌํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ์ธ๋ถ์์ ์ด๋ฃจ์ด์ง๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ผ๋ถ ์ค์ํ ์น ๋ณด์ ๊ธฐ๋ฅ(์: HTTPS ์ ์ฉ, CSRF ํ ํฐ ์ฌ์ฉ, ์น ๋ณด์ ํค๋ ๋ฑ) ์ค์ ๊ณผ ๊ด๋ จํด ์๊ธฐ๋ ๋ฌธ์ ์ญ์ ํ์งํ ์ ์์ต๋๋ค.
์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ ์ค์ต
์ง๊ธ๊น์ง ์ ์ ๋ณด์ ํ ์คํ ์ ๋ํด ๊ฐ๋จํ ์์๋ณด์์ต๋๋ค. ์ด์ ์ ์ ๋ณด์ ํ ์คํ ์ ์ง์ ์ค์ตํ๋ฉฐ ์์ธํ ๋ด์ฉ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ ์ค์ต์๋ ํ์ด์ฌ ์ธ์ด๋ก ์์ฑ๋ ํ๋ก์ ํธ์ ๋ณด์ ์ทจ์ฝ์ ์ ๊ฒ์ฌํ ์ ์๋ ์คํ์์ค ๋๊ตฌ, Bandit๋ฅผ ์ฌ์ฉํฉ๋๋ค.
SQL ์ธ์ ์ ์ทจ์ฝ์ ์ฝ๋ ์์
์ค์ต์ ์ํด SQL ์ธ์ ์ ์ทจ์ฝ์ ์ด ์กด์ฌํ๋ ๊ฐ๋จํ ํ์ด์ฌ ์ฝ๋๋ฅผ ์ค๋นํ์ต๋๋ค.
import sqlite3
# DB ์ฐ๊ฒฐ
conn = sqlite3.connect('example.db')
c = conn.cursor()
# ํ
์ด๋ธ ์์ฑ
def init_db():
c.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY, name TEXT, password TEXT)''')
c.execute("INSERT INTO users (name, password) VALUES ('alice', 'password123')")
c.execute("INSERT INTO users (name, password) VALUES ('bob', 'qwerty456')")
# ์ฌ์ฉ์ ์กฐํ ํจ์ (์ทจ์ฝ์ ์์)
def get_user(user_id):
query = "SELECT name, password FROM users WHERE id={}".format(user_id)
c.execute(query)
return c.fetchall()
# query๋ฅผ ์คํํ์ง ์๋ ํจ์
def do_nothing(user_id):
query = "SELECT name, password FROM users WHERE id={}".format(user_id)
if __name__ = "__main__":
init_db()
user_id = input("Enter user ID: ")
user = get_user(user_id)
if user:
print(user)
else:
print("User not found")
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- ์ค๋ฒํธ 3-5: sqlite DB ํ์ผ ์์ฑ ๋ฐ ์ฐ๊ฒฐ
- ์ค๋ฒํธ 7-13:
init_db()
ํจ์ ์ ์ ํ ์ด๋ธ ์์ฑ ๋ฐ alice, bob ์ฌ์ฉ์ ์ถ๊ฐ - ์ค๋ฒํธ 15-19:
get_user()
ํจ์ ์ ์ user_id ์ ๋ ฅ ๊ฐ์ผ๋ก SELECT ์ฟผ๋ฆฌ๋ฌธ์ ๊ตฌ์ฑํ๊ณ ์คํํ์ฌ, ์กฐ๊ฑด์ ๋ง๋ ์ฌ์ฉ์๋ฅผ ๊ฒ์ (SQL ์ธ์ ์ ์ทจ์ฝ์ ์ด ์กด์ฌํจ) - ์ค๋ฒํธ 21-23:
do_nothing()
ํจ์ ์ ์ SELECT ์ฟผ๋ฆฌ๋ฌธ์ ๊ตฌ์ฑํ์ง๋ง ์คํ์ ํ์ง ์์ (์คํ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ถ๊ฐ๋ ํจ์) - ์ค๋ฒํธ 25-32: ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ฉด ์คํ๋๋ main ํํธ
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด ์๋์ ๊ฐ์ ์์๋ก ์งํ๋ฉ๋๋ค.
- ์ค๋ฒํธ 26:
init_db()
ํจ์์์ sqlite3๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌ์ถ - ์ค๋ฒํธ 27: ์ฌ์ฉ์ ID ๋ฅผ ์ ๋ ฅ๋ฐ์
- ์ค๋ฒํธ 28, 17-18:
get_user()
ํจ์์์ SELECT ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ์ฌ, ์ฌ์ฉ์(user)๋ฅผ ๊ฒ์ - ์ค๋ฒํธ 29-32: ์ฌ์ฉ์ ์ ๋ณด ์ถ๋ ฅ
์ฝ๋๋ฅผ sqli-example.py
๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๊ณ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
python3 sqli-example.py
์ฝ๋๋ฅผ ์คํํ ๋ค์ user ID์ ์ ๋ ฅ๊ฐ์ผ๋ก 1์ ๋ฃ์ด ๋ณด๊ฒ ์ต๋๋ค. alice๋ผ๋ ์ฌ์ฉ์๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. 2๋ฅผ ์ ๋ ฅํ๋ฉด bob์ด ์ถ๋ ฅ๋ฉ๋๋ค. ์ ์์ ์ธ ๋์์ ๋๋ค.
python3 sqli-example.py
# Enter user ID: 1
# [('alice', 'password123')]
python3 sqli-example.py
# Enter user ID: 2
# [('bob', 'qwerty456')]
SQL ์ธ์ ์ ์ทจ์ฝ์
์ด๋, user ID ์ ๋ ฅ๊ฐ์ 1 or 1=1 ์ด๋ผ๊ณ ๋ฃ์ด ๋ณด๊ฒ ์ต๋๋ค.
python3 sqli-example.py
Enter user ID: 1 or 1=1
[('alice', 'password123'), ('bob', 'qwerty456')]
alice์ bob์ด ๋ชจ๋ ์ถ๋ ฅ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ alice์ bob์ ์ ๋ณด๋ง ๋ค์ด์๊ธฐ ๋๋ฌธ์ ๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ๋๋ค. ๋ง์ฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๋ ์์๋ค๋ฉด, ๋ชจ๋ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋์์ ๊ฒ์ ๋๋ค.
์์ ์ฝ๋์ 17๋ฒ ์ค์ ๋ณด๊ฒ ์ต๋๋ค. user_id
๋ณ์๊ฐ์ WHERE
์กฐ๊ฑด๋ฌธ์ ์ง์ ์
๋ ฅ์ ํ์ฌ ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๋๋ก ๋์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
query = "SELECT name, password FROM users WHERE id={}".format(user_id)
c.execute(query)
1
๋์ '1 or 1=1
'์ด๋ผ๊ณ ์
๋ ฅํ๋ฉด, ์ฌ์ฉ์ ์
๋ ฅ๊ฐ์ ์ํด ์ฟผ๋ฆฌ๋ฌธ์ด ๋ณํ๋์ด ๋ฒ๋ฆฝ๋๋ค. ๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ํ ์ฟผ๋ฆฌ๋ฌธ์ ์ด๋ด ๊ฒ์
๋๋ค.
SELECT name, password FROM users WHERE id=1
๊ทธ๋ฌ๋ ์ค์ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ๋ณํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์ด๋ ์ต๋๋ค.
SELECT name, password FROM users WHERE id=1 or 1=1
์ด๋ ๊ฒ ๋ณํ๋ ์ฟผ๋ฆฌ๋ฌธ์์๋ WHERE
์กฐ๊ฑด์ด id
๊ฐ๊ณผ ์๊ด ์์ด ํญ์ ์ฐธ์ด ๋ฉ๋๋ค. ๊ทธ๋์ ๋ชจ๋ id
์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ ๊ฒ์
๋๋ค. ์ด์ฒ๋ผ SQL ์ธ์ ์
์ทจ์ฝ์ ์ด ์กด์ฌํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ธ์ ๋ณด๊ฐ ์ ์ถ๋๋ ์ฌ๊ณ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์๋ฐฑ๋ง, ์์ฒ๋ง ๋ช
์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํ์ทจ๋๋ ๋ํ ์ฌ๊ณ ๊ฐ ๋ฒ์ด์ง ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ์ด์ฃ .
SQL ์ธ์ ์ ์ทจ์ฝ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ด๋ฌํ SQL ์ธ์ ์
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋ผ๋ฏธํฐํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค ๋ฒํธ 17-18๋ฒ์ ์ฝ๋์ฒ๋ผ user_id
๋ฅผ ์ง์ WHERE
๊ตฌ๋ฌธ์ ์
๋ ฅํ์ฌ ์ฟผ๋ฆฌ๋ฌธ์ ๊ตฌ์ฑํ๋ ๋์ , ์๋์ ๊ฐ์ด ?
๋ก ์๋ฆฌ๋ฅผ ๋ง๋ค์ด๋๊ณ execute()
ํ ๋ user_id
๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์
๋๋ค. ํ๋ผ๋ฏธํฐ๋ฅผ ํํ๋ก ๊ตฌ์ฑํด์ผ ํ๋ฏ๋ก (user_id)
๋์ (user_id,)
์ ๊ฐ์ด ์ผํ(,
)๋ฅผ ์ถ๊ฐํ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
query = "SELECT name, password FROM users WHERE id=?"
c.execute(query, (user_id,))
์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์ ์
๋ ฅ๊ฐ์ด ์ฟผ๋ฆฌ๋ฌธ ์์ฒด์๋ ์ํฅ์ ์ฃผ์ง ์์ SQL ์ธ์ ์
์ทจ์ฝ์ ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ 1 or 1=1
๊ฐ์ผ๋ก ์คํํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ์๋ ์
๋ ฅ๊ฐ ์ ์ฒด๋ฅผ ํ๋์ ๊ฐ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ID์ ๋น๊ตํ๊ฒ ๋ ๊ฒ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์ ์ ๋ณด ๋์ User not found
๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
python3 sqli-example.py
# Enter user ID: 1 or 1=1
# User not found
Bandit ์ค์ตํ๊ธฐ
Bandit๋ ํ์ด์ฌ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋์์ ๋ค์ํ ๋ณด์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ์ํ ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ์ ๋๋ค. ์คํ์คํ(์คํ์์ค ์ธํ๋ผ ํด๋ผ์ฐ๋ ํ๋ก์ ํธ)์ ๋ณด์ ํ๋ก์ ํธ๋ก ์์ํ์ฌ, ํ์ฌ๋ ์๋ ๋งํฌ์ ๊นํ๋ธ ํ๋ก์ ํธ์์ ์คํ ์์ค๋ก ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค. ์์ ์์ ์ฝ๋๋ฅผ ๋์์ผ๋ก, ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ Bandit๋ฅผ ์ด์ฉํด ๋ณด์ ์ทจ์ฝ์ ์ ๊ฒ์ฌํ๋ ๊ณผ์ ์ ์ค์ตํด ๋ณด๊ฒ ์ต๋๋ค.
1) Bandit ์ค์นํ๊ธฐ
Bandit๋ ์ฌ๋ ํ์ด์ฌ ํ๋ก๊ทธ๋จ์ฒ๋ผ pip install
์ ์ด์ฉํด ์ค์นํ ์ ์์ต๋๋ค.
python3 -m venv venv
source venv/bin/activate
(venv) pip install bandit
venv
๋ชจ๋์ ํ์ด์ฌ ๊ฐ์ํ ํ๊ฒฝ์ ๋ง๋ค์ด์ค๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฒด ์์คํ
์ ์ํฅ์ ์ฃผ์ง ์๊ณ Bandit๋ฅผ ์ค์นํ ์ ์์ต๋๋ค. source venv/bin/activate
๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ venv
ํ๊ฒฝ์ ์ง์
ํ์๊ณ , ํ๋กฌํํธ ์์ (venv)
๊ฐ ํ์๋๋ ์ ์ ์ฐธ๊ณ ํ์ธ์.
2) ๊ฒ์ฌํ๊ธฐ
๊ฒ์ฌ ๋ช
๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ด bandit <ํ์ผ์ด๋ฆ>
์ผ๋ก ๊ฐ๋จํ ์คํํ ์ ์์ต๋๋ค.
(venv) bandit sqli_example.py
์คํ ๋ฌธ์
๊ทธ๋ฐ๋ฐ ๋ ๋ฒ์งธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ ์ค๋ฒํธ 23๋ฒ์์๋ SQL ์ธ์ ์ ์ทจ์ฝ์ ์ ์ฐพ์๋ค๋ ๋ด์ฉ์ด ์์ต๋๋ค.
# query๋ฅผ ์คํํ์ง ์๋ ํจ์
def do_nothing(user_id):
query = "SELECT name, password FROM users WHERE id={}".format(user_id)
์ด ๊ฒฝ์ฐ๋ ์์ ๊ฒฝ์ฐ์ ๋ค๋ฆ
๋๋ค. ์ด ํจ์๋ ์์ ํจ์์ ์ค๋ฒํธ 18๋ฒ์ฒ๋ผ execute()
๋ฅผ ์คํํ์ง ์์, ์ค์ ๋ก ์ฟผ๋ฆฌ๋ฌธ์ด ์คํ๋์ง ์์ต๋๋ค. 23๋ฒ ์ค๋ง ๋ดค์ ๋๋ ๋ณด์ ์ทจ์ฝ์ ์ด ์๋ ๊ฒ์ด ๋ง์ง๋ง, ์ด ์ฝ๋๊ฐ ์ค์ ๋ก ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ ์์ต๋๋ค. ์ด์ฒ๋ผ ์ค์ ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋ณด๊ณ ํ๋ ๊ฒ์ '์คํ์ด ๋ฐ์ํ๋ค'๊ณ ํฉ๋๋ค.
์ด ์์ ์์๋ ์ฝ๋๊ฐ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ์คํ ๋ฌธ์ ๊ฐ ์์ด๋ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ์ ์ฝ๋๋ฅผ ๋์์ผ๋ก ๊ฒ์ฌ๋ฅผ ์งํํ๋ฉด ์ด๋ฌํ ์คํ ๋ณด๊ณ ๊ฐ ์๋ฐฑ์์ฒ ๊ฑด์ด ๋์ค๊ธฐ๋ ํฉ๋๋ค. ์คํ์ผ๋ก ์ธํ ๋ ธ์ด์ฆ๊ฐ ๋ง์์ง๋ฉด ๋ณด์ ๋ด๋น์๋ ๊ฐ๋ฐ์๋ค์ด ์ด๋ฅผ ๋ถ์ํ๋๋ผ ์๊ฐ์ ๋ญ๋นํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ปค๋ค๋ ์์ฐ์ฑ ์ ํ๋ก ์ด์ด์ง๋๋ค. ์ค์ํ ์ทจ์ฝ์ ์ด ์คํ ๋ณด๊ณ ๋ค์ ๋ฌปํ ๋ฐ๊ฒฌ๋์ง ์์ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด์๋ ์คํ์ ์ต์ํํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ์คํ์จ์ ๊ธฐ์ ์์ ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ๋ฅผ ๋์ ํ๊ธฐ ์ํด ์ฌ๋ฌ ์๋ฃจ์ ์ ๋น๊ตํ๋ฉฐ ํ์ธํ๋ ์ค์ํ ์ฒ๋์ ๋๋ค.
๊ทธ๋ฟ๋ง ์๋๋ผ ํน์ ๋๊ตฌ๋ฅผ ๋์ ํ ์ดํ์๋ ์คํ์ ์ค์ด๊ธฐ ์ํ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค. ํด๋น ๋๊ตฌ์ ๊ฒ์ฌ ๊ท์น(๋๋ ๋ฃฐ์ )์ ํ๋ก์ ํธ ํน์ฑ์ ๋ง๊ฒ ์ ๊ตฌ์ฑํ๊ณ ๊ฐ ํ๋ก์ ํธ์ ๋ง๋ ์์ธ ๊ท์น์ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ๋ํ ๋ฐ๊ฒฌ๋ ๋ณด์ ์ทจ์ฝ์ ์ ๊ฒํ ํ๊ณ ์ด๋ฅผ ํ ๋๋ก ์คํ์ ๊ฑธ๋ฌ๋ด๋ ์์ ์ด ํ์์ ์ ๋๋ค. ์ด๋ฐ ๊ณผ์ ์ ์ฒด๊ณ์ ์ผ๋ก ์ํํ๋ ๊ฒ์ด ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ ํ์ฉ์ ํต์ฌ ์์๋ผ๊ณ ํ ์ ์์ต๋๋ค.
Bandit ์ถ๊ฐ ์ฌ์ฉ ์์
์คํ ๋ฌธ์ ์ธ์๋ ์ ์ ๋ณด์ ํ ์คํ ์๋ํ ๊ด๋ จ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ์์ต๋๋ค. ๋ค๋ง ๊ทธ์ ์์ Bandit ์ค์ต์ ์งํํ ๋งํผ, ์ด ๋๊ตฌ์ ๋ช ๊ฐ์ง ์ฌ์ฉ ์์๋ฅผ ์ถ๊ฐ๋ก ์์๋ณด๊ฒ ์ต๋๋ค.
1) ์ ์ฒด ํ๋ก์ ํธ ๊ฒ์ฌํ๊ธฐ
์์ ์ค์ต์ ํ์ผ ํ๋๋ฅผ ๊ฒ์ฌํ ๊ฒฐ๊ณผ์
๋๋ค. ์ ์ฒด ํ๋ก์ ํธ๋ฅผ ๊ฒ์ฌํ๋ ค๋ฉด -r
์ต์
๊ณผ ํจ๊ป ํ๋ก์ ํธ๊ฐ ์๋ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํ๋ฉด ๋ฉ๋๋ค. -r
์ต์
์ ์ด์ฉํ๋ฉด ๋ชจ๋ ํ์ ๋๋ ํ ๋ฆฌ๊น์ง ํ ๋ฒ์ ๊ฒ์ฌํ ์ ์์ต๋๋ค.
bandit -r /path/to/project
2) ๊ฒฐ๊ณผ๋ฅผ JSON, XML, CSV ๋ฑ ํฌ๋งท์ผ๋ก ์ถ๋ ฅ
-f
์ต์
์ ์ฌ์ฉํ๋ฉด ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํน์ ํฌ๋งท์ผ๋ก ์ถ๋ ฅํ ์ ์์ต๋๋ค.
bandit -r /path -f json
3) ๋์๋ง ๊ธฐ๋ฅ
-h
์ต์
์ ์ฌ์ฉํ๋ฉด ์ธ ์ ์๋ ์ฌ๋ฌ ์ต์
๋ค์ ๋ํ ๋์๋ง์ด ์ถ๋ ฅ๋ฉ๋๋ค.
bandit -h
์ด ๋ฐ์๋ Bandit๋ ๋ค์ํ ์ต์ ์ ์ ๊ณตํ๋ฉฐ, YAML ํฌ๋งท์ ์ค์ ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ต์ ๊ณผ ํ๋กํ์ผ์ ์ค์ ํ ์๋ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ํ๋ก์ ํธ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ ์ ๋ณด์ ํ ์คํ ์๋ํ ๋ฐ ๊ณ ๋ ค ์ฌํญ
Bandit ๊ฐ์ ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ๋ CLI ํํ๋ก ๊ตฌํ๋์ด ์์ด CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ์ฌ ์๋ํ๋ฅผ ๊ตฌํํ๊ธฐ ์์ํฉ๋๋ค. ์ด๋ฌํ ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ์ ์๋ํ๋ ์ง์์ ์ธ ๋ณด์ ๊ฒ์ฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ณ , ๊ฐ๋ฐ ๊ณผ์ ์์ ์ทจ์ฝ์ ์ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ์ฌ ์์ ํ ์ ์๋๋ก ํด์ค๋๋ค. ๋ณด์์ฑ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ์ผ๋ก ์ ๊ณตํ๊ธฐ ์ํด ๋ฐ๋ธ์น์ต์ค๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ํ๋์ ๋๋ค. ์ด์ฒ๋ผ ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ๋ฅผ ์๋ํํ ๋ ๊ณ ๋ คํด์ผ ํ ์ฃผ์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1) ์๋ํ ๊ณํ ์๋ฆฝ
๋ชจ๋ ์ ๋ฌด์์ ๊ทธ๋ ๋ฏ ๋ณด์ ํ ์คํ ์๋ํ ์์ ์๋ ์ฒด๊ณ์ ์ธ ๊ณํ ์๋ฆฝ์ด ์ ํ๋์ด์ผ ํฉ๋๋ค. ๋์ ์ฝ๋๋ ํ๋ก์ ํธ์ ์ ํฉํ ๋๊ตฌ์ ๊ฒ์ฌ ๊ท์น์ ์ ์ ํ๊ณ , ๊ฒ์ฌ ์๊ธฐ์ ๋น๋, ๋ณด๊ณ ์ฒด๊ณ ๋ฑ์ ๋ํ ์ ๋ต์ ์ธ์ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ธฐ์กด ๋ณด์ ๋ฌธ์ ๋์ ํ๋ก์ธ์ค์ ์กฐ์ง์ ํน์ฑ์ ๊ณ ๋ คํด ์ผ๊ด๋ ๋์ ์ ์ฑ ๊ณผ ๊ท์น์ ๋ง๋ จํด์ผ ํฉ๋๋ค.
๋ํ ๋๊ตฌ์ ๊ฒ์ฌ ๊ท์น์ ๊พธ์คํ ์ ๋ฐ์ดํธ ๊ณํ ์ญ์ ํจ๊ป ์๋ฆฝ๋์ด์ผ ํ ๊ฒ์ ๋๋ค. ์ด๋ฐ ์ ๋ฐ์ดํธ๋ ์๋ก์ด ์ทจ์ฝ์ ์ ํ์ ๋์ํ๊ฑฐ๋ ๋ณด์ ํ ์คํ ์ ํจ์จ์ฑ์ ๋์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
2) CI/CD ํ์ดํ๋ผ์ธ ํตํฉ
์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ๋ ์ฝ๋ ๋น๋ ๊ณผ์ ๊ณผ ๊ธด๋ฐํ ์ฐ๊ณ๋์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋๊ตฌ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ์ฌ ์ง์์ ์ผ๋ก ์ฝ๋ ๋ถ์์ ์ํํ๊ณ , ๋น๋ ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค์๋ ๋ณด์ ๊ฒ์ฌ ๋จ๊ณ๋ฅผ ํฌํจ์ํค๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์ ์์ค์ ๋์ผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ด์ ํธ๋์ปค ๋๊ตฌ๋ฅผ ์ฐ๋ํ๋ฉด ๋ฐ๊ฒฌ๋ ์ทจ์ฝ์ ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๊ฐ์ ํ ์ ์์ด ๋ณด์ ํ๋์ ํจ์จ์ฑ๊ณผ ์ง์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
3) ์คํ ๋ฌธ์ ๊ด๋ฆฌ
์ค์ต์์ ์ดํด๋ดค๋ฏ ์คํ์ผ๋ก ์ธํด ์์ฑ๋๋ ๊ฒฐ๊ณผ๋ ๋ถํ์ํ ๋ ธ์ด์ฆ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ด๋ก ์ธํด ๊ฐ๋ฐ ์์ฐ์ฑ์ด ์ ํ๋๊ณ , ์ค์ ๋ก ์๋ํ๋ฅผ ๊ตฌํํ ๋ ๊ฑธ๋ฆผ๋์ด ๋๋ ์ฌ๋ก๊ฐ ๋ง์ต๋๋ค. ์คํ ๋ฌธ์ ๋ฅผ ์ต์ํํ๊ธฐ ์ํด์๋ ์ ์ ๋ถ์ ๋๊ตฌ์ ๊ฒ์ฌ ๊ท์น์ ํ๋ก์ ํธ ํน์ฑ์ ๋ง๊ฒ ์ธ๋ฐํ๊ฒ ๊ตฌ์ฑํ๊ณ ํ๋ํ๋ ์์ ์ด ํ์ํฉ๋๋ค. ๋ํ ํน์ ์ฝ๋ ํจํด๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ธ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ฑฐ๋ ์ํ ์์ค ๊ธฐ์ค์ ์กฐ์ ํ๋ ๋ฑ ๋ฐฉ๋ฒ์ผ๋ก ์คํ ๋ฐ์์ ์ค์ผ ์ ์์ต๋๋ค.
4) ์ง์์ ์ธ ๊ฐ์
๊ธฐ์ ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ์๋ก์ด ์ ํ์ ๋ณด์ ์ทจ์ฝ์ ์ด ๋ฐ๊ฒฌ๋๊ณ ์์ต๋๋ค. ์ด์ ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ ์ญ์ ๊พธ์คํ ๊ฐ์ ํ์ฌ ์ ๊ท ์ทจ์ฝ์ ์ ํ์งํ ์ ์๋ ๊ฒ์ฌ ๊ท์น์ ๋ฐ์ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ด๋ จ ์ ๋ฐ์ดํธ์ ๊ฐ์ ์ฌํญ์ ๋ํ ๋ชจ๋ํฐ๋ง์ด ํ์์ ์ ๋๋ค. ์์ธ๋ฌ ๋ด๋ถ์์๋ ์ ์ ๋ถ์ ๋๊ตฌ ํ์ฉ ๋ฐฉ์์ ๊ฐ์ ์ ์ํด ํผ๋๋ฐฑ์ ์๋ ดํ๊ณ ๋ฐ์ํ๋ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค. ํ๋ก์ธ์ค์ ์ ์ฑ ์ ๋ํ ์ฃผ๊ธฐ์ ์ธ ๊ฒํ ๋ฅผ ํตํด ์ง์์ ์ธ ๊ฐ์ ์ ์ด๋ฃจ์ด๋๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
5) ์ํ์ด์ฝ๋ฉ ๋ฐ ๋ณด์ ๊ต์ก
์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ์ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ ์ดํดํ๊ณ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์๊ฒ ๊ต์ก์ ์ ๊ณตํ๋ ๊ฒ ์ญ์ ์ค์ํฉ๋๋ค. ๊ฐ ๋๊ตฌ๊ฐ ์ ์ํ๋ ์ทจ์ฝ์ ์ ํ, ์ํ ์์ค, ๋ฐ์ ์์ธ ๋ฑ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ค๋ช ๊ณผ ์ค์ต ๊ธฐํ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๊ทธ๋์ผ ๊ฐ๋ฐ์๋ค์ด ์๋ํ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋ณด์ ์ด์๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ํ์ ํ๊ณ ๋น ๋ฅด๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ฒฐ๊ตญ ์๋ํ ๊ณผ์ ์์ ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๊ฐ๋ฐ์์ด๊ธฐ ๋๋ฌธ์ด์ฃ .
๋๋ถ์ด ์ด๋ฌํ ๊ต์ก ํ๋ก๊ทธ๋จ์ ๋ง๋ จํ๋ค๋ฉด ๊ฐ๋ฐ ๋จ๊ณ์์๋ถํฐ ๋ณด์์ ๊ณ ๋ คํ๋ ์ํ์ด ์ฝ๋ฉ ๋ง์ธ๋์ ๊ณผ ์ค์ฒ ์ญ๋์ ๊ธฐ๋ฅผ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ์์ฑํ๋ ๋จ๊ณ๋ถํฐ ๋ณด์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ ์์ฒด๋ฅผ ์์ฒ์ ์ผ๋ก ์ค์ด๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ๋ฐ์ ๋ณด์ ์ธ์ ์ ๊ณ ์ ์ญ๋ ๊ฐํ๋ ์ ์ ๋ถ์ ๋๊ตฌ ํ์ฉ์ ๋์ด ๊ฒฐ๊ตญ ํด๋น ๊ธฐ์ ์ ์ ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์๋น์ค ๋ณด์ ์์ค ํฅ์์ผ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค.
๋ง์น๋ฉฐ
์ง๊ธ๊น์ง Bandit ์ค์ต ์์ ์ ํจ๊ป ์ ์ ๋ณด์ ํ ์คํ ์ ๋ํด ์์ธํ ์ดํด๋ณด์์ต๋๋ค. ๋ฐ๋ธ์น์ต์ค ์คํ์ ์ผํ์ผ๋ก ์ ์ ๋ณด์ ํ ์คํ ๋๊ตฌ๋ฅผ ์๋ํํ๋ฉด ์์ค ์ฝ๋์ ์ ์ฌ๋ ๋ณด์ ์ทจ์ฝ์ ์ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ ๋จ๊ณ์์ ๋ฐ๊ฒฌํ๊ณ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ฑ์ ๋์ด๊ณ ์ ์ฌ์ ์ธ ์ํ๊ณผ ๋น์ฉ์ ํฌ๊ฒ ์ค์ผ ์ ์์ฃ .
๋ค๋ง ์ฌ๊ธฐ์๋ ์คํ๊ณผ ๋ฏธํ ๋ฌธ์ ๋ฑ ํ๊ณ์ ์ด ์กด์ฌํฉ๋๋ค. ์ด๋ฌํ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๋ ค๋ฉด ๋๊ตฌ ์ ์ฉ ์์ ๋ถํฐ ์คํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ธ๋ ฅ์ ๊พธ์คํ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค. ๋ํ ๋์ ๋ณด์ ํ ์คํ , ์ํํธ์จ์ด ๊ตฌ์ฑ ์์ ๋ถ์ ๋๊ตฌ ๋ฑ ๋ค๋ฅธ ๋ฐ๋ธ์น์ต์ค ๋๊ตฌ์ ํตํฉํ์ฌ ํ์ฉํด ์ ์ ํ ์คํ ๋ง์ผ๋ก๋ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ค์ด ๋ณด์ ๋ฌธ์ ๋ค์ ์ถ๊ฐ๋ก ํ์งํ ์ ์์ ๊ฒ์ ๋๋ค.