기타 Lobsters · 2일 전

"HTML을 문자열 템플릿으로 만드는 건 애초에 틀린 방식이었다" 해외 개발자의 일침

핵심 요약
  • 기존 서버 사이드 웹 개발에서 널리 쓰이는 문자열 템플릿 방식이 XSS 취약점의 근본 원인이라는 지적이 제기되었습니다.
  • 문자열 템플릿은 HTML의 문법과 컨텍스트를 이해하지 못해 자동 이스케이프가 불완전하며 오류를 경고 없이 통과시키는 문제가 있습니다.
  • 저자는 잘못된 마크업과 공백 낭비를 막고 안전성을 확보하기 위해 AST 기반 표현 방식을 대안으로 제시합니다.
요약 웹 개발 역사에서 서버 사이드 애플리케이션은 대부분 문자열 템플릿(string template) 방식을 사용해 HTML을 생성해 왔습니다. 하지만 저자는 이러한 문자열 기반 템플릿 처리가 본질적으로 잘못된 접근법이며, 웹 환경에서 끊이지 않는 XSS(크로스 사이트 스크립팅) 취약점의 근본 원인이라고 지적합니다. 문자열 템플릿 시스템은 자신이 조합하고 있는 내용물의 문법적 구조나 출력 대상 언어의 의미론(semantics)을 전혀 이해하지 못하기 때문입니다. 이러한 문제를 해결하기 위해 도입된 '자동 이스케이프(autoescaping)' 역시 한계가 뚜렷합니다. HTML 내에서 필요한 이스케이프 방식은 컨텍스트에 따라 전부 다릅니다. 예를 들어 일반 HTML 본문 텍스트, HTML 속성값 내부, 그리고 속성값 내부의 URL 쿼리 파라미터 값에서 요구되는 이스케이프 규칙은 제각각입니다. 이를 단순히 모든 곳에 일괄 적용(예: 따옴표를 일괄적으로 &quot;로 치환)하면 URL이나 자바스크립트 문자열 상수 내부 등 특정 위치에서는 올바르게 동작하지 않아 결국 개발자가 수동 이스케이프를 신경 써야 합니다. 반대로 템플릿 시스템이 컨텍스트를 스스로 파악하려 시도할 경우 치명적인 계층 위반(layering violation)이 발생합니다. 템플릿 엔진이 문서를 임의로 해석해 조용히 결정을 내리게 되는데, 가령 <a> 태그의 href 속성은 URL로 인식해 쿼리 파라미터를 인코딩해주지만 data-* 같은 커스텀 속성에 들어간 URL은 인식하지 못해 이스케이프를 누락합니다. 더 큰 문제는 이러한 누락이 에러나 경고 없이 조용히 발생한다는 점입니다. 브라우저가 인식하는 다양한 형태의 스크립트 태그(<script>, <SCRIPT>, 각종 MIME 타입 및 네임스페이스)와 템플릿 시스템의 파싱 기준이 조금이라도 어긋나면 취약점이 노출되며, 실제 해킹 공격이나 제보가 있기 전까지는 개발자조차 오류를 인지할 수 없습니다. 또한 문자열 템플릿은 문법적으로 잘못된 마크업(예: <div> Hello, <{name}>. </span>)이 생성되는 것을 방지하지 못하며, 불필요한 공백 문자(whitespace)를 남발해 대역폭을 낭비하고 페이지 렌더링에 악영향을 주기도 합니다. 저자는 이러한 결함을 해결하기 위한 대안으로 문법 구조를 정식 파싱하여 트리 형태로 다루는 AST(추상 구문 트리) 기반 템플릿 방식을 제시합니다.
Sponsored · 광고