๐ JSP + JavaScript ํ๊ฒฝ์์ XSS ๋ฐฉ์ด ์คํจ ์์ธ๊ณผ ํด๊ฒฐ
1. ๋ฌธ์ ์ํฉ
- JSP์์ ${ajaxId} ๊ฐ์ JavaScript ๋ฐ HTML์ ์ ๋ฌ
- <c:out> ๋ฐ hidden input ์ฌ์ฉํ์์๋ XSS ๋ฐฉ์ด ์คํจ
- ์:
ajaxId: '<c:out value="${ajaxId}"/>'
2. ์์ธ ๋ถ์
๐ฅ (1) ์ปจํ ์คํธ ๋ถ์ผ์น (ํต์ฌ ์์ธ)
- <c:out>์ HTML escape๋ง ์ํ
- ํ์ง๋ง ์๋๋ JavaScript ๋ฌธ์์ด ์ปจํ ์คํธ
'${ajaxId}'
๐ HTML escape ≠ JavaScript escape
→ XSS ๋ฐฉ์ด ์คํจ
๐ฅ (2) EL ์ง์ ์ถ๋ ฅ (${ajaxId})
<input value="${ajaxId}">
- EL์ escape ์์
- ์ ์ฑ ๊ฐ ์ฝ์ ์ ๊ทธ๋๋ก DOM์ ๋ฐ์
๐ฅ (3) ์๋ฒ ์ธก ๊ฒ์ฆ ๋ถ์ฌ
- ajaxId์ ๋ํ ์ ํ ์์
- ์:
"><script>alert(1)</script>
๐ escape ์ด์ ์ ์ ๋ ฅ ์์ฒด๋ฅผ ์ ๋ขฐํ๋ฉด ์ ๋จ
3. ํด๊ฒฐ ๋ฐฉ๋ฒ
โ (1) JavaScript ์ง์ ์ฝ์ ์ ๊ฑฐ (๊ฐ์ฅ ์ค์)
โ ์๋ชป๋ ๋ฐฉ์
ajaxId: '${ajaxId}'
โ ๊ฐ์
var ajaxId = document.querySelector('input[name="ajaxId"]').value;
๐ DOM ๊ธฐ๋ฐ ์ ๊ทผ์ผ๋ก ์ ํ
โ (2) JSP ์ถ๋ ฅ ์ escape ์ ์ฉ
<input type="hidden" name="ajaxId"
value="<c:out value='${fn:escapeXml(ajaxId)}'/>"/>
๐ HTML ์ปจํ ์คํธ ์์ ์ฑ ํ๋ณด
โ (3) ์๋ฒ ์ ํจ์ฑ ๊ฒ์ฆ ์ถ๊ฐ (ํ์)
if (!ajaxId.matches("^[a-zA-Z0-9_-]+$")) {
throw new IllegalArgumentException("Invalid ajaxId");
}
๐ ๊ณต๊ฒฉ ๋ฒกํฐ ์์ฒ ์ฐจ๋จ
โ (4) ์ญํ ๋ถ๋ฆฌ ์์น ์ ์ฉ
์์ญ์ฑ
์
| ์๋ฒ | ์ ๋ ฅ๊ฐ ๊ฒ์ฆ (Validation) |
| JSP | ์ถ๋ ฅ ์ escape |
| JavaScript | ๋ฐ์ดํฐ ์ง์ ์ฝ์ ๊ธ์ง |
4. ์๋ชป๋ ๋์ ์ฌ๋ก
๋ฐฉ๋ฒ๋ฌธ์
| <c:out>๋ง ์ฌ์ฉ | JS ์ปจํ ์คํธ์์ ๋ฌด๋ ฅ |
| hidden input ์ฌ์ฉ๋ง ๋ฏฟ์ | ๊ฐ ์์ฒด๊ฐ ์ค์ผ๋๋ฉด ๋ฌด์๋ฏธ |
| MultipartFilter ์ถ๊ฐ | XSS์ ๋ฌด๊ด (ํ์ผ ์ ๋ก๋์ฉ) |
5. ์ต์ข ๊ตฌ์กฐ (๊ถ์ฅ ํจํด)
JSP
<input type="hidden" name="ajaxId"
value="<c:out value='${fn:escapeXml(ajaxId)}'/>"/>
JavaScript
const ajaxId = document.querySelector('input[name="ajaxId"]').value;
ajaxLoadHttpConn({
ajaxId: ajaxId
});
Server
if (!ajaxId.matches("^[a-zA-Z0-9_-]+$")) {
throw new SecurityException("Invalid ajaxId");
}
6. ํต์ฌ ๊ตํ
- Escape๋ ๋ง๋ฅ์ด ์๋๋ค (Context-aware escaping ํ์)
- XSS ๋ฐฉ์ง๋ ์ถ๋ ฅ ๋จ๊ณ๊ฐ ์๋๋ผ ์ ๋ ฅ + ์ถ๋ ฅ ๋ชจ๋ ๊ณ ๋ คํด์ผ ํ๋ค
- JavaScript ์ปจํ ์คํธ์์๋ HTML escape๊ฐ ๋ฌด๋ ฅํ๋ ์ ์๋ค
- ๋ฐ์ดํฐ๋ ์ฝ๋์ ์ฝ์ ํ์ง ๋ง๊ณ , DOM์ ํตํด ์ ๋ฌํด์ผ ํ๋ค
- ๋ณด์์ ํํฐ ํ๋๋ก ํด๊ฒฐ๋์ง ์๋๋ค (๋ค์ธต ๋ฐฉ์ด ํ์)
'์ผ > javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ชจ๋ฌ ํ์ ๋ด ๋์ ํ ์ด๋ธ UI ์ ๋ ฌ ๋ฌธ์ ํด๊ฒฐ (0) | 2026.03.22 |
|---|---|
| ์์ ๋ค์ด๋ก๋ ๋ฒํผ ํด๋ฆญ ํ ๋ค๋ฅธ ๋ฒํผ ๋์ ์ด์ ๋ฌธ์ ํด๊ฒฐ (0) | 2026.03.21 |
| ์์ ๋ค์ด๋ก๋ ๊ธฐ๋ฅ ๊ตฌํ ๋ฐ ์์ ์ฑ ๊ฐ์ (0) | 2026.03.21 |
| js14_jQuery_ui (0) | 2023.06.19 |
| js13_effect (0) | 2023.06.01 |