← 모두의 툴

크롬도 왜 AppleWebKit/537.36을 달고 다니나 — UA 문자열의 역사적 유물

가이드 · 2026.08.24 최종 확인

크롬 개발자 도구 콘솔에서 navigator.userAgent를 찍어보면 이렇게 나옵니다: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36. 이상하지 않나요. 크롬은 넷스케이프도 애플도 아닌데 왜 문자열 앞뒤로 "Mozilla"와 "AppleWebKit"이 붙어 있을까요. 이건 버그가 아니라 20년 넘게 쌓인 웹의 호환성 관행이 그대로 굳어버린 결과입니다.

1. Mozilla/5.0: 넷스케이프를 향한 오래된 흉내

1990년대 브라우저 전쟁 시절, 웹사이트들은 종종 UA 문자열에 "Mozilla"가 있는지만 보고 "이건 제대로 된 최신 브라우저다"라고 판단해 고급 기능(프레임, 자바스크립트 등)을 내려줬습니다. 마이크로소프트는 인터넷 익스플로러가 이런 사이트에서 차별받지 않도록 IE의 UA에도 "Mozilla/4.0 (compatible; MSIE ...)"를 넣기 시작했습니다. 이후 등장한 거의 모든 브라우저(사파리, 크롬, 파이어폭스까지)가 같은 이유로 "Mozilla/5.0"을 UA 맨 앞에 유지하고 있습니다. 넷스케이프 자체는 오래전에 사라졌지만, "Mozilla와 호환된다"는 신호는 관행으로 남아버린 것입니다.

2. AppleWebKit/537.36: 왜 버전이 안 올라가고 멈춰 있나

사파리는 WebKit 엔진을 쓰고, 크롬도 초기에는 WebKit 기반이었다가 이후 Blink로 갈라져 나왔습니다(Blink는 WebKit의 포크입니다). 문제는 수많은 웹사이트가 "AppleWebKit이 UA에 있으면 이 브라우저는 WebKit 계열이니 호환된다"고 판단하는 코드를 짜놨다는 점입니다. 만약 크롬이 실제 렌더링 엔진 버전을 UA에 그대로 반영해 계속 올렸다면, "AppleWebKit/537.36"만 체크하는 낡은 호환성 코드들이 크롬을 인식하지 못해 깨질 위험이 있었습니다. 그래서 크롬(과 다른 Blink/WebKit 기반 브라우저 대부분)은 이 토큰을 537.36에 고정한 채 더 이상 올리지 않는 관행을 오래전부터 유지하고 있습니다. 실제 최신 엔진 버전 정보는 UA 뒤쪽의 Chrome/128.0.0.0 같은 별도 토큰에 담겨 있습니다.

정리: UA 문자열 안의 각 토큰은 "지금 이 브라우저가 실제로 무엇인가"가 아니라 "과거 어느 시점에 이렇게 하면 사이트들이 안 깨지더라"라는 호환성 타협의 흔적입니다. Mozilla/5.0, AppleWebKit/537.36, KHTML(like Gecko) 모두 실제로는 해당 엔진이 아니면서 이름만 남아있는 레거시 토큰입니다.

3. 실제 UA 문자열 해부

토큰실제 의미왜 남아있나
Mozilla/5.0거의 무의미(넷스케이프 아님)1990년대 "Mozilla=고급 브라우저" 판별 관행 잔재
AppleWebKit/537.36WebKit 계열임을 암시(정확한 최신 버전 아님)537.36 체크 사이트 호환성 유지를 위해 값 고정
(KHTML, like Gecko)WebKit이 KDE의 KHTML에서 파생됐다는 계보 표시Gecko(파이어폭스) 대상 호환성 체크 통과용
Chrome/128.0.0.0실제 크로미움 엔진 버전이 부분만 실제로 매 릴리스마다 갱신됨
Safari/537.36사파리 호환 신호(사파리 아님)Safari 체크하는 사이트를 위한 관행

4. UA 파서는 이 레거시 토큰을 어떻게 걸러내는가

