회의실의 공기는 무겁게 가라앉아 있었다. ‘보안’이라는 거대한 장벽 앞에서 프로젝트의 존폐가 거론되는 상황. 블라디미르와 뜻을 같이하는 엔지니어들은 이 위기를 돌파할 논리를 필사적으로 모색했다.
해답은 의외로 그들이 가장 잘 아는 곳에 있었다. 그들은 문제의 관점을 완전히 뒤집었다.
문제는 ‘드라이버를 어떻게 믿을 것인가’가 아니었다. ‘드라이버를 믿지 않는 상태에서 어떻게 안전을 확보할 것인가’였다.
그들이 내놓은 해답의 핵심은 바로 웹 브라우저의 가장 근본적인 보안 모델, ‘샌드박스(Sandbox)’를 극한까지 강화하고 확장하는 것이었다.
“우리가 제안하는 것은 단순한 API가 아닙니다. 강력한 보안 아키텍처입니다.”
구글 크롬팀의 엔지니어가 화이트보드 앞에 나섰다. 그의 설명은 명쾌했다.
첫 번째 방어선은 ‘커맨드 버퍼(Command Buffer)’였다.
“자바스크립트가 직접 드라이버의 함수를 호출하는 것이 아닙니다. 대신, 브라우저가 관리하는 특별한 메모리 공간, 즉 ‘커맨드 버퍼’에 ‘이런이런 작업을 해달라’는 요청 목록을 차곡차곡 쌓아두는 방식입니다.”
즉, WebGL 코드는 GPU에 직접 편지를 보낼 수 없다. 대신 브라우저라는 우체국에 편지를 접수해야 한다. 그러면 브라우저는 그 편지의 모든 내용을 한 글자 한 글자 검열한다. 주소는 올바른지, 위험한 단어는 없는지, 약속된 양식을 지켰는지. 이 검열을 통과한 안전한 편지만이 비로소 드라이버에게 전달된다. 이 구조만으로도 수많은 종류의 비정상적인 입력 공격을 원천 차단할 수 있었다.
하지만 애플의 보안 아키텍트는 여전히 날카로웠다.
“훌륭한 1차 방어선입니다. 하지만 만약 우리가 예측하지 못한, 교묘하게 위조된 ‘안전해 보이는’ 명령이 검열을 통과해 드라이버의 치명적인 버그를 건드린다면 어떻게 하죠? 결국 시스템은 다운될 겁니다.”
그것은 누구도 부정할 수 없는, 정곡을 찌르는 지적이었다.
바로 그때, 크롬팀 엔지니어의 입에서 결정적인 개념이 흘러나왔다.
두 번째, 그리고 가장 강력한 방어선. ‘프로세스 분리(Process Separation)’ 아키텍처였다.
“맞습니다. 최악의 경우, 드라이버는 다운될 수 있습니다. 우리는 그것을 막을 수 없을지도 모릅니다. 하지만, 우리는 그 충격을 격리할 수 있습니다.”
그의 설명은 회의실의 모든 엔지니어들을 집중시켰다.
현대의 브라우저는 더 이상 하나의 거대한 프로그램 덩어리가 아니었다. 탭, 확장 프로그램, 그리고 렌더링 엔진 등 각 기능이 별도의 독립적인 ‘프로세스’로 나뉘어 동작했다.
“우리는 WebGL을 위한 전혀 다른 프로세스를 하나 더 만들 겁니다. 바로 ‘GPU 프로세스’입니다.”
GPU 프로세스는 오직 하나의 임무만을 수행한다. 브라우저의 메인 프로세스로부터 검증된 커맨드 버퍼를 전달받아, 위험한 그래픽 드라이버와 직접 통신하는 역할이다.
이제 최악의 시나리오를 다시 상상해보자.
악성 코드가 모든 방어선을 뚫고 드라이버를 다운시켰다. 어떤 일이 벌어질까?
시스템 전체가 멈추는 것이 아니다. 오직, 드라이버와 통신하던 ‘GPU 프로세스’ 하나만 죽는다.
브라우저의 메인 프로세스는 이 죽음을 즉시 감지한다. 그리고 사용자에게는 ‘WebGL 컨텍스트를 잃었습니다’라는 메시지를 보여주거나, 해당 탭의 캔버스 영역만 하얗게 표시한다. 사용자의 다른 탭, 비밀번호, 중요한 작업들은 아무런 영향을 받지 않는다. 심지어 브라우저는 죽어버린 GPU 프로세스를 조용히 재시작하여 서비스를 복구할 수도 있다.
마치 선박의 격벽과도 같았다. 배의 한 구역에 물이 차더라도, 격벽이 나머지 구역으로 물이 퍼지는 것을 막아 배 전체가 침몰하는 것을 막는 것이다.
설명이 끝나자, 회의실을 지배하던 무거운 침묵이 깨졌다.
가장 완고했던 애플의 보안 아키텍트의 눈빛이 흔들렸다. 그는 완벽한 방패를 원했지만, 그 대신 피해를 완벽하게 제어하고 격리하는 훨씬 더 현실적이고 우아한 해결책을 본 것이다.
이것은 패러다임의 전환이었다. WebGL은 더 이상 드라이버의 선의에 의존하는 기술이 아니었다. 드라이버의 배신을 전제로 설계된, 철저한 불신 위에 세워진 강력한 보안 구조물이었다.
“...좋습니다.”
마침내 그가 입을 열었다. “그 아키텍처라면, 논의를 계속해 볼 가치가 있겠습니다.”
그 한마디에, 프로젝트를 위협하던 가장 거대한 장벽에 마침내 균열이 생겼다. 보안은 더 이상 WebGL의 발목을 잡는 족쇄가 아니었다. 그것은 WebGL이라는 집을 짓는 가장 단단한 주춧돌이자, 그 자체로 핵심적인 아키텍처가 되었다. 길고 길었던 논쟁이 끝나고, WebGL은 다시 앞으로 나아갈 동력을 얻었다.