모든 아티클

HTML Entities: 특수 문자를 안전하게 표시하는 방법

HTML에서 <, >, & 문자는 특별한 의미를 가지며 반드시 이스케이프해야 합니다. 한글은 알파벳과 구조 자체가 달라서 엔티티 이야기도 조금 다르게 흘러갑니다 — 한글 한 글자가 사실은 여러 자모가 합쳐져 만들어진 "완성형" 조합이라는 점 때문입니다.

한글 음절은 자모가 합쳐진 완성형 문자

"한"이라는 글자는 초성 ㅎ, 중성 ㅏ, 종성 ㄴ이 하나의 유니코드 코드 포인트로 합쳐진 완성형(precomposed) 문자입니다. 유니코드에서 한글 완성형 음절은 U+AC00부터 U+D7A3까지 11,172개나 되는 넓은 범위를 차지하기 때문에, 숫자 엔티티로 변환하면 &#54620;처럼 각 글자마다 상당히 큰 코드 값이 나옵니다.

한글에는 이름 있는 엔티티가 없다

영어 알파벳이나 라틴 문자 일부와 달리, 한글 음절이나 개별 자모에는 이름 있는 HTML 엔티티가 하나도 존재하지 않습니다. 따라서 한글 텍스트를 엔티티로 인코딩하는 도구는 예외 없이 숫자(또는 16진수) 엔티티에 의존하며, 이 도구의 "모든 문자" 모드로 한글을 인코딩하면 원문보다 훨씬 긴 결과가 나오는 것도 이 때문입니다.

이스케이프해야 할 최소한의 문자 집합

  • <&lt; — 태그가 시작되지 않도록.
  • >&gt; — 태그 뒤의 텍스트를 올바르게 닫기 위해.
  • &&amp; — &가 다른 엔티티의 시작으로 읽히지 않도록.
  • "'&quot;, &#39; — 따옴표로 감싼 속성 값 안에서는 필수.

XSS와의 관계

대부분의 XSS 취약점은 사용자가 입력한 텍스트가 이스케이프 없이 HTML에 삽입되기 때문에 발생합니다. "<script>...</script>"를 엔티티로 변환하지 않고 출력하면 브라우저가 이를 코드로 실행합니다. 이스케이프는 동적 콘텐츠를 표시할 때의 기본적인 — 하지만 유일하지는 않은 — 방어책입니다.

맥락이 중요하다: 텍스트 대 속성

<, >, &를 이스케이프하는 것은 태그 사이의 텍스트에는 충분하지만, 따옴표로 감싼 속성 안에서는 실제로 사용된 따옴표 문자를 추가로 이스케이프해야 합니다. 속성이 큰따옴표로 감싸져 있는데 값 안에 이스케이프되지 않은 큰따옴표가 있으면, 마크업이 예상보다 일찍 끊어집니다.

도구 사용해보기