TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 25 READS

서보 0.4.0, 실사용 호환성과 러스트 타입 안전성으로 승부한다

서보 0.4.0, 실사용 호환성과 러스트 타입 안전성으로 승부한다
SOURCE IMAGE · HACKER NEWS

러스트로 작성된 웹 엔진 서보(Servo)가 6월 한 달 동안 558건의 커밋을 반영한 0.4.0을 내놓았다. 4월 534건, 5월 391건에 이은 또 한 번의 최고 기록이다. 2023년 9월 프로젝트가 재개된 초기와 비교하면 매달 검토해야 할 변경량이 네 배 이상으로 늘었다. 이 정도 규모가 되면 각 변경이 누구에게 영향을 주는지, 관찰 가능한 차이가 무엇인지, 기본값으로 켜지는지 아니면 프리퍼런스가 필요한지를 커밋만 읽어서는 파악하기 어렵다. 그래서 이번 업데이트부터는 Highfive 봇을 통해 기여자가 자신의 PR에 'monthly update' 라벨을 붙이거나 코멘트를 남기면 봇이 질문을 던지고 답을 받아 정리하는 절차를 도입했다. 방대해지는 오픈소스 프로젝트가 변경 이력을 사람이 읽을 수 있는 형태로 유지하기 위한 실무적 고민이 엿보이는 대목이다.

보안 갱신과 상수 시간 암호 연산

보안 측면에서는 자바스크립트 엔진 스파이더몽키를 140.10.1에서 140.11.0으로, 다시 140.12.0으로 올리며 다수의 취약점을 정리했다. 앞선 갱신은 CVE-2026-8388, 8391, 8974, 8975와 MFSA 2026-48에 대응하며, 뒤이은 갱신은 아직 해당 CVE 번호가 확정되지 않았으나 MFSA 2026-58과 연관된다. SubtleCrypto의 RSA 연산은 이제 모듈러 거듭제곱을 상수 시간으로 수행하도록 바뀌었다. 다만 서보의 RSA 구현은 여전히 Marvin 공격에 취약하다는 점(RUSTSEC-2023-0071)이 함께 명시됐다는 사실은 유의할 필요가 있다. ML-DSA의 Decompose 단계도 상수 시간으로 처리해 RUSTSEC-2025-0144를 해결했고, 파일명에 가 포함될 때 file:/// 디렉터리 목록에서 발생하던 HTML 인젝션(XSS)도 막았다. 타이밍 공격과 인젝션 같은 기초적이면서도 실제 위협이 되는 지점을 정면으로 다뤘다는 점에서 방어적 관점의 성숙함이 읽힌다.

실제 웹사이트에서의 렌더링 개선

이번 릴리스가 눈에 띄는 이유 중 하나는 실사용 호환성이다. 가변 폰트 처리가 개선되면서 lichess.org의 레이아웃 정확도가 크게 나아졌고, Zulip 채팅과 Speedtest 같은 사이트의 가독성이 향상됐다. 구글 포토와 Cash Converters처럼 이전부터 동작하던 사이트는 계속 잘 열리며, 구글 지도와 OpenStreetMap은 렌더링 자체는 괜찮지만 상호작용에서 문제가 남아 있다. 즉 정적인 표시는 상당 수준에 올라섰으나 복잡한 인터랙션은 아직 과제로 남았다는 뜻이다. 이 지점을 메우기 위해 서보 팀은 오랫동안 기다려온 기능인 눈에 보이고 조작 가능한 텍스트 선택 구현에 착수했고, Web Animations(dom_web_animations_enabled), File 객체의 webkitRelativePath, 어디서나 쓸 수 있는 강화된 attr() 함수 등을 각각 프리퍼런스 뒤에서 실험적으로 진행 중이다.

