왜 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

대략 이런 식으로 동작한다.

  1. 서버가 응답 헤더에서 “너 브라우저 정보 좀 정교하게 알려줄래?”라고 요청
  2. 브라우저는 필요한 정보만 선택적으로, 구조화된 형태로 넘김
  3. 굳이 위장 문자열을 해석하지 않아도 된다

장점은:

  • 브라우저가 굳이 “나는 Safari인 척하는 Chrome 기반 Edge야” 같은 삼중·사중 위장극을 펼칠 필요가 없다.
  • 서버는 필요한 정보만 요청해서 받으니, 개인 정보 노출도 줄어든다.
  • 문자열 파싱 대신 구조화된 데이터를 사용 → 코드도 단순해짐

즉, 브라우저가 정직해질 수 있도록 웹 표준이 다시 설계되고 있는 중이다.


6. 마무리 — 서버 로그 속 ‘이상한 한 줄’을 보는 새로운 시각

다시 처음의 그 한 줄을 보자.

Mozilla/5.0 ... Safari/537.36 ... Edg/101

이건 단순한 문자열 조합이 아니다.

  • 브라우저 전쟁과 패권 경쟁
  • 레거시 코드와의 타협
  • 시장 점유율을 둘러싼 위장과 전략
  • 그리고 표준이 뒤늦게 수습하고 있는 상황

이 모든 것이 압축된 작은 역사 기록이다.

그리고 웃긴 건,

이 역사적 폭풍의 잔해가 2025년에도, 서버 로그에서 매일같이 포착되고 있다는 것이다.

다음에 서버 로그를 보다가 Mozilla/5.0 ... Safari ... Edg/... 같은 이상한 조합을 만나면, “와, 또 하나의 화석이 지나갔군.” 하고 한 번쯤 미소 지어도 된다. 🙂

image