당신의 사이트가 Chrome에서 작동합니다. 축하합니다, 사용자 15%를 소외시켰습니다.
Source: Dev.to
당신의 테스트 워크플로우를 추측해 보자
- VS Code에서 코드 작성
- Chrome DevTools 열기
- 동작 여부 확인
- 배포
당신은 방금 Firefox를 깨뜨렸습니다.
그리고 Safari도요. 아마도 더 엄격한 프라이버시 설정을 가진 일부 Chromium 기반 브라우저도요.
“Chrome이 시장 점유율 65%를 차지한다!” 라고 말하겠지만,
멋지군요. 그렇다면 35%의 사용자가 깨진 경험을 하게 되는 것이 괜찮은가요? 그건 약 15억 명에 해당합니다.
현재 브라우저 테스트 현황
최근 트위터에서 비공식 설문을 진행했습니다:
“배포 전에 몇 개의 브라우저를 테스트하시나요?”
결과 (783표):
- Chrome만: 47%
- Chrome + Firefox: 28%
- Chrome + Firefox + Safari: 19%
- 모든 주요 브라우저: 6%
거의 절반에 달하는 개발자가 Chrome에서만 테스트한 코드를 배포하고 있습니다.
“하지만 Chrome이 표준이다”
아닙니다. Chrome은 지배적일 뿐, 표준은 아닙니다.
표준은 W3C 사양과 WHATWG 살아있는 표준입니다.
Chrome이 단지 가지고 있는 것은:
- ✅ 가장 큰 엔지니어링 팀 (Google)
- ✅ 가장 공격적인 기능 배포
- ✅ 가장 큰 개발자 관계
하지만 “가장 인기 있다”는 “가장 올바르다”와는 다릅니다.
예시: -webkit- 접두사 시대
/* CSS */
.box {
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}
왜? WebKit(Safari/Chrome)이 표준화되기 전에 기능을 먼저 제공했기 때문입니다. 개발자들은 Chrome/Safari에서만 테스트했으므로, 다른 브라우저들은 WebKit인 척 해야 했습니다. Mozilla는 많은 사이트가 Firefox에서 깨지는 것을 방지하기 위해 -webkit- 접두사 지원을 추가했습니다. 이것이 하나의 엔진이 지배할 때 일어나는 일입니다.
Firefox가 무시되는 이유 (그리고 왜 위험한가)
이유 #1: 개발자들이 Chrome을 사용한다
악순환
- 개발자들은 개인 브라우징에 Chrome을 사용한다
- 개발자들은 Chrome에서만 테스트한다
- 사이트가 Firefox에서 깨진다
- 사용자는 Chrome으로 전환한다
- 시장 점유율이 떨어진다
- 개발자는 Firefox 무시를 정당화한다
개발자 사이에서 Firefox 사용률은 ~10 %, 일반 사용자 사이에서는 **~3 %**입니다.
번역: 우리는 사용자가 쓰는 브라우저가 아니라, 우리가 쓰는 브라우저에서 테스트하고 있습니다.
이유 #2: Chrome DevTools가 더 좋다
Chrome DevTools는 대규모 엔지니어링 팀 덕분에 더 다듬어졌습니다.
Chrome이 제공하는 것:
- 더 나은 성능 프로파일러
- 내장된 Lighthouse
- 더 많은 확장 프로그램
Firefox가 제공하는 것:
- 뛰어난 CSS Grid 인스펙터 (정말 놀랍습니다)
- 컨테이너 쿼리 디버깅
- 프라이버시 중심 네트워크 도구
Google은 DevTools에 100명 이상의 엔지니어를 투입하고, Mozilla는 약 20명 정도입니다.
이유 #3: “Chrome에서 동작하면 어디서든 동작한다”
거짓. Firefox에서만 발생하는 실제 버그들:
버그 #1: flex-basis: 0 렌더링
/* CSS */
.container {
display: flex;
}
.item {
flex: 1 1 0; /* Chrome에서는 동작 */
flex: 1 1 0%; /* Firefox에서는 필요 */
}
Chrome은 단위 없이 0을 허용하지만, Firefox는 사양에 따라 0%를 요구합니다. Firefox가 올바릅니다.
버그 #2: 날짜 입력 파싱
// JavaScript
new Date('2025-01-15'); // 어디서든 동작
new Date('1/15/2025'); // Chrome: OK
// Firefox: Invalid Date
// Safari: OK
Firefox는 사양을 엄격히 따르고, Chrome은 형식을 추측해 “도와줍니다”.
버그 #3: fetch()와 keepalive
// JavaScript
fetch('/api/log', {
method: 'POST',
keepalive: true, // Chrome: 항상 동작
// Firefox: POST/GET에만 동작
body: JSON.stringify(data)
});
Firefox에는 특정 HTTP 메서드와 함께 keepalive가 동작하지 않는 버그가 있었으며, 이는 몇 시간의 디버깅을 초래했습니다.
Firefox를 무시할 때의 실제 비용
1. 프라이버시 의식이 높은 사용자 배제
Firefox 사용자는 대체로:
- 기술에 더 정통하고
- 프라이버시를 중시하며
- 광고 차단기를 사용할 확률이 높다
그들은 B2B SaaS와 개발자 도구에 더 높은 가치를 가집니다.
사례 연구: LogWard에서:
- Chrome: 62%
- Firefox: 21%
- Safari: 14%
- Edge: 3%
Firefox 사용자는 Chrome 사용자보다 1.8배 높은 전환율을 보입니다.
2. 독점 강화
Firefox가 사라지면 브라우저 환경은 Blink 기반 브라우저들로만 남게 됩니다:
- Chrome (Google)
- Edge (Microsoft)
- Opera (중국)
- Brave (프라이버시)
- Vivaldi (파워 유저)
모두 같은 엔진을 공유합니다. 인터넷 익스플로러가 95 % 점유율을 차지했을 때 혁신이 5년간 정체됐던 것처럼, 우리는 Chrome와 함께 같은 운명을 겪을 위험이 있습니다.
3. 실제 버그 누락
// JavaScript
const data = await fetch('/api/data').then(r => r.json());
// Chrome에서는 동작
console.log(data?.items?.[0]?.name);
// Firefox 85에서는 (옵셔널 체이닝 버그) 깨짐
옵셔널 체이닝 버그가 오래된 Firefox 버전 사용자 **30 %**에게 빈 페이지를 보여주었습니다. 단 한 명의 사용자가 보고서를 제출했기에 발견된 사례입니다.
“하지만 나는 최신 JavaScript를 쓰고, Babel이 처리한다”
Babel은 문법을 트랜스파일하지만 브라우저 API를 폴리필하지는 않습니다.
예시: structuredClone()
// JavaScript
const cloned = structuredClone(originalObject);
지원 현황
- Chrome 98+: ✅
- Firefox 94+: ✅
- Safari 15.4+: ✅
core-js 같은 폴리필 없이 오래된 Firefox에서는 이 API가 깨집니다.
Safari 문제는 더 심각하다
Windows/Linux 개발자에게 Safari 테스트는 어렵습니다:
- Mac이 필요함 ($1,000 이상) 혹은 BrowserStack 같은 유료 서비스($39/월) 혹은 GitHub Codespaces와 같은 복잡한 셋업이 필요합니다.
Safari는 약 20 % 시장 점유율을 차지하고 있으며(대부분 iOS). iOS에서는 모든 브라우저가 WebKit을 사용해야 하므로, iOS의 Chrome은 사실 Safari에 Chrome 스킨을 입힌 것에 불과합니다. Safari를 무시한다는 것은:
- 모든 iPhone
- 모든 iPad
- 대부분의 Mac
을 무시한다는 의미입니다.
실제로 크로스‑브라우저 테스트하는 방법 (미치지 않고)
1단계: Firefox Developer Edition 설치
다운로드:
왜 Developer Edition인가?
- 빠른 릴리즈 사이클
- 내장된 개발자 도구
- 컨테이너 탭(컨텍스트 격리)
시간 비용: 약 5분.
2단계: 테스트 체크리스트 만들기
배포 전마다:
- [ ] Chrome에서 테스트 (당신의 개발 브라우저)
- [ ] Firefox에서 테스트 (사양 위반 잡기)
- [ ] Safari에서 테스트 (Mac이 있다면)
- [ ] 모바일 Chrome에서 테스트 (반응형)
시간 비용: 배포당 5–10분.
3단계: 브라우저 감지가 아니라 기능 감지 사용
잘못된 예:
if (navigator.userAgent.includes('Firefox')) {
// Firefox‑전용 코드
}
올바른 예:
if ('structuredClone' in window) {
const cloned = structuredClone(obj);
} else {
const cloned = JSON.parse(JSON.stringify(obj));
}
4단계: Autoprefixer와 PostCSS 사용
npm install autoprefixer postcss
Autoprefixer가 벤더 접두사를 자동으로 추가합니다:
/* 당신이 작성한 코드 */
.box {
display: grid;
}
/* Autoprefixer가 출력한 코드 */
.box {
display: -ms-grid;
display: grid;
}