6P by kunggom 2020-01-15 | favorite | 댓글과 토론

웹 개발을 하다 보면 종종 웹 브라우저의 종류나 운영체제에 따라 다른 화면을 보여준다거나, 혹은 접속자의 사용 플랫폼을 통계 처리하거나 해야 할 때가 있습니다. 이때 사용되는 것 중 하나가 바로 웹 브라우저가 HTTP 요청 헤더에 추가하는 [사용자 에이전트](User Agent) 문자열이죠. 이걸 통해 플랫폼과 브라우저를 구분하는 방식은 비록 널리 쓰이기는 하지만, 이 문자열은 이미 넷스케이프 시절부터 호환성 등의 이유로 혼란스럽고 알기 어렵게 꼬여 있었습니다. 지금은 더 말할 것도 없어서, 거의 모든 브라우저가 서로 다른 브라우저인 척 행세하는 상황이지요. 예를 들어, 제가 사용하고 있는 어느 브라우저의 사용자 에이전트 문자열은 다음과 같습니다.

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4003.0 Safari/537.36 Edg/81.0.381.0

다른 사전 지식 없이 이 사용자 에이전트 문자열만 있다면 이게 대체 무슨 브라우저인지 도저히 알 수가 없을 겁니다. 모질라 파이어폭스? 크롬? 사파리? 엣지? 정답은 Microsoft Edge Dev 버전입니다. 그나마 사용 플랫폼은 어느 정도 분간이 되는 것 같지만, 이 문자열을 파싱해서 사용 플랫폼 분간에 써먹으려면 또 골치가 아프겠지요.

구글은 이 문제를 해결하기 위해 사용자 에이전트 문자열을 단계적으로 사용 중지하고, 대신 [클라이언트 힌트](Client Hints)라는 것을 사용하자고 제안했습니다. 클라이언트 힌트란 지금 사용자 에이전트 문자열에서 나타내는 정보를 7개의 필드(브라우저 이름/브라우저 메이저 버전/브라우저 전체 버전/플랫폼 이름과 버전/플랫폼 아키텍쳐/하드웨어 모델명/모바일 여부)로 분리하여 HTTP 요청 헤더에 추가하는 것을 의미합니다.

구글은 올해(2020년) 안에 구글 크롬의 사용자 에이전트 문자열이 더 이상 바뀌지 않게끔 고정(호환성 문제가 있으므로 없앨 수는 없음)하고 대신 이 클라이언트 힌트를 사용하기 시작할 예정이라고 합니다. 모질라, 애플, MS 등 다른 주요 웹 브라우저 제작사도 이걸 지원할 계획은 있는 것 같지만, 구체적인 내용은 아직 나오지 않았습니다. 다른 웹 브라우저에서도 이걸 쓰기 시작한다면 이게 보급되는 데에는 큰 무리가 없을 것 같긴 하네요. 하지만, 자기네 브라우저가 아니면 서비스를 차별하고 있는 구글의 행보를 보면 이런 제안을 팔벌려 환영할 수만도 없는 기분입니다.

구글의 클라이언트 힌트 제안 내용 :
https://wicg.github.io/ua-client-hints/

사용자 에이전트 문자열의 역사 :
http://millky.com/@origoni/post/566