Plain Text

HTML Encoded

ℹ️ About HTML Encoding/Decoding

HTML encoding converts special characters to HTML entities to prevent them from being interpreted as HTML code. This is essential for displaying user input safely in web pages.

Common HTML Entities:

CharacterHTML EntityDescription
<&lt;Less than
>&gt;Greater than
&&amp;Ampersand
"&quot;Double quote
'&#39;Single quote

Use Cases:

  • ✓ Prevent XSS (Cross-Site Scripting) attacks
  • ✓ Display code snippets in HTML
  • ✓ Show HTML tags as text
  • ✓ Safely render user-generated content

📖 HTML 인코딩이란?

🔤 HTML 엔티티 (HTML Entities)

HTML 인코딩은 HTML에서 특별한 의미를 가진 문자나 표시할 수 없는 문자를 HTML 엔티티(Entity)로 변환하는 과정입니다. <, >, & 같은 문자는 HTML 태그로 해석될 수 있으므로, 일반 텍스트로 표시하려면 &lt;, &gt;, &amp; 같은 엔티티로 변환해야 합니다. 이는 XSS 공격 방지와 올바른 HTML 렌더링에 필수적입니다.

인코딩 예시:
원본: <div>Hello & "World"</div>
HTML: &lt;div&gt;Hello &amp; &quot;World&quot;&lt;/div&gt;

💡 HTML 인코딩 사용 사례

  • XSS 방지: 사용자 입력을 안전하게 표시하여 크로스 사이트 스크립팅 공격 차단
  • 코드 예제 표시: 블로그나 문서에서 HTML/XML 코드를 그대로 보여주기
  • 특수문자 처리: <, >, &, 따옴표 등을 텍스트로 표시
  • 데이터 저장: 데이터베이스에 HTML이 포함된 텍스트 안전하게 저장
  • 이메일 본문: HTML 이메일에서 특수문자 올바르게 표시
  • JSON 응답: API 응답에서 HTML 태그를 문자열로 전송

🔧 사용 방법

  1. 인코딩 (Encode): HTML 태그나 특수문자를 엔티티로 자동 변환
  2. 디코딩 (Decode): &lt; 같은 엔티티를 원본 문자로 복원
  3. 양방향 변환: 실시간으로 입력 즉시 변환 결과 표시
  4. 복사: 변환된 결과를 클릭하여 클립보드에 복사
  5. 대량 변환: 여러 줄의 HTML 코드도 한 번에 변환

🔡 주요 HTML 엔티티

필수 엔티티 (Essential)

HTML에서 반드시 인코딩해야 하는 문자들입니다.

문자엔티티 (이름)엔티티 (숫자)설명
<&lt;&#60;태그 시작
>&gt;&#62;태그 종료
&&amp;&#38;엔티티 시작
"&quot;&#34;큰따옴표 (속성값)
'&apos;&#39;작은따옴표 (속성값)
자주 사용하는 엔티티
&nbsp; → 줄바꿈 없는 공백
&copy; → © (저작권)
&reg; → ® (등록상표)
&trade; → ™ (상표)
&euro; → € (유로)
&pound; → £ (파운드)
&yen; → ¥ (엔)
&times; → × (곱하기)
&divide; → ÷ (나누기)
&plusmn; → ± (플러스마이너스)
&deg; → ° (도)
&micro; → µ (마이크로)
화살표 & 기호
&larr; → ← (왼쪽 화살표)
&rarr; → → (오른쪽 화살표)
&uarr; → ↑ (위 화살표)
&darr; → ↓ (아래 화살표)
&hearts; → ♥ (하트)
&spades; → ♠ (스페이드)
&clubs; → ♣ (클로버)
&diams; → ♦ (다이아)

🛡️ XSS 공격과 HTML 인코딩

XSS (Cross-Site Scripting)란?

공격자가 웹사이트에 악성 스크립트를 삽입하여 다른 사용자의 브라우저에서 실행시키는 공격입니다. 사용자 입력을 제대로 검증하지 않으면 심각한 보안 취약점이 됩니다.

❌ 위험한 예시 (인코딩 없음)
// 사용자 입력: <script>alert('XSS')</script>
document.getElementById('output').innerHTML = userInput;
// 결과: 스크립트가 실행됨! 😱
✅ 안전한 예시 (인코딩 사용)
// 사용자 입력을 HTML 인코딩
const encoded = escapeHtml(userInput);
document.getElementById('output').innerHTML = encoded;
// 결과: &lt;script&gt;alert('XSS')&lt;/script&gt;
// 스크립트가 텍스트로 표시됨! ✅
🔒 XSS 방지 모범 사례
  • 항상 인코딩: 사용자 입력을 HTML에 표시할 때 반드시 인코딩
  • textContent 사용: innerHTML 대신 textContent 사용 (자동 인코딩)
  • CSP 설정: Content Security Policy로 인라인 스크립트 차단
  • 라이브러리 활용: DOMPurify 같은 검증된 라이브러리 사용
  • 서버 측 검증: 클라이언트와 서버 양쪽에서 검증

