Что такое user agent
Что проверяют
Знаете ли вы, откуда берётся строка, по которой сервер судит о клиенте, и насколько ей можно верить. Для Android-разработчика вопрос прикладной: приложение ходит в сеть и через свой HTTP-клиент, и через WebView, строки у них разные, а половина серверных правил завязана именно на неё.
Как отвечать
User-Agent это заголовок запроса, в котором клиент сам себя описывает: движок, платформа, версия. Сервер по нему отдаёт другой контент, считает статистику или отрезает ботов.
В Android источников три. WebView отдаёт системную строку, её читает WebSettings.getDefaultUserAgentString(context), а переопределяет webSettings.userAgentString; внутри строки WebView есть маркер wv, по которому сервер отличает встроенный браузер от полноценного. OkHttp без настройки шлёт собственный короткий okhttp/версия, поэтому для своего API полезно поставить свой заголовок перехватчиком и положить туда имя и версию приложения.
class UaInterceptor(private val ua: String) : Interceptor {
override fun intercept(chain: Interceptor.Chain) =
chain.proceed(chain.request().newBuilder().header("User-Agent", ua).build())
}Добавьте, что браузеры сокращают содержимое этой строки и переносят детали в Client Hints (Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform), а определять возможности правильнее по фичам, а не по названию браузера.
Где спотыкаются
Разбирают строку регуляркой и строят на разборе логику. Формат никем не гарантирован, клиент подставит любой текст, а после сокращения строк в браузерах такие парсеры молча начали относить разные устройства к одному классу.
Считают заголовок общим для приложения. Переопределённый UA у WebView не влияет на запросы OkHttp и наоборот, а менять его нужно до загрузки страницы, иначе новое значение применится только к следующему переходу.
Используют User-Agent как признак доверия. Это обычный пользовательский ввод: по нему нельзя пускать в API, нельзя без экранирования класть его в лог или запрос. Отдельная мелочь: символ вне ASCII в собственной строке роняет запрос в OkHttp.