User-Agent 탐지, 히스토리 및 체크리스트

이 글은 https://hacks.mozilla.org/2013/09/user-agent-detection-history-and-checklist/ 의 번역본입니다.

히스토리
User-Agent: <something> 은 HTTP 클라이언트(브라우저, 봇, 캘린더 어플리케이션 등)가 서버로 보내는 HTTP 요청을 보내면서 전송하는 문자열이다. 1991년에 정의된 HTTP 프로토콜은 이 항목을 가지고 있지 않지만 1992년에 정의된 다 음 버전에서 HTTP request 헤더값 안에 User-Agent 값을 추가하였다. User-Agent 구문은 “/(슬래시)와 버전 명을 포함한 소프트웨어 제품 이름”으로 정의되어 있다.  이 설명으로 분석작업과 구현 이슈로 인해 제품을 식별하는 사람들을 끌어들이게 되었다.

User-Agent 문자열이 나타난다면 클라이언트에 의해 사용된 소프트웨어 프로그램 정보를 전달한다. 이는 통계 목적과 프로토콜 위반을 추적하기 위한 것이기 때문에 반드시 포함해야 한다.

2013년 8월로 재빨리 이동해보면, HTTP/1.1 스펙 문서가 변경되었고 User-Agent를 다음과 같이 정의하고 있다.

사용자 에이전트는 필요 이상으로 상세한 내용을 User-Agent 필드를 생성해서는 안된다.  그리고 제3자들의 하위 제품들에 대한 정보가 추가되지 않도록 제한해야 한다. 너무 길고 상세한 User-Agent 필드값은 요청 대기시간이 늘어날 뿐만 아니라 사용자가 바라지 않을 사용자 확인(감식)에 대한 위험성도 증가한다.
비슷한 관점에서, User-Agent에는 서로 다른 구현 기능간의 호환성을 제공하기 위해 다른 제품들의 표식을 사용하지 않도록 권장하고 있다. 이는 이 필드의 목적에 부합하지 않기 때문이다. 만약 사용자 에이전트가 다른 에이전트로 위장한다면,  받는 쪽에서는 사용자가 의도적으로 응답 정보를 보고 싶어한다고 추측할 수 있다. 그 응답 정보는 식별된 사용자 에이전트에 따라 생성된 정보이기 때문에 마치 실제 사용자 에이전트에서 이용한 것과 같은 동작을 하지 않을수도 있다.

기본적으로 HTTP 명세에서는 사용자 경험을 토대로 구성된 User-Agent 문자열 탐지에 대해선 권장하지 않는다. 요즘엔 User-Agent 문자열이 너무 길어지고 있다.  이 정보들은 모든 가능한 방법들로 어뷰징 될 수 있다. User-Agent는 자세한 정보를 담고 있기 때문에 그들이 누구인지에 대한 정보를 지어내기도 하고 디바이스들을 광고, 홍보를 하기 위해 사용되기도 한다.

User-Agent 탐지
User-Agent 탐지 (혹은 스니핑)은 User-Agent 문자열을 분석하는 데 사용하는 메카니즘이며, 디바이스와 사용된 브라우저에 관한 물리적, 응용 어플리케이션 속성을 유추해낸다. 한번 이 기록을 직접 얻어보자. User-Agent 스니핑은 언젠가는 실패할 수 밖에 없는 전략이다. 설계상으로 알려진 것들에 대해서만 탐지할 수 있지, 나중에 들어올 것에 대한 것은 탐지할 수 없기 때문이다. 작은 디바이스들로 이루어진 이 세계는 (스마트폰, 피쳐폰, 타블렛, 시계, 아두이노 등등) 빠른 속도로 발전하고 있다. 물리적 특성이라는 관점에서 그 다양성은 증가하기만 할 것이다. 정확하게 확인하기 위해 사용하는 데이터베이스와 알고리즘을 관리하는 일은 운영에 꽤 큰 공수가 들어가는 일이며, 향후에 실패할 수 밖에 없는 운명을 가지고 있다. 버려진 사이트들과 라이브러리들은 운영되고 있지 않고 웹 사이트들은 미래에 나올 디바이스들을 위해 설계되어 있지 않으므로 깨져서 보일 것이다. 이러한 특성들로 인해 리소스 및 브랜드를 관리하는 데 비용이 들어간다.