💻 프로그래밍 언어별 사용 예시

JavaScript:
// HTML 인코딩 함수
function escapeHtml(text) {
  const map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;'
  };
  return text.replace(/[&<>"']/g, m => map[m]);
}

// HTML 디코딩 함수
function unescapeHtml(text) {
  const textarea = document.createElement('textarea');
  textarea.innerHTML = text;
  return textarea.value;
}

// 사용 예시
const encoded = escapeHtml("<div>Hello</div>");
// "&lt;div&gt;Hello&lt;/div&gt;"
Python:
import html

# HTML 인코딩
encoded = html.escape("<div>Hello & 'World'</div>")
# "&lt;div&gt;Hello &amp; &#x27;World&#x27;&lt;/div&gt;"

# HTML 디코딩
decoded = html.unescape(encoded)
# "<div>Hello & 'World'</div>"

# 따옴표 포함 인코딩
encoded_quote = html.escape("Text with 'quotes'", quote=True)
# "Text with &#x27;quotes&#x27;"
PHP:
<?php
// HTML 인코딩
$encoded = htmlspecialchars("<div>Hello & 'World'</div>", ENT_QUOTES, 'UTF-8');
// "&lt;div&gt;Hello &amp; &#039;World&#039;&lt;/div&gt;"

// HTML 디코딩
$decoded = htmlspecialchars_decode($encoded);
// "<div>Hello & 'World'</div>"

// 전체 엔티티 인코딩
$full = htmlentities("<div>€100</div>", ENT_QUOTES, 'UTF-8');
// "&lt;div&gt;&euro;100&lt;/div&gt;"
?>

❓ 자주 묻는 질문 (FAQ)

Q: &lt;와 &#60;의 차이는 무엇인가요?

A: 둘 다 < 문자를 나타냅니다. &lt;는 이름 엔티티(Named Entity), &#60;는 숫자 엔티티(Numeric Entity)입니다. 이름 엔티티가 더 읽기 쉽지만, 숫자 엔티티는 모든 문자에 사용할 수 있습니다. 결과는 동일합니다.

Q: HTML 인코딩과 URL 인코딩의 차이는?

A: HTML 인코딩은 &lt; 같은 엔티티를 사용하고, URL 인코딩은 %3C 같은 퍼센트 인코딩을 사용합니다. 용도가 다릅니다: HTML은 웹 페이지 내용, URL은 주소창/링크에서 사용됩니다.

Q: 모든 특수문자를 인코딩해야 하나요?

A: 아니요. <, >, &, ", ' 다섯 개 문자는 필수입니다. 나머지 특수문자는 UTF-8 인코딩을 사용하면 인코딩하지 않아도 되지만, 호환성을 위해 인코딩하는 것이 안전합니다.

Q: innerHTML vs textContent 뭘 써야 하나요?

A: 사용자 입력을 표시할 때는 textContent를 사용하세요. textContent는 자동으로 HTML을 인코딩하여 XSS를 방지합니다. innerHTML은 HTML 태그를 해석하므로 신뢰할 수 있는 소스에만 사용하세요.

Q: 이중 인코딩 문제는 무엇인가요?

A: <를 &lt;로 인코딩한 후, 다시 인코딩하면 &amp;lt;가 됩니다. 화면에는 "&lt;"로 표시됩니다. 항상 디코딩 후 필요시 재인코딩하세요. 프레임워크가 자동 인코딩하는지 확인하세요.

💡 HTML 인코딩 사용 팁

  • 프레임워크 활용: React, Vue 등은 기본적으로 자동 인코딩 제공
  • 서버 측 검증: 클라이언트 인코딩만으로는 부족, 서버에서도 검증
  • 화이트리스트 방식: 허용 태그 목록을 만들고 나머지는 모두 인코딩
  • DOMPurify 사용: 복잡한 HTML 정제 시 검증된 라이브러리 활용
  • CSP 헤더: Content-Security-Policy로 추가 보안 레이어
  • 코드 리뷰: innerHTML, dangerouslySetInnerHTML 사용 시 철저히 검토
  • 테스트: <script>alert('XSS')</script> 같은 입력으로 테스트

⚠️ 주의사항

  • 사용자 입력을 절대 신뢰하지 마세요 - 항상 인코딩하거나 검증하세요
  • innerHTML 사용 시 반드시 인코딩된 데이터만 사용하세요
  • 이중 인코딩을 피하세요 - 이미 인코딩된 데이터는 다시 인코딩하지 마세요
  • URL 인코딩과 HTML 인코딩을 혼동하지 마세요 (다른 용도)
  • 클라이언트 측 인코딩만으로는 부족 - 서버에서도 검증 필수
  • 정규표현식으로 HTML 파싱 시도하지 마세요 - 전용 라이브러리 사용