์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ์ทจ์ฝ์ ์ ์ดํดํ๊ณ ๋ฐฉ์งํ๊ธฐ ์ํ ์ข ํฉ ๊ฐ์ด๋. ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋ณด์์ ๋ณด์ฅํฉ๋๋ค.
์น ๋ณด์ ์ทจ์ฝ์ : ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ๋ฐฉ์ง ๊ธฐ์
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ๋์งํธ ํ๊ฒฝ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํต, ์๊ฑฐ๋, ํ์ ์ ์ํ ํ์ ๋๊ตฌ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ด๋ฒ์ํ ์ฌ์ฉ์ ์ทจ์ฝ์ ์ ์ ์ฉํ๋ ค๋ ์ ์์ ์ธ ๊ณต๊ฒฉ์๋ค์ ์ฃผ์ ํ์ ์ด ๋๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ฌํ ์ทจ์ฝ์ ์ค ๊ฐ์ฅ ๋๋ฆฌ ํผ์ ธ ์๊ณ ์ํํ ๊ฒ ์ค ํ๋๊ฐ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS)์ผ๋ก๋ ์๋ ค์ง ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ์ ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ์ทจ์ฝ์ ์ ๋ํด ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ๋ฉฐ, ์๋ ๋ฐฉ์, ์ ๊ธฐํ๋ ์ํ, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ๊ฒ๋ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๊ธฐ์ ์ ๋ํด ์ค๋ช ํฉ๋๋ค. ์ ์ธ๊ณ ์กฐ์ง์ด ์ง๋ฉดํ ๋ค์ํ ๊ธฐ์ ํ๊ฒฝ๊ณผ ๋ณด์ ๊ณผ์ ๋ฅผ ๊ณ ๋ คํ์ฌ ๊ธ๋ก๋ฒ ๊ด์ ์์ ์ด๋ฌํ ๊ฐ๋ ์ ํ๊ตฌํ ๊ฒ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ (XSS) ์ดํดํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ์ ๊ณต๊ฒฉ์๊ฐ ์ ์์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์น์ฌ์ดํธ์ ์ฃผ์ ํ๊ณ , ์ด๊ฒ์ด ์์ฌํ์ง ์๋ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ถ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์์์ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์กฐ์ํ ์ ์๋๋ก ํ์ฉํ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
XSS ์ทจ์ฝ์ ์๋ ์ธ ๊ฐ์ง ์ฃผ์ ์ ํ์ด ์์ต๋๋ค:
- ์ ์ฅํ XSS (์๊ตฌ์ XSS): ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ๋์ ์๋ฒ์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํฌ๋ผ ๋๋ ๋๊ธ ์น์ ). ์ฌ์ฉ์๊ฐ ์ํฅ์ ๋ฐ๋ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ฉ๋๋ค. ์ด๋ ๊ฐ์ฅ ์ํํ ์ ํ์ XSS์ ๋๋ค.
- ๋ฐ์ฌํ XSS (๋น์๊ตฌ์ XSS): ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ๋จ์ผ HTTP ์์ฒญ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ๋ฉ๋๋ค. ์๋ฒ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ค์ ๋ฐ์ฌํ๊ณ , ์ฌ์ฉ์๋ ์ด๋ฅผ ์คํํฉ๋๋ค. ์ด๋ ์ข ์ข ์ฌ์ฉ์๋ฅผ ์์ฌ ์ ์ฑ ๋งํฌ๋ฅผ ํด๋ฆญํ๋๋ก ์ ๋ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- DOM ๊ธฐ๋ฐ XSS: ์ทจ์ฝ์ ์ด ์๋ฒ ์ธก ์ฝ๋๊ฐ ์๋ ํด๋ผ์ด์ธํธ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ฒด์ ์กด์ฌํฉ๋๋ค. ๊ณต๊ฒฉ์๋ DOM(๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ)์ ์กฐ์ํ์ฌ ์ ์ฑ ์ฝ๋๋ฅผ ์ฃผ์ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ์ ์ํ์ฑ
์ฑ๊ณต์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ๊ณต๊ฒฉ์ ๊ฒฐ๊ณผ๋ ์ฌ์ฉ์ ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๋ชจ๋์๊ฒ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ ์ฌ์ ์ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ณ์ ํ์ทจ: ๊ณต๊ฒฉ์๋ ์ธ์ ์ฟ ํค๋ฅผ ํฌํจํ ์ฌ์ฉ์ ์ฟ ํค๋ฅผ ํ์ณ ์ฌ์ฉ์๋ฅผ ์ฌ์นญํ๊ณ ๊ณ์ ์ ๋ฌด๋จ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋๋: ๊ณต๊ฒฉ์๋ ๊ฐ์ธ ์ ๋ณด, ๊ธ์ต ์ ๋ณด ๋๋ ์ง์ ์ฌ์ฐ๊ณผ ๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ํ์น ์ ์์ต๋๋ค.
- ์น์ฌ์ดํธ ๋ณ์กฐ: ๊ณต๊ฒฉ์๋ ์น์ฌ์ดํธ์ ์ฝํ ์ธ ๋ฅผ ์์ ํ์ฌ ์ ์์ ์ธ ๋ฉ์์ง๋ฅผ ํ์ํ๊ฑฐ๋, ์ฌ์ฉ์๋ฅผ ํผ์ฑ ์ฌ์ดํธ๋ก ๋ฆฌ๋๋ ์ ํ๊ฑฐ๋, ์ ๋ฐ์ ์ธ ํผ๋์ ์ผ๊ธฐํ ์ ์์ต๋๋ค.
- ์ ์ฑ ์ฝ๋ ์ ํฌ: ๊ณต๊ฒฉ์๋ ์ฌ์ฉ์์ ์ปดํจํฐ์ ์ ์ฑ ์ฝ๋๋ฅผ ์ค์นํ๋ ์ ์ฑ ์ฝ๋๋ฅผ ์ฃผ์ ํ ์ ์์ต๋๋ค.
- ํผ์ฑ ๊ณต๊ฒฉ: ๊ณต๊ฒฉ์๋ ์น์ฌ์ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ํผ์ฑ ๊ณต๊ฒฉ์ ์์ํ์ฌ ์ฌ์ฉ์๋ฅผ ์์ฌ ๋ก๊ทธ์ธ ์๊ฒฉ ์ฆ๋ช ์ด๋ ๊ธฐํ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ์ ๋ํ ์ ์์ต๋๋ค.
- ์ ์ฑ ์ฌ์ดํธ๋ก์ ๋ฆฌ๋๋ ์ : ๊ณต๊ฒฉ์๋ ์ฌ์ฉ์๋ฅผ ์ ์ฑ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ๊ฑฐ๋, ๊ฐ์ธ ์ ๋ณด๋ฅผ ํ์น๊ฑฐ๋, ๊ธฐํ ์ ํดํ ํ๋์ ์ํํ ์ ์๋ ์ ์ฑ ์น์ฌ์ดํธ๋ก ๋ฆฌ๋๋ ์ ํ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ๋ฐฉ์ง ๊ธฐ์
์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ์ ๋ฐฉ์งํ๋ ค๋ฉด ์ทจ์ฝ์ ์ ๊ทผ๋ณธ ์์ธ์ ํด๊ฒฐํ๊ณ ์ ์ฌ์ ์ธ ๊ณต๊ฒฉ ํ๋ฉด์ ์ต์ํํ๋ ๋ค์ธต์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ธฐ์ ์ ๋๋ค:
1. ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ๋ฐ ์๋ํ์ด์ ์ด์
์ ๋ ฅ๊ฐ ๊ฒ์ฆ์ ์ฌ์ฉ์ ์ ๋ ฅ์ด ์์๋๋ ํ์๊ณผ ๋ฐ์ดํฐ ์ ํ์ ๋ฐ๋ฅด๋์ง ํ์ธํ๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ ๊ณต๊ฒฉ์๊ฐ ์๊ธฐ์น ์์ ๋ฌธ์๋ ์ฝ๋๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์๋ํ์ด์ ์ด์ ์ ์ฌ์ฉ์ ์ ๋ ฅ์์ ์ ์ฌ์ ์ผ๋ก ์ํํ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ์ธ์ฝ๋ฉํ๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ ์ ๋ ฅ์ด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ํ๊ฒ ์ฌ์ฉ๋ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ ๋ ฅ๊ฐ ๊ฒ์ฆ ๋ฐ ์๋ํ์ด์ ์ด์ ์ ์ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์ฆ: ์ฌ๊ธฐ์๋ ์์, URL, ์ฟ ํค ๋ฐ ๊ธฐํ ์์ค์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
- ํ์ดํธ๋ฆฌ์คํธ ์ ๊ทผ ๋ฐฉ์ ์ฌ์ฉ: ๊ฐ ์ ๋ ฅ ํ๋์ ํ์ฉ๋๋ ๋ฌธ์์ ๋ฐ์ดํฐ ์ ํ์ ์ ์ํ๊ณ , ์ด ๊ท์น์ ๋ฐ๋ฅด์ง ์๋ ๋ชจ๋ ์ ๋ ฅ์ ๊ฑฐ๋ถํฉ๋๋ค.
- ์ถ๋ ฅ ์ธ์ฝ๋ฉ: ํ์ด์ง์ ํ์ํ๊ธฐ ์ ์ ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ธ์ฝ๋ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๋ ฅ์ ์ฝ๋๋ก ํด์ํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- HTML ์ํฐํฐ ์ธ์ฝ๋ฉ ์ฌ์ฉ: `<`, `>`, `"`, `&`์ ๊ฐ์ ํน์ ๋ฌธ์๋ฅผ ํด๋น HTML ์ํฐํฐ(์: `<`, `>`, `"`, `&`)๋ก ๋ณํํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์ด์ค์ผ์ดํ ์ฌ์ฉ: ์์๋ฐ์ดํ(`'`), ํฐ๋ฐ์ดํ(`"`), ๋ฐฑ์ฌ๋์(`\`)์ ๊ฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ์์ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ๋ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ปจํ ์คํธ ์ธ์ ์ธ์ฝ๋ฉ: ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ๋๋ ์ปจํ ์คํธ์ ๋ฐ๋ผ ์ ์ ํ ์ธ์ฝ๋ฉ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, URL์ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ์๋ URL ์ธ์ฝ๋ฉ์ ์ฌ์ฉํฉ๋๋ค.
์์ (PHP):
$userInput = $_POST['comment'];
$sanitizedInput = htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
echo "Comment: " . $sanitizedInput . "
";
์ด ์์์์ `htmlspecialchars()`๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ์ฌ์ ์ผ๋ก ์ํํ ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉํ์ฌ HTML ์ฝ๋๋ก ํด์๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
2. ์ถ๋ ฅ ์ธ์ฝ๋ฉ
์ถ๋ ฅ ์ธ์ฝ๋ฉ์ ํ์ด์ง์ ํ์๋๋ ๋ชจ๋ ์ฌ์ฉ์ ์ ๊ณต ๋ฐ์ดํฐ๊ฐ ์คํ ๊ฐ๋ฅํ ์ฝ๋๊ฐ ์๋ ๋ฐ์ดํฐ๋ก ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค๋ฅธ ์ปจํ ์คํธ์๋ ๋ค๋ฅธ ์ธ์ฝ๋ฉ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค:
- HTML ์ธ์ฝ๋ฉ: HTML ํ๊ทธ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋๋ HTML ์ํฐํฐ ์ธ์ฝ๋ฉ(์: `<`, `>`, `&`, `"`)์ ์ฌ์ฉํฉ๋๋ค.
- URL ์ธ์ฝ๋ฉ: URL์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๋๋ URL ์ธ์ฝ๋ฉ(์: ๊ณต๋ฐฑ์ ๊ฒฝ์ฐ `%20`, ๋ฌผ์ํ์ ๊ฒฝ์ฐ `%3F`)์ ์ฌ์ฉํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ฝ๋ฉ: ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ด์ค์ผ์ดํ์ ์ฌ์ฉํฉ๋๋ค.
- CSS ์ธ์ฝ๋ฉ: CSS ์คํ์ผ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๋๋ CSS ์ด์ค์ผ์ดํ์ ์ฌ์ฉํฉ๋๋ค.
์์ (JavaScript):
let userInput = document.getElementById('userInput').value;
let encodedInput = encodeURIComponent(userInput);
let url = "https://example.com/search?q=" + encodedInput;
window.location.href = url;
์ด ์์์์ `encodeURIComponent()`๋ ์ฌ์ฉ์ ์ ๋ ฅ์ด URL์ ํฌํจ๋๊ธฐ ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ธ์ฝ๋ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
3. ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)
์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP)์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ํน์ ํ์ด์ง์ ๋ํด ๋ก๋ํ ์ ์๋ ๋ฆฌ์์ค๋ฅผ ์ ์ดํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ๋ ฅํ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๋ขฐํ ์ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ XSS ๊ณต๊ฒฉ์ ์ํ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
CSP๋ ์๋ฐ์คํฌ๋ฆฝํธ, CSS, ์ด๋ฏธ์ง, ๊ธ๊ผด ๋ฑ ๋ค์ํ ์ ํ์ ๋ฆฌ์์ค์ ๋ํด ์ ๋ขฐํ ์ ์๋ ์์ค์ ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ์ง์ ํ์ฌ ์๋ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฌํ ์ ๋ขฐํ ์ ์๋ ์์ค์์๋ง ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ์ฌ ํ์ด์ง์ ์ฃผ์ ๋ ๋ชจ๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฐจ๋จํฉ๋๋ค.
๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ CSP ์ง์๋ฌธ์ ๋๋ค:
- `default-src`: ๋ฆฌ์์ค ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ๊ธฐ๋ณธ ์ ์ฑ ์ ์ ์ํฉ๋๋ค.
- `script-src`: ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ก๋ํ ์ ์๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `style-src`: CSS ์คํ์ผ์ ๋ก๋ํ ์ ์๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `img-src`: ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ์ ์๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `connect-src`: ํด๋ผ์ด์ธํธ๊ฐ XMLHttpRequest, WebSocket ๋๋ EventSource๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐํ ์ ์๋ URL์ ์ง์ ํฉ๋๋ค.
- `font-src`: ๊ธ๊ผด์ ๋ก๋ํ ์ ์๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `object-src`: Flash ๋ฐ Java ์ ํ๋ฆฟ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ก๋ํ ์ ์๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `media-src`: ์ค๋์ค ๋ฐ ๋น๋์ค๋ฅผ ๋ก๋ํ ์ ์๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `frame-src`: ํ๋ ์์ ๋ก๋ํ ์ ์๋ ์์ค๋ฅผ ์ง์ ํฉ๋๋ค.
- `base-uri`: ๋ฌธ์์ ํ์ฉ๋๋ ๊ธฐ๋ณธ URL์ ์ง์ ํฉ๋๋ค.
- `form-action`: ์์ ์ ์ถ์ ํ์ฉ๋๋ URL์ ์ง์ ํฉ๋๋ค.
์์ (HTTP ํค๋):
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://apis.google.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com
์ด CSP ์ ์ฑ ์ ๋์ผํ ์ถ์ฒ(`'self'`), ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ ๋ฐ ์คํ์ผ(`'unsafe-inline'`), ๊ทธ๋ฆฌ๊ณ Google API์ ์คํฌ๋ฆฝํธ ๋ฐ Google Fonts์ ์คํ์ผ์์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋ ๊ฒ์ ํ์ฉํฉ๋๋ค.
CSP์ ๋ํ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: CSP๋ฅผ ๊ตฌํํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์กดํ๋ ํ์ฌ ์๋น์ค๋ฅผ ๊ณ ๋ คํ์ญ์์ค. CSP ์ ์ฑ ์ด ์ด๋ฌํ ์๋น์ค์์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ ์ ์๋๋ก ํ์ฉํ๋์ง ํ์ธํ์ญ์์ค. Report-URI์ ๊ฐ์ ๋๊ตฌ๋ CSP ์๋ฐ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
4. HTTP ๋ณด์ ํค๋
HTTP ๋ณด์ ํค๋๋ XSS๋ฅผ ํฌํจํ ๋ค์ํ ์น ๊ณต๊ฒฉ์ ๋ํ ์ถ๊ฐ์ ์ธ ๋ณดํธ ๊ณ์ธต์ ์ ๊ณตํฉ๋๋ค. ๋ช ๊ฐ์ง ์ค์ํ ํค๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- `X-XSS-Protection`: ์ด ํค๋๋ ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ XSS ํํฐ๋ฅผ ํ์ฑํํฉ๋๋ค. ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ ์๋์ง๋ง, ์ผ๋ถ ์ ํ์ XSS ๊ณต๊ฒฉ์ ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ฐ์ `1; mode=block`์ผ๋ก ์ค์ ํ๋ฉด XSS ๊ณต๊ฒฉ์ด ๊ฐ์ง๋ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ด์ง๋ฅผ ์ฐจ๋จํ๋๋ก ์ง์ํฉ๋๋ค.
- `X-Frame-Options`: ์ด ํค๋๋ ์น์ฌ์ดํธ๊ฐ `
- `Strict-Transport-Security` (HSTS): ์ด ํค๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์น์ฌ์ดํธ์ ๋ํ ๋ชจ๋ ํฅํ ์์ฒญ์ HTTPS๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ์ฌ ์ค๊ฐ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
- `Content-Type-Options`: ์ด๋ฅผ `nosniff`๋ก ์ค์ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ธ๋ ์ฝํ ์ธ ์ ํ๊ณผ ๋ค๋ฅธ ์๋ต์ MIME-sniffingํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ์๋ชป๋ MIME ์ ํ ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ๋ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์์ (HTTP ํค๋):
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Content-Type-Options: nosniff
5. ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฉํ๋ฒฝ(WAF) ์ฌ์ฉ
์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฉํ๋ฒฝ(WAF)์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ธํฐ๋ท ์ฌ์ด์ ์์นํ์ฌ ๋ค์ด์ค๋ ํธ๋ํฝ์์ ์ ์ฑ ์์ฒญ์ ๊ฒ์ฌํ๋ ๋ณด์ ์ฅ์น์ ๋๋ค. WAF๋ XSS ๊ณต๊ฒฉ, SQL ์ธ์ ์ ๊ณต๊ฒฉ ๋ฐ ๊ธฐํ ์ผ๋ฐ์ ์ธ ์น ์ทจ์ฝ์ ์ ํ์งํ๊ณ ์ฐจ๋จํ ์ ์์ต๋๋ค.
WAF๋ ํ๋์จ์ด ์ดํ๋ผ์ด์ธ์ค, ์ํํธ์จ์ด ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋น์ค๋ก ๋ฐฐํฌ๋ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๊ทธ๋์ฒ ๊ธฐ๋ฐ ํ์ง์ ์ด์ ํ์ง์ ์กฐํฉ์ ์ฌ์ฉํ์ฌ ์ ์ฑ ํธ๋ํฝ์ ์๋ณํฉ๋๋ค.
๊ธ๋ก๋ฒ WAF ๊ณ ๋ ค ์ฌํญ: ๊ธ๋ก๋ฒ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ ๊ณตํ๊ณ ๋ค์ํ ์ง์ญ์ ๋ณด์ ์ํ ๋ฐ ๊ท์ ์ค์ ์๊ตฌ ์ฌํญ์ ์ ์ํ ์ ์๋ WAF ์๋ฃจ์ ์ ๊ณ ๋ คํ์ญ์์ค. ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ WAF๋ ์ข ์ข ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด ๋ ๋์ ํ์ฅ์ฑ๊ณผ ๊ด๋ฆฌ ์ฉ์ด์ฑ์ ์ ๊ณตํฉ๋๋ค.
6. ๋ณด์ ์ฝ๋ฉ ๊ดํ
๋ณด์ ์ฝ๋ฉ ๊ดํ์ ์ฑํํ๋ ๊ฒ์ XSS ์ทจ์ฝ์ ์ ์๋ฐฉํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ๋ณด์ ํ๋ ์์ํฌ ์ฌ์ฉ: ์ ๋ ฅ๊ฐ ๊ฒ์ฆ ๋ฐ ์ถ๋ ฅ ์ธ์ฝ๋ฉ๊ณผ ๊ฐ์ ๋ด์ฅ ๋ณด์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ ํ๋ฆฝ๋ ์น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- `eval()` ์ฌ์ฉ ํํผ: `eval()` ํจ์๋ ์์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๋ฏ๋ก ์ ๋ขฐํ ์ ์๋ ์ ๋ ฅ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋งค์ฐ ์ํํ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด `eval()` ์ฌ์ฉ์ ํผํ์ญ์์ค.
- ์์กด์ฑ ์ต์ ์ํ ์ ์ง: ์น ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๊ธฐํ ์์กด์ฑ์ ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธํ์ฌ ๋ณด์ ์ทจ์ฝ์ ์ ํจ์นํ์ญ์์ค.
- ์ ๊ธฐ์ ์ธ ๋ณด์ ๊ฐ์ฌ ์ํ: ์ฝ๋์ ์ทจ์ฝ์ ์ ์๋ณํ๊ณ ์์ ํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ธ ๋ณด์ ๊ฐ์ฌ๋ฅผ ์ํํ์ญ์์ค.
- ํ ํ๋ฆฟ ์์ง ์ฌ์ฉ: ์ถ๋ ฅ์ ์๋์ผ๋ก ์ด์ค์ผ์ดํ ์ฒ๋ฆฌํ์ฌ XSS ์ทจ์ฝ์ ์ ์ํ์ ์ค์ด๋ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ญ์์ค.
์์ (JavaScript์์ eval() ํผํ๊ธฐ):
`eval('document.getElementById("' + id + '").value')`๋ฅผ ์ฌ์ฉํ๋ ๋์ `document.getElementById(id).value`๋ฅผ ์ฌ์ฉํ์ญ์์ค.
7. ์ ๊ธฐ์ ์ธ ๋ณด์ ๊ฐ์ฌ ๋ฐ ๋ชจ์ ํดํน
์ ๊ธฐ์ ์ธ ๋ณด์ ๊ฐ์ฌ์ ๋ชจ์ ํดํน์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ทจ์ฝ์ ์ ์๋ณํ๊ณ ์ํํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ณด์ ๊ฐ์ฌ๋ ์ ์ฌ์ ์ธ ์ฝ์ ์ ์๋ณํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋, ๊ตฌ์ฑ ๋ฐ ์ธํ๋ผ์ ๋ํ ์ฒด๊ณ์ ์ธ ๊ฒํ ๋ฅผ ํฌํจํฉ๋๋ค. ๋ชจ์ ํดํน์ ์ค์ ๊ณต๊ฒฉ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ๋ฐฉ์ด๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
์ด๋ฌํ ํ๋์ ์น ์ทจ์ฝ์ ์ ์๋ณํ๊ณ ์ ์ฉํ๋ ๋ฐ ๊ฒฝํ์ด ์๋ ์๊ฒฉ์ ๊ฐ์ถ ๋ณด์ ์ ๋ฌธ๊ฐ๊ฐ ์ํํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ฌ ๋ฐ ํ ์คํธ ๊ฒฐ๊ณผ๋ ๊ฐ์ ๋ ธ๋ ฅ์ ์ฐ์ ์์๋ฅผ ์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ๋ณด์ ํ์ธ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ์ฌ ๊ณ ๋ ค ์ฌํญ: ๊ฐ์ฌ๊ฐ ISO 27001๊ณผ ๊ฐ์ ๊ตญ์ ๋ณด์ ํ์ค๊ณผ ์ผ์นํ๋์ง ํ์ธํ๊ณ ๊ฐ์ฌ ๊ณผ์ ์์ ์ง์ญ ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ (์: GDPR, CCPA)์ ๊ณ ๋ คํ์ญ์์ค.
8. ๊ต์ก ๋ฐ ํ๋ จ
๊ฐ๋ฐ์ ๋ฐ ๊ธฐํ ์ดํด ๊ด๊ณ์์๊ฒ XSS ์ทจ์ฝ์ ๋ฐ ์๋ฐฉ ๊ธฐ์ ์ ๋ํด ๊ต์กํ๋ ๊ฒ์ ์์ ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ต์ XSS ๊ณต๊ฒฉ ๋ฒกํฐ ๋ฐ ์ํ ์ ๋ต์ ๋ค๋ฃจ๋ ์ ๊ธฐ์ ์ธ ๊ต์ก ์ธ์ ์ ์ ๊ณตํ์ญ์์ค. ๊ฐ๋ฐ์๋ค์ด ์ต์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ต์ ์ ๋ณด๋ฅผ ์ ์งํ๊ณ ๋ณด์ ์ปจํผ๋ฐ์ค ๋ฐ ์ํฌ์์ ์ฐธ์ฌํ๋๋ก ์ฅ๋ คํ์ญ์์ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ์ ํ๊ดด์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๋ ์ฌ๊ฐํ ์น ๋ณด์ ์ทจ์ฝ์ ์ ๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ์ํ์ ์ดํดํ๊ณ ์๋ฐฉ ๊ธฐ์ ์ ๊ตฌํํจ์ผ๋ก์จ XSS ๊ณต๊ฒฉ์ ๋ํ ๋ ธ์ถ์ ํฌ๊ฒ ์ค์ด๊ณ ์ฌ์ฉ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ ์ ์์ต๋๋ค.
์น ๋ณด์์ ์ง์์ ์ธ ๊ณผ์ ์ด๋ผ๋ ์ ์ ๊ธฐ์ตํ์ญ์์ค. ๊ฒฝ๊ณ๋ฅผ ๋ฆ์ถ์ง ๋ง๊ณ ์ฝ๋๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ทจ์ฝ์ ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ญ์์ค. ๋ณด์์ ๋ํ ์ฌ์ ์๋ฐฉ์ ์ด๊ณ ํฌ๊ด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํจ์ผ๋ก์จ ๋์์์ด ์งํํ๋ ์ํ ํ๊ฒฝ์ผ๋ก๋ถํฐ ๋ณดํธ๋๋ ๊ฒฌ๊ณ ํ๊ณ ๋ณต์๋ ฅ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์กฐ์น๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ์กฐ์ง์ ๋ ์์ ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ์ ์ทจ์ฝ์ ๊ณผ ๊ด๋ จ๋ ์ํ์ผ๋ก๋ถํฐ ์ฌ์ฉ์๋ฅผ ๋ณดํธํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํฌ๊ด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ๋ขฐ๋ฅผ ์ ์งํ๊ณ ์ธ๊ณํ๋ ๋์งํธ ์ธ๊ณ์์ ์จ๋ผ์ธ ์ํธ ์์ฉ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.