Chrome 의 User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36Mozilla 로 시작하고, Apple WebKit 이 있고, Chrome 이 있고, 마지막 에 Safari 가 또 나온다. 왜 Chrome 이 Mozilla / AppleWebKit / KHTML / Safari 의 이름을 다 끌고 다닐까? 이 가이드는 1990 년대 브라우저 전쟁부터 시작된 User-Agent 의 위장 역사, 어떻게 파싱 하는지, 그리고 Sec-CH-UA 가 왜 등장했는지 정리한다.
1993 년 — 모든 게 단순했을 때
Mosaic 브라우저의 User-Agent:
NCSA_Mosaic/2.0 (Windows 3.1)브라우저 이름 + 버전 + OS. RFC 1945 (HTTP/1.0) 표준 형식. 서버 가 어떤 클라이언트인지 알면 그에 맞춰 응답 — 합리적 설계.
1994 — Netscape 등장 + "Mozilla" 의 탄생
Netscape Navigator 가 1994 년 출시. 코드네임은 Mozilla (Mosaic Killer). User-Agent:
Mozilla/1.0 (Win3.1)Netscape 가 가장 먼저 frame · JavaScript 같은 새 기능 지원. 일부 웹사이트가 User-Agent 를 검사해 "Mozilla 면 새 기능 제공, 아니면 기본 HTML" 분기.
1995 — Internet Explorer 의 등장 + 위장 시작
Microsoft 가 IE 1.0 발표. 문제 — Netscape 만 지원하는 사이트가 IE 에 "이전 HTML" 만 줌. Microsoft 의 해결:
Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)
^^^^^^^ ^^^^^^^^^
첫 거짓말 실제 정체IE 의 User-Agent 가 "Mozilla 처럼 보이게" 시작. compatible ; 다음에 진짜 정체 (MSIE) 가 숨어 있음. 사이트 분기 로직 이 "Mozilla 면 OK" 만 보고 통과.
이 시점이 User-Agent string 의 신뢰가 무너진 첫 순간. 이후로 모든 새 브라우저가 같은 트릭 사용.
1998-2003 — Mozilla / Gecko 의 부활
Netscape 가 소스를 오픈소스로 풀어 Mozilla 재단 탄생. 새 렌더링 엔진 이름 Gecko. Firefox (당시 Phoenix → Firebird → Firefox) User-Agent:
Mozilla/5.0 (Windows NT 5.1; rv:1.7) Gecko/20040616 Firefox/0.9.12003 — Safari + KHTML 위장
Apple 이 Safari 발표. 렌더링 엔진은 KDE 의 KHTML 포크. KHTML 만 지원하는 일부 site 가 있어 Apple 도 위장:
Mozilla/5.0 (Macintosh; ...) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.7
^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^
Netscape Apple 엔진 "KHTML 처럼" 진짜
거짓말 이름 (Gecko 와 호환) 정체4 단계 위장:
- Mozilla → Netscape 호환 (1995 부터)
- AppleWebKit → Apple 의 엔진 (사실은 KHTML 포크)
- KHTML, like Gecko → "KHTML 지원 사이트 + Gecko 지원 사이트 둘 다 통과"
- Safari → 진짜 정체
2008 — Chrome + 위장 최종형
Google 이 Chrome 발표. 렌더링 엔진은 WebKit (Apple 의) 의 포크. User-Agent:
Mozilla/5.0 (Windows NT 6.0) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13
^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^^^^^^
Netscape Apple "KHTML / Gecko" Chrome Safari
(진짜) (Safari 사이트 통과용)5 단계 위장. 모든 거짓말이 누적. 이게 현재까지 표준 형식.
2013 — Edge 의 합류
Microsoft 가 IE 를 버리고 Edge 발표. 처음엔 EdgeHTML 엔진:
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0 Safari/537.36 Edge/15.02020 년 Edge 가 Chromium 으로 전환. 이제 거의 Chrome 과 동일:
...AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0Edge 의 정체는 끝의 Edg/ (Edge 가 아닌 Edg) 만.
모바일의 추가 카오스
iOS Safari:
Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1Android Chrome:
Mozilla/5.0 (Linux; Android 14; SM-S918N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36모바일 OS · 디바이스 모델 (SM-S918N = Galaxy S23 Ultra) · Mobile 키워드 추가. 더 길고 복잡.
User-Agent 파싱
UA string 을 regex 로 파싱하면 끝없는 edge case. 표준 라이브러리:
- ua-parser-js — 5000+ regex 패턴 DB. User-Agent 파서 가 같은 라이브러리
- useragent (Node) / woothee (Go) — 비슷한 패턴 DB
결과 — browser name / version / OS / device 4 가지 분류.
새 디바이스·새 브라우저 마다 DB 업데이트 필요 — UA parser 라이브러리는 자주 갱신.
왜 모두 거짓말 했나 — Sniffing 의 비극
사이트 개발자들이 User-Agent sniffing 을 통해 분기 처리:
if (userAgent.includes("Mozilla")) {
// 모던 기능 (JavaScript, frame 등)
} else {
// 기본 HTML
}새 브라우저가 등장할 때마다:
- 옛 사이트는 새 브라우저를 모름 → 기본 HTML
- 새 브라우저는 옛 브라우저 이름 위장 → 모던 기능 받음
- 위장이 표준화 → 더 새 브라우저도 같은 위장 채택
결과 — 30 년 누적 위장. 모든 브라우저가 Mozilla 인 척, Apple 인 척, Safari 인 척.
Feature detection 권장
Modern best practice — UA sniffing X, feature detection:
// Bad — UA 검사
if (navigator.userAgent.includes("Chrome")) { ... }
// Good — feature 자체 검사
if ("IntersectionObserver" in window) { ... }
if (CSS.supports("display", "grid")) { ... }예외 — 브라우저 별 버그 회피, 모바일 UI 적용, analytics. 이 경우 에도 UA 보다 더 정확한 정보 (Touch API, viewport, hover) 가 있을 수 있음.
Sec-CH-UA — Client Hints 의 미래
Google 이 2020 년 발표. User-Agent 의 privacy 와 정확성 문제 해결 시도:
- 기본 UA 를 generic 화 — version 일부 숨김 (privacy)
- server 가 요청 시에만 상세 정보 전달 — Client Hints HTTP header
// 클라이언트 → 서버 (요청)
Sec-CH-UA: "Chromium";v="120", "Google Chrome";v="120", "Not_A.Brand";v="8"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"
// 서버가 더 필요하면
Accept-CH: Sec-CH-UA-Full-Version-List, Sec-CH-UA-Model"Not_A.Brand" 는 GREASE pattern — 미래 호환성 위한 가짜 브랜드. 서버가 hardcode 못 하게 함.
Privacy budget — Client Hints 가 너무 많은 정보 요청하면 브라우저 가 거부. fingerprinting 방어.
흔한 함정
1. UA spoofing
UA 는 client 가 자유롭게 변경. 브라우저 dev tools 의 device emulation, curl 의 -A 옵션, bot 의 위장. 보안 결정 에 UA 만 신뢰 X — IP·rate limit·auth 결합.
2. iPad UA 의 카오스
iOS 13+ 부터 iPad 의 default UA 가 데스크탑 Safari 와 동일:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ...Apple 의 의도된 동작 — 데스크탑 사이트 보여주기. UA 로는 iPad 인지 Mac 인지 구분 불가. navigator.maxTouchPoints > 0 으로 touch 디바이스 감지.
3. 봇 UA 의 잘못된 차단
UA 에 "bot" 만 들어가면 차단 — 그러면 Googlebot 도 차단. 봇 차단은 IP 범위 (Googlebot 의 verifiable IP) + UA 패턴 결합.
4. UA 길이 폭주
모바일 UA 가 400+ 글자. log table 의 VARCHAR 256 cut off → 분석 불완전. log column 은 VARCHAR(512) 이상.
5. Sec-CH-UA 만 신뢰
Client Hints 가 점진 도입. Firefox · Safari 가 일부 미지원. UA + Client Hints 둘 다 fallback.
참고 자료
- History of the browser user-agent string — WebAIM
- Sec-CH-UA / User-Agent Client Hints — W3C draft
- ua-parser-js — GitHub
- RFC 7231 (HTTP/1.1 User-Agent) — datatracker
요약
- 1993 NCSA Mosaic 단순 시작 → 1995 IE 가 Mozilla 위장 시작 → 30 년 누적 위장.
- Chrome UA 는 Mozilla / AppleWebKit / KHTML / Safari 4 개 이름 위장 후 진짜 Chrome 박힘.
- 위장의 원인 = UA sniffing. 새 브라우저가 기존 분기 통과하려고 옛 이름 흉내.
- Modern best practice = feature detection, not UA sniffing.
- Sec-CH-UA (Client Hints) = privacy + 정확성. 점진 도입 중.
- UA 는 client 자유 변경 가능 — 보안 결정에 단독 신뢰 X.
- 파싱 — User-Agent 파서 가 ua-parser-js 로 4 분류 (browser / engine / OS / device).