User Agent 문자열: 브라우저 지문 읽기
그 이상한 문자열이 방문자에 대해 뭘 말해주고 왜 종종 오도하는지.
모든 HTTP 요청이 User-Agent 헤더를 포함해. 이런 거:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
이게 브라우저를 식별해야 해. 실제론 역사적 난장판이야.
모든 브라우저가 거짓말하는 이유
그 Chrome user agent가 Mozilla, AppleWebKit, KHTML, Safari를 언급해. Chrome은 그 중 아무것도 아니야.
이유가 여기야: 웹사이트가 user agent를 확인하고 다른 콘텐츠를 제공했어. 새 브라우저가 사이트가 인식 못 해서 차단됐어.
그래서 브라우저가 거짓말하기 시작했어. "Mozilla와 호환"이 표준이 됐어. "AppleWebKit와 호환"이 추가됐어. 모든 브라우저가 다른 모든 브라우저라고 주장해.
실제로 배울 수 있는 것
혼돈에도 불구하고 user agent는 여전히 유용한 정보를 포함해:
브라우저 이름과 버전: 실제 브라우저는 보통 끝에 있어. "Chrome/120"이나 "Firefox/121".
운영체제: "Windows NT 10.0"이나 "Mac OS X 10_15_7"이나 "Linux".
기기 타입: 모바일 user agent는 기기 이름이나 "Mobile"을 포함해.
봇 식별: Googlebot, Bingbot, 다른 크롤러가 스스로 식별해.
흔한 감지 패턴
데스크톱 Chrome:
...Chrome/120.0.0.0 Safari/537.36
Android의 모바일 Chrome:
...Android 10; Pixel 4...Chrome/120.0.0.0 Mobile Safari/537.36
iPhone의 Safari:
...iPhone; CPU iPhone OS 17_0 like Mac OS X...Safari/605.1.15
Firefox:
...Firefox/121.0
Edge, Opera, Brave, 다른 건 Chrome 기반이고 Chrome과 비슷해 보여.
피처 감지가 더 나은 이유
User agent 감지는 "무슨 브라우저?"에 답해. 피처 감지는 "이 브라우저가 X를 할 수 있어?"에 답해.
// User agent 감지 (취약)
if (navigator.userAgent.includes('Chrome')) {
// Chrome 기능 가정
}
// 피처 감지 (견고)
if ('serviceWorker' in navigator) {
// 서비스 워커 사용
}
브라우저가 바뀌어. User agent 문자열이 수정돼. 피처 감지는 관계없이 작동해.
User Agent가 여전히 중요할 때
분석. 관객 이해: 브라우저 점유율, 모바일 vs 데스크톱, OS 분포.
봇 감지. 크롤러 식별하고 서버 행동 조정.
타겟 테스트. 특정 브라우저의 사용자가 보고한 문제 재현.
레거시 지원 결정. 사용자의 0.1%가 IE11을 실행하면 아마 지원을 중단할 거야.
스푸핑과 프라이버시
User agent는 쉽게 위조돼. 프라이버시 확장이 수정해. 어떤 브라우저는 사용자가 수동으로 바꾸게 해.
보안을 위해 user agent에 의존하지 마. 힌트지 인증이 아니야.
브라우저 지문은 user agent를 다른 신호 (화면 크기, 폰트, 플러그인)와 결합해 추적해. 이건 논란이 있고 브라우저가 점점 차단해.
Client Hints: 현대 대안
User-Agent Client Hints가 더 새로운 접근이야. 서버가 특정 정보를 요청해:
Sec-CH-UA: "Chromium";v="120", "Google Chrome";v="120"
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Mobile: ?0
구조화됐고, 신뢰할 수 있고, 프라이버시를 존중해. 하지만 채택이 아직 성장 중이야.
파싱 라이브러리
regex로 user agent를 파싱하지 마. 엣지 케이스가 널 패배시킬 거야.
패턴 데이터베이스를 유지하는 확립된 라이브러리 써:
- ua-parser-js (JavaScript)
- user-agents (Python)
- DeviceDetector (PHP)
이것들이 역사적 난장판을 다루고 새 브라우저가 나타나면 업데이트해.
User agent는 분석과 진단에 유용하지만 기능 결정엔 신뢰할 수 없어. 라이브러리로 파싱하고, 기능성엔 피처 감지를 선호하고, 어떤 사용자든 user agent를 위조할 수 있다는 걸 기억해.