임베더 입장에서 주목할 변화는 C API 래퍼 설계의 시작이다. 러스트는 안정적인 ABI가 없어 지금까지 서보를 다른 애플리케이션에 심으려면 소스에서 직접 빌드해야 했다. 팀은 안정적이고 보편적인 C ABI를 통해 서보를 미리 빌드된 공유 라이브러리로 사용할 수 있게 하는 래퍼 C API를 설계하기 시작했고, 궁극적으로는 그 위에 다시 러스트 래퍼를 얹어 러스트의 편의성과 C의 빌드 단순함을 동시에 제공하는 것을 목표로 한다. 이는 서보를 실제 제품에 통합하려는 개발자에게 진입 장벽을 크게 낮출 수 있는 방향으로, 엔진의 활용 범위를 넓히는 장기 포석에 해당한다.

러스트 타입 시스템으로 GC 패닉 잡기

엔진 내부에서 가장 흥미로운 작업은 가비지 컬렉션과 관련된 패닉 버그를 타입 시스템으로 근본적으로 없애려는 시도다. 서보는 DOM 타입을 다른 DOM 타입 안에 저장할 때 RefCell 기반 메커니즘으로 러스트의 '별칭 배타적 가변성' 규칙을 런타임에 강제하는데, GC가 일어날 때 각 DomRefCell을 borrow해 참조를 추적하는 과정이 다수 패닉의 원인이었다. 기존에는 GC가 발생할 수 있는 코드 경로를 표시하는 CanGc 마커와 커스텀 정적 분석을 썼지만, 이번에는 발상을 뒤집어 borrow_mut() 호출이 GC가 발생하지 않음을 NoGC 마커로 증명하도록 요구한다. NoGC는 GC를 막는 &JSContext에서만 빌려올 수 있고 GC를 허용하는 &mut JSContext에서는 얻을 수 없어, 별도의 정적 분석 없이 러스트 참조 규칙만으로 안전성을 보장한다. 대규모 코드베이스를 점진적으로 옮겨야 하므로 우선 safe_borrow_mut() 메서드를 도입했다.

이 접근은 안전성뿐 아니라 성능에도 이득을 준다. GC가 불가능함을 증명할 수 있는 구간에서는 자바스크립트 객체를 루팅하지 않아도 되어, 레이아웃 처리와 HTMLCollection에서 오버헤드가 1% 이상 줄었다. 이 밖에도 BoxFragment 구조체가 amd64 기준 288바이트에서 240바이트로 17% 작아졌고, 리로드와 2D 캔버스의 메모리 누수를 잡았으며, 2D 캔버스 전력 소비가 최대 23% 감소했다. 이미지 디코딩과 캐시 채우기를 모두 비동기로 처리해 스크립트 스레드에 여유를 준 점도 실사용 반응성에 직접 영향을 줄 만한 변화다. 안전성을 확보하려는 타입 수준의 규율이 곧 성능 최적화의 발판이 된다는 사실을 보여주는 좋은 사례다.

데스크톱과 도구 측면의 변화도 실무자에게 유용하다. 파일 드래그 앤 드롭으로 열기, 탭이 많을 때 탭 바 가로 스크롤, 창이 이동한 모니터에서 전체 화면 진입 등이 추가됐고 UI 반응성이 개선됐다. 로케이션 바에서 localhost:가 이제 http://로 해석되며, 콘솔·디버거 탭에서는 중첩 배열과 Map 객체를 들여다볼 수 있게 됐다. 안드로이드 버전은 Compose UI와 코틀린으로 현대화되면서 안드로이드 13 이상을 요구하게 됐다. mach test-wpt --update-expectations로 웹 플랫폼 테스트 실행과 기대값 갱신을 한 명령으로 처리할 수 있게 된 점도 기여 워크플로를 단순화한다. 다만 텍스트 선택, 웹 애니메이션, 접근성, WebGPU 등 핵심 기능 상당수가 여전히 프리퍼런스 뒤의 실험 단계라는 점은, 서보가 빠르게 전진하고 있으나 범용 브라우저 엔진으로서의 완성까지는 아직 거리가 있음을 분명히 한다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://servo.org/blog/2026/07/31/june-in-servo/
SHARE
처리 중...