서버에서 완성된 HTML 조각을 내려보내자는 아이디어는 그럴듯했지만, 개발자들은 곧 현실의 벽에 부딪혔다. 그 벽의 이름은 PHP였다. 페이스북의 서버를 지탱하는 이 강력한 언어는, 아이러니하게도 HTML을 생성하는 데에는 끔찍하게 비효율적이고 위험했다.
한 젊은 개발자가 뉴스피드에 표시될 ‘댓글’ 영역의 PHP 코드를 수정하고 있었다. 그의 모니터에 떠 있는 코드는 그야말로 아수라장이었다.
function render_comment($comment) {
echo '<div class="comment-wrapper">';
echo '<img src="' . $comment['author_avatar_url'] . '">';
echo '<div class="comment-body">';
echo '<strong>' . $comment['author_name'] . '</strong>';
echo '<span>' . $comment['text'] . '</span>';
echo '</div>';
echo '</div>';
}
문자열과 변수를 이어 붙여 HTML을 조립하는 이 방식은 두 가지 치명적인 문제를 안고 있었다.
첫 번째는 문법 오류에 극도로 취약하다는 점이었다. 만약 개발자가 실수로 마지막 </div>
를 </div
로 잘못 입력했다고 가정해보자. PHP는 아무런 오류를 뱉어내지 않는다. 그저 깨진 문자열을 브라우저에 그대로 전송할 뿐이다. 브라우저는 망가진 설계도를 나름대로 해석하려 애쓰다가, 결국 뉴스피드 전체의 레이아웃을 엉망으로 만들어 버린다. 개발자는 원인을 찾기 위해 수백 줄의 코드 속에서 오타 하나를 찾아 헤매야 했다.
두 번째 문제는 훨씬 더 심각했다. 바로 보안이었다.
톰이 젊은 개발자의 어깨 너머로 코드를 보다가 미간을 찌푸렸다.
“이봐, 저기 author_name
하고 text
변수, 그냥 출력하면 안 돼. htmlspecialchars
함수로 감싸야지.”
만약 악의적인 사용자가 자신의 이름이나 댓글 내용에 <script>alert('해킹 성공!')</script>
같은 코드를 입력하면 어떻게 될까? htmlspecialchars
함수로 특수문자를 변환해주지 않으면, 저 스크립트는 다른 사용자들의 브라우저에서 그대로 실행된다. 개인정보가 탈취될 수도 있는, 크로스 사이트 스크리п팅(XSS)이라는 끔찍한 보안 재앙이 발생하는 것이다.
개발자는 식은땀을 흘리며 코드를 수정했다. 하지만 이건 근본적인 해결책이 아니었다. 수천, 수만 군데에 흩어져 있는 모든 출력 코드에 개발자가 일일이 보안 함수를 빼먹지 않고 적용하는 것은 사실상 불가능했다. 언제 터질지 모르는 시한폭탄을 안고 개발하는 것과 같았다.
“우리는 지금… HTML을 그저 거대한 문자열 덩어리로 취급하고 있어요.”
팀 회의에서 조던 워크가 조용히 문제를 제기했다.
“PHP가 HTML의 구조를 전혀 이해하지 못하기 때문에 생기는 문제입니다. 닫는 태그를 빼먹어도, 위험한 코드가 섞여 들어가도 PHP는 전혀 알지 못하죠.”
그가 말을 이었다.
“만약, PHP 언어 자체를 확장해서, PHP가 HTML을 단순한 문자열이 아니라 언어의 일부로 인식하게 만들면 어떨까요? 마치 if
나 for
처럼, <div>
나 <img>
같은 태그를 PHP의 기본 문법으로 만드는 겁니다.”
회의실에 있던 모두가 그의 말을 즉시 이해하지 못했다. PHP 코드 안에 HTML을 그대로 쓴다고? 그건 지금껏 누구도 시도하지 않은, 이단적인 발상이었다.
“그렇게 되면, 개발자가 </div>
를 빼먹는 순간 PHP가 즉시 ‘문법 오류’를 알려줄 겁니다. 컴파일 단계에서요. 그리고 사용자 입력을 출력할 때 자동으로 보안 처리를 해줄 수도 있겠죠. HTML의 구조를 아니까요.”
그의 아이디어는 혁명적이었다. HTML을 문자열 취급하는 것을 멈추고, 프로그래밍 언어의 엄격한 통제 아래 두겠다는 발상.
이 야심 찬 프로젝트는 ‘XHP’라는 이름으로 구체화되기 시작했다. PHP를 위한 XML(HTML) 확장.
그것은 단순히 서버에서 HTML을 쉽게 만들기 위한 도구가 아니었다. UI를 코드로 표현하는 방식에 대한 근본적인 철학의 전환을 의미했다. 그리고 이 철학은 머지않아 자바스크립트의 세계로 건너가, 웹 개발의 역사를 뒤바꿀 거대한 혁명의 씨앗이 될 터였다.