HttpOnly 플래그는 document.cookie 로 쿠키를 읽는 것을 막아 XSS 로 세션 쿠키를 훔치는 것을 방지한다. 그러나 XSS 자체를 막지는 않는다. 스크립트가 삽입되면 쿠키가 자동으로 붙는 fetch 요청으로 인증된 요청을 보낼 수 있고(session riding), DOM 을 바꿔 피싱 폼을 넣거나 키 입력을 가로챌 수 있다. CSP · 입력 검증 · 출력 인코딩을 함께 적용해야 한다.
csrftoken 등)은 HttpOnly 를 걸면 읽지 못한다. CSRF 토큰 쿠키는 제외하거나 서버가 별도 경로로 토큰을 준다.| 플래그 | 역할 |
|---|---|
Secure |
HTTPS 에서만 전송 |
SameSite=Strict 또는 Lax |
CSRF 완화. None 이면 반드시 Secure 와 함께 |
Path · Domain |
쿠키 범위를 최소화 |
폼 값에서 위험한 태그와 이벤트 핸들러를 거르는 validate_check(paramData, minor_nm) 는 다음 항목을 검사한다. 클라이언트 검증은 우회할 수 있으므로 서버에서도 같은 필터를 적용한다.
| 검사 | 내용 |
|---|---|
| 태그 | body embed frame frameset script link iframe object style meta img div — < script> </script> 처럼 공백 우회까지 정규식으로 감지 |
| 이벤트 핸들러 | onclick onkeyup ondblclick onload onerror onmouseover onfocus onblur onsubmit onchange 등 — onerror = 처럼 = 앞 공백 포함 |
| URI 스킴 | javascript: vbscript: data: |
| 대소문자 | 입력을 소문자로 바꾸고 정규식에 i 플래그 |
const blockedTags = ['body','embed','frame','frameset','script','link','iframe','object','style','meta','img','div'];
const blockedEventHandlers = ['onclick','onkeyup','ondblclick','onplaying','onmousedown','oncanplay','onmouseup','onblur','onmouseover','onfocus','onmouseout','onscroll','onsubmit','onresize','onkeypress','onload','onunload','onabort','onerror','onselect','onchange','onreset'];
function validate_check(paramData, minor_nm) {
const v = String(paramData[minor_nm] ?? '').toLowerCase();
const tagRe = new RegExp('<\s*/?\s*(' + blockedTags.join('|') + ')\b', 'i');
const evtRe = new RegExp('\b(' + blockedEventHandlers.join('|') + ')\s*=', 'i');
const uriRe = /(javascript|vbscript|data)\s*:/i;
if (tagRe.test(v) || evtRe.test(v) || uriRe.test(v)) {
alert('허용되지 않는 문자열이 포함되어 있습니다.');
return false;
}
return true;
}
function validate_check_all(paramData) {
return Object.keys(paramData).every(k => validate_check(paramData, k));
}
차단 목록을 바꿀 때는 두 배열만 고친다.