제품의 사용성에 기반한 사용자 경험에 맞춰질 수 있도록 돕는 새로운 해결책에 대한 개발이 진행되어 왔다.반응형 디자인으로 만들면 다양한 화면 크기에 맞춰진 웹사이트가 만들어진다. 제품 또는 특성을 탐지할 때 마다 왜 당신이 이러한 특징을 알아내려고 하는지 이해하는 것이 중요하다. 현재 쓰이고 있는 User-Agent 탐지 알고리즘들로 인해 동일한 덫에 빠질 수도 있다.

Firefox OS 또는 안드로이드 용 Firefox를 차단하는, 오용된 사용자 에이전트 탐지 알고리즘을 매일 다루어야 한다. 이는 Mozilla 제품들 뿐만 아니라 모든 제품들이 차단하고 있는 부분을 핵심으로 다루어야 한다. 왜냐하면 그 알고리즘이 잘못 구성되었을 때 통과할 수 있는 키 값은 가지고 있지 않기 때문이다. User-Agent 탐지 기법으로 인해 심지어 적합한 기술 셋을 가지고 있을지라도 신규 사용자가 시장에 들어오기 힘든 상황으로 만들 수 있다. 수많은 상황들에 유연하게 대응하는 새로운 시스템을 만들면 엄청난 이득을 가져올 수 있다는 것을 기억하도록 하자.

몇몇 회사들은 User-Agent 문자열을 결제 혹은 마케팅을 목적으로 특정 그룹에 속하는 사용자들을 위한 맞춤형 컨텐츠를 제공하려고 할 때 식별자로 사용할 수 있을 것이다. 이는 처음엔 손쉬운 해결책이 되는 것 처럼 보이지만 한편으로 User-Agent를 위장하여 손쉽게 통과할 수 있는 환경을 만들어준다.

Firefox와 모바일
Firefox OS와  안드로이드 용 Firefox는 User-Agent 문자열에 대해 매우 간단한 문서를 가지고 있다.

Firefox OS
Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0

안드로이드 용 Firefox
Mozilla/5.0 (Android; Mobile; rv:18.0) Gecko/18.0 Firefox/18.0

User-Agent 탐지는 모바일 디바이스인 경우 모바일 컨텐츠에 맞춰진 웹 사이트로 리다이렉트 되는 경우에 가장 많이 사용된다. 이 경우 매우 단순한 문자열인 소문자로 mobi라는 하위문자열을 매치하는 것으로 탐지를 제한하도록 권장하고 있다.
/mobi/i

만약 자바스크립트로 클라이언트에서 탐지하려면 많은 방법 가운데 아래와 같이 판단할 수 있다.

// Put the User Agent string in lowercase
var ua = navigator.userAgent.toLowerCase();
// Better to test on mobi than mobile (Firefox, Opera, IE)
if (/mobi/i.test(ua)) {
// do something here
} else {
// if not identified, still do something useful
}

또는 if 구문에서 하나의 토큰 이상을 추가 비교할 수도 있다.
/mobi|android|touch|mini/i.test(ua)

비교할 때 사용하는 토큰의 수가 몇 개가 되더라도 시간이 흐른 후엔 실패할 수가 있다는 것을 기억하도록 하자. 몇몇 장비에는 자바스크립트를 가지고 있지 않을 수도 있고, 올바른 토큰값을 갖지 못할 수도 있다. 토큰의 길이 값 혹은 패턴은 초기에 계획된 것 처럼 가지고 있지 않기 때문이다. 방법은 많지만 그중 간단한 방법을 선택하도록 하자.

요약 : UA 탐지 체크리스트
1. User-Agent 를 탐지하지 않는다.
2. 모바일 사이트를 위한 반응형 디자인에 사용한다.
3. 명확한 특징에 사용한다면 막기 위해서가 아닌 가능성을 열어주기 위해 탐지를 사용한다.
4. User-Agent 를 꼭 사용한다면, 가장 단순하고 일반적인 문자열과 함께 사용한다.
5. 당신이 선택한 해결책이 무엇이든 만일의 사태를 위한 대비책을 항상 제공한다.

연습하고, 배우고, 구상하고 수정하자. 그리고 다시 시작하자. 컨텍스트 및 사업 요구사항, 회사 자체가 가진 소셜 인프라에 기반하면서 수많은 장애물을 만나게 될 것이다. 체크리스트를 항상 가까이에 두고 더 많은 사람들에게 웹을 제공하도록 하자.

작성자: Joohee Kang

Joohee Kang가 작성한 문서들…


댓글이 없습니다.

댓글 쓰기