왜 Edge는 User-Agent에 “Safari”를 넣을까?
20년 전 브라우저 전쟁이 남긴 기괴한 유산
서버 로그를 까보다가 이런 문자열을 본 적 있을 것이다.
Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/101.0.4951.64
Safari/537.36
Edg/101.0.1210.47
“Edge인데 Safari?” “Chrome인데 Mozilla?”
브라우저 하나가 어떻게 네 개 브라우저인 척을 동시에 하고 있는 걸까?
이건 단순한 문자열 장난이 아니라, 웹 역사상 가장 격렬했던 브라우저 전쟁의 화석이다. 그리고 그 전쟁의 여파가 2025년에도 서버 로그에 찍히고 있는 중이다.
이 글에서 우리가 볼 것:
- 왜 모든 브라우저가 아직도
Mozilla/5.0으로 시작하는지 - 왜 Chromium 기반 Edge가 굳이
Safari를 끌어안고 사는지 - 그리고 이 난장판이 결국 표준에 의해 폐기되는 과정까지
1. 모든 것은 Netscape vs IE 전쟁에서 시작됐다
1990년대 후반, 브라우저 시장은 사실상 두 플레이어였다.
- Netscape Navigator
- Internet Explorer
당시 Netscape의 User-Agent는 이렇게 생겼다.
Mozilla/4.0 (compatible; ...)
여기서 문제가 시작된다.
웹 개발자들이 이렇게 생각해 버린 것이다.
“Mozilla(=Netscape) 브라우저면 최신 기능 써도 되겠네. 나머지는 구버전용 코드나 보여주자.”
즉, 브라우저 기능 분기 = User-Agent 문자열 검사가 되어 버렸다.
// 1990년대(?)식 의사 코드
if (ua.includes("Mozilla")) {
// Netscape / 모던 브라우저용 “멋진” 기능
} else {
// 구린 버전
}
그러자 다른 브라우저들이 열받았다.
“우리도 Netscape급인데, 왜 차별을 받아야 하냐?”
그래서 모두가 UA 맨 앞에 Mozilla를 붙이기 시작한다. 이때의 Mozilla는 사실상:
“나 Netscape급이에요. 저급 취급하지 마세요.”
라는 뜻에 가까운 호환성 마크였다.
“Mozilla” 이름의 기원: Godzilla 패러디
- “Mosaic + Godzilla” → “Mozilla”라는 말이 많이 알려져 있고
- 정서적으로는 “괴수 고질라처럼 강력한 브라우저”라는 패러디 느낌
하지만 실질적으로는 그냥:
“Netscape 계열, 혹은 Netscape만큼 쓸 만한 브라우저”
라는 마케팅적·역사적 라벨에 가깝다.
그 결과, 오늘날까지도 거의 모든 브라우저가 이렇게 UA를 시작한다.
Mozilla/5.0 (Windows NT 10.0; Win64; x64; ...)
브라우저가 Mozilla라서가 아니라, “나도 Netscape급이니까 구식 취급하지 마라”라는 역사적 이유 때문에.
2. WebKit, Gecko, Trident… 엔진 전쟁으로 또 난장판
2000년대 초반, 브라우저 엔진 구도가 이렇게 갈린다.
- IE → Trident
- Firefox → Gecko
- Safari → WebKit
웹 개발자들은 또다시 UA 문자열을 활용해서 브라우저를 나눠 버린다.
const ua = navigator.userAgent;
if (ua.includes("Safari")) {
// Safari / WebKit용 코드
}
if (ua.includes("Gecko")) {
// Firefox용 코드
}
if (ua.includes("Trident")) {
// IE 전용 코드 (눈물...)
}
여기까지만 해도 이미 좋지 않은 패턴이다. 브라우저 엔진 이름과 브랜드 이름이 섞이면서 분기 로직이 점점 복잡해진다.
Chrome 등장 → “너 누구냐?” 사태
Chrome이 처음 등장했을 때 문제는 단순했다.
웹사이트들이 Chrome을 모르니까 UA 검사에서 Safari 코드 흐름으로 보내 버린 것.
그래서 Chrome이 선택한 전략은:
“그럼 그냥 Safari인 척 하자.”
최종적으로 Chrome은 이렇게 자기소개를 하게 된다.
Mozilla/5.0 (...)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/xx.xx.xx
Safari/537.36
이 문자열의 실제 의미는 대략 이렇다.
Mozilla/5.0→ “나도 Netscape급 브라우저야”AppleWebKit/537.36→ “렌더링 엔진은 WebKit 계열이야”(KHTML, like Gecko)→ “Gecko(파이어폭스)와 비슷하게 돌아갈 수 있어”Safari/537.36→ “Safari처럼 보여야 호환성이 보장돼”Chrome/xx→ “실제 브라우저는 Chrome입니다”
즉,
“난 Mozilla도 되고, WebKit도 되고, Gecko처럼도 동작 가능하고, Safari처럼 보여줘야 사이트가 안 깨지고, 실제 정체성은 Chrome이야.”
라는 4중 위장 브라우저가 탄생해 버린 것이다.
3. Edge의 등장: 정체성과 생존 사이의 타협
이제 Microsoft의 차례다. 처음 Edge는 독자 엔진(EdgeHTML)을 쓰다가, 결국 Chromium 기반 Edge로 갈아탄다.
이때 Microsoft가 가장 잘 알고 있던 사실:
“웹사이트 코드에는 ‘User-Agent 기반 분기’가 이미 수십만 군데 박혀 있다.”
만약 Edge가 이런 식으로 나간다면?
User-Agent: Edge/101.0.0.0
그러면 현실에서 벌어질 일:
- 수많은 웹사이트에서 브라우저를 알아보지 못함
if (ua.includes("Chrome"))같은 레거시 분기에 안 걸림- “지원하지 않는 브라우저입니다” 같은 얼탱이 없는 화면 등장
- 기능 제한, 깨진 레이아웃, 이상한 폴리필…
즉, 기술적으로는 정직하지만 호환성 지옥에 빠진다.
그래서 나온 Edge의 전략
“정체성은 Edge지만, 겉모습은 Chrome + Safari 계열로 보여야 한다.”
그래서 우리가 보는 UA는 이렇게 생겼다.
Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/101.0.4951.64
Safari/537.36
Edg/101.0.1210.47
해석하면:
Mozilla→ “나도 모던 브라우저”AppleWebKit→ “WebKit 계열처럼 렌더링할게”Chrome→ “나 크로미움 기반이야”Safari→ “Safari처럼도 보일 수 있어, 그러니 날 막지 마”Edg→ “근데 브랜드는 Edge야”
즉, 이 긴 문자열은 Edge의 자아 소개가 아니라, “웹의 레거시 코드와 타협하기 위해 만들어진, 생존형 위장 카드”에 가깝다.
4. User-Agent 문자열 해석 챕터: 이 한 줄에 담긴 30년의 역사
정리해보자. 아까 봤던 UA에서 주요 토큰들을 떼어내면:
| 문자열 | 실제 의미 (의역) |
|---|---|
Mozilla/5.0 |
“나 Netscape급 모던 브라우저야. 구식 취급 금지.” |
AppleWebKit/537.36 |
“Safari처럼 렌더링하는 WebKit 계열입니다.” |
KHTML, like Gecko |
“Gecko(Firefox)와 유사하게 동작 가능합니다.” |
Safari/537.36 |
“진짜 Safari는 아니지만, Safari처럼 보여야 합니다.” |
Chrome/101.0... |
“엔진은 Chromium(Chrome) 기반입니다.” |
Edg/101.0... |
“브랜드·정체성은 Edge입니다. 나머지는 생계형 위장입니다.” |
단 한 줄의 문자열에:
- Netscape vs IE 브라우저 전쟁
- Gecko vs WebKit vs Trident 엔진 전쟁
- Chrome의 시장 장악 과정
- Edge의 생존 전략과 현실 타협
까지, 30년 가까운 브라우저사의 층위가 다 겹쳐져 있는 것이다.
5. 그리고 이제 User-Agent는 ‘역사적인 쓰레기 더미’가 되어간다
문제는, 이 User-Agent 시스템이 오늘날 기준에서는 거의 망가진 설계라는 점이다.
- 브라우저들이 서로를 흉내 내며 위장 → 신뢰도 0
- 과거 레거시 코드와의 타협 때문에 문자열이 계속 비대해짐
- 디바이스/OS 정보가 과하게 노출 → 개인 정보 이슈
- UA 파싱으로 브라우저/기능을 정확히 판단하기가 사실상 불가능
그래서 W3C와 브라우저 벤더들은 UA 문자열을 서서히 폐기하고, User-Agent Client Hints라는 새로운 방식으로 옮겨가고 있다.
Client Hints: “이제는 정직하게 말하자”
앞으로는 이런 헤더들이 주인공이 된다.
Sec-CH-UA
Sec-CH-UA-Platform
Sec-CH-UA-Mobile
대략 이런 식으로 동작한다.
- 서버가 응답 헤더에서 “너 브라우저 정보 좀 정교하게 알려줄래?”라고 요청
- 브라우저는 필요한 정보만 선택적으로, 구조화된 형태로 넘김
- 굳이 위장 문자열을 해석하지 않아도 된다
장점은:
- 브라우저가 굳이 “나는 Safari인 척하는 Chrome 기반 Edge야” 같은 삼중·사중 위장극을 펼칠 필요가 없다.
- 서버는 필요한 정보만 요청해서 받으니, 개인 정보 노출도 줄어든다.
- 문자열 파싱 대신 구조화된 데이터를 사용 → 코드도 단순해짐
즉, 브라우저가 정직해질 수 있도록 웹 표준이 다시 설계되고 있는 중이다.
6. 마무리 — 서버 로그 속 ‘이상한 한 줄’을 보는 새로운 시각
다시 처음의 그 한 줄을 보자.
Mozilla/5.0 ... Safari/537.36 ... Edg/101
이건 단순한 문자열 조합이 아니다.
- 브라우저 전쟁과 패권 경쟁
- 레거시 코드와의 타협
- 시장 점유율을 둘러싼 위장과 전략
- 그리고 표준이 뒤늦게 수습하고 있는 상황
이 모든 것이 압축된 작은 역사 기록이다.
그리고 웃긴 건,
이 역사적 폭풍의 잔해가 2025년에도, 서버 로그에서 매일같이 포착되고 있다는 것이다.
다음에 서버 로그를 보다가
Mozilla/5.0 ... Safari ... Edg/... 같은 이상한 조합을 만나면,
“와, 또 하나의 화석이 지나갔군.” 하고 한 번쯤 미소 지어도 된다. 🙂

댓글이 없습니다.