User-Agent 파서의 실제 브라우저 판별 로직은 이 문제를 정면으로 다룹니다. 코드를 보면 엔진을 판정할 때 AppleWebKit/([0-9.]+) 패턴이 있으면 일단 engine = 'WebKit ' + 버전으로 잡아두고, 그 다음에 Chrome/ 토큰이 UA 안에 있는지 다시 검사해서 있으면 engine'Blink'로 덮어씁니다. 즉 "AppleWebKit이 있다"는 사실 하나만으로는 실제 엔진을 판별할 수 없고, 그 뒤에 다른 어떤 브랜드 토큰이 함께 오는지까지 봐야 정확한 엔진(WebKit vs Blink)을 구분할 수 있다는 뜻입니다. 브라우저 이름도 마찬가지로, 여러 패턴을 우선순위 배열로 두고 Edg/OPR/SamsungBrowser/ → ... → Chrome/ 순서로 먼저 매칭되는 것을 채택하는 방식으로 처리합니다 — Edge와 Opera도 크로미움 기반이라 UA에 "Chrome/"이 함께 들어있기 때문에, 더 구체적인 토큰을 먼저 검사해야 오판을 피할 수 있습니다.

5. UA 문자열을 신뢰해서는 안 되는 이유

이런 역사적 누더기 구조 때문에라도 UA는 클라이언트를 확정적으로 식별하는 근거로 쓰기 부적합합니다. 게다가 UA는 개발자 도구나 확장 프로그램으로 얼마든지 임의 변경(스푸핑)할 수 있는 값입니다. 여기에 더해 Chrome 107+부터는 Privacy Sandbox 정책(User-Agent Reduction)으로 마이너 버전·OS 세부 버전 등의 정보가 UA에서 아예 동결되었고, 상세 정보가 필요하면 User-Agent Client Hints API(navigator.userAgentData)로 필요한 만큼만 요청하는 방식으로 옮겨가는 중입니다. 통계나 UI 분기 참고용으로는 UA 파싱이 여전히 유용하지만, 보안이나 접근 제어 판단에 쓰면 안 되는 이유가 바로 이 구조 전체에 있습니다.

자주 묻는 질문

Q. 파이어폭스도 UA에 "Mozilla"가 들어가는데 유일하게 진짜 아닌가요?

파이어폭스는 실제로 Mozilla 재단이 만든 브라우저지만, UA 문자열 형식 자체("Mozilla/5.0 (...) Gecko/... Firefox/...")는 다른 브라우저와 마찬가지로 호환성 관행을 따른 것이지 "진짜 넷스케이프 계열"이라서 붙는 게 아닙니다. 버전 번호 5.0도 실제 파이어폭스 버전과 무관한 고정값입니다.

Q. AppleWebKit 버전이 정말 537.36에서 멈춘 건가요?

네, 크롬·엣지·오페라 등 대부분의 Blink/최신 WebKit 기반 브라우저가 오래전부터 이 값을 537.36으로 고정해서 내보내고 있습니다. 실제 렌더링 엔진의 최신 변경 사항은 이 숫자에 반영되지 않고, Chrome/xxx 같은 별도 토큰으로만 확인할 수 있습니다.

Q. 봇 UA는 어떻게 다르게 생겼나요?

Googlebot, Bingbot 등 검색엔진 크롤러는 대체로 자신을 숨기지 않고 UA에 bot·crawler·spider 같은 키워드와 함께 정체를 명시합니다(예: Googlebot/2.1). 다만 일부 악성 봇은 탐지를 피하려고 일반 브라우저 UA를 그대로 흉내내기도 합니다.

Q. User-Agent Client Hints는 이 문제를 완전히 해결하나요?

부분적으로입니다. Client Hints는 필요한 정보만 명시적으로 요청하는 구조라 UA 문자열을 파싱해 추측하는 것보다 신뢰도는 높지만, 아직 모든 브라우저·서버 환경에서 완전히 대체된 것은 아니라 당분간 UA 문자열 파싱과 병행해서 쓰이는 과도기입니다.