App/Android

Android - 안드로이드 기기에서 userAgent 변경

둉이 2024. 1. 17. 18:42

들어가기에 앞서

PC 크롬과는 달리 모바일 크롬 브라우저에서는 userAgent를 변경하는 기능이 없다.

 

구글링을 해보면 돌핀 브라우저, firefox 등을 사용하는 방법이 나와 있지만 다음과 같은 이슈가 있어 현재는 사용이 불가하다.

 

  • 돌핀 브라우저
    • Android 플레이스토어에서 돌핀 브라우저 설치 불가능
    • iOS 앱스토어에서는 설치는 되지만 아래 블로그 글에서 사용하는 설정 옵션이 제공되지 않음
    • https://bulhwang.tistory.com/48

 

브라우저 기능을 사용하지 않고 안드로이드 웹뷰를 사용하여 userAgent를 변조하는 방법을 알아보자.

 

 

 

안드로이드 웹뷰를 이용한 userAgent 변경

1. 안드로이드 기기 준비

Android Studio 설치 후 사용할 안드로이드 기기를 페어링한다.

 

페어링 방법은 두 가지가 있으며, USB 디버깅과 Wifi를 사용한 무선 디버깅 방식이 있다.

 

안드로이드 기기가 없다면 AVD를 사용하자.

 

 

2. 안드로이드 빈 프로젝트 생성

아래 예시 코드는 코틀린으로 작성할 것이기 때문에 코틀린 빈 프로젝트를 생성한다.

빈 프로젝트 선택 후 생성

 

3. 코드 추가

웹뷰에서 인터넷 접속을 허용하기 위해서는 androidManifest.xml에 아래 코드를 추가해야 한다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.test">
    <uses-permission android:name="android.permission.INTERNET" />  // 이 위치에 코드 추가

    <application>
    	...
    </application>
</manifest>

 

 

다음, activity_main.xml 파일을 연 후, 레이아웃에 WebView 요소를 추가한다.

 

이 때, id는 webview로 지정한다.

레이아웃에 WebView 요소 추가

 

 

 

마지막으로 MainActivity.kt 파일에 다음과 같이 코드를 붙여넣는다.

package com.example.test

import android.content.Intent
import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.KeyEvent
import android.webkit.WebChromeClient
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.annotation.RequiresApi
import java.net.URISyntaxException

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val webView: WebView = findViewById(R.id.webview)

        webView.settings.run {
            // 웹뷰 자바스크립트 허용
            javaScriptEnabled = true
            javaScriptCanOpenWindowsAutomatically = true
            setSupportMultipleWindows(true)

            // 변경할 userAgent 지정
            userAgentString = "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012; Storebot-Google/1.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36"
        }

        // 웹뷰에서 intent, market 스킴 오류를 우회하고자 할 경우 사용
        /*
        webView.webViewClient = object : WebViewClient() {
            @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
            override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
                val url = request.url.toString()

                if (url.startsWith("intent://")) {
                    val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                    intent.data = Uri.parse("https://${url.split("intent://")[1]}")
                    if (intent != null) startActivity(intent)

                    return true
                }
                
                if (url.startsWith("market://")) {
                    val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                    if (intent != null) startActivity(intent)
                    return true
                }
                
                return false
            }
        }
        */

        // userAgent가 잘 바뀌었는지 확인
        // webView.loadUrl("http://m.avalon.co.kr/check.html")

        // 해당 사이트로 이동
        webView.loadUrl("여기에 이동할 사이트 URL을 적어주세요")
    }

    override fun onBackPressed() { // 뒤로가기 기능
        val myWebView: WebView = findViewById(R.id.webview)
        if (myWebView.canGoBack()) {
            myWebView.goBack()
        } else {
            super.onBackPressed()
        }
    }
}

 

 

여기까지 완료하면 우측 상단 Run App 버튼을 클릭하여 앱을 실행할 수 있고, 변경된 userAgent로 실행된 웹뷰 페이지를 볼 수 있다.

 

loadUrl에 http://m.avalon.co.kr/check.html 지정시 변경된 userAgent를 쉽게 확인할 수 있다.

변경된 userAgent 조회

 

 

 

디버깅 용도로 사용

위에서 만든 테스트용 웹뷰 앱은 사용자의 userAgent에 따라 동작이 달라지는 URL을 테스트할 때 요긴하게 사용할 수 있다.

 

예를 들어 아래와 같은 지마켓의 앱게이트 링크를 테스트한다고 하자.

https://appgate.gmarket.com/redirect?app=gmkt&store=false&preview=false&link=https%3A%2F%2Fwww%2Egmarket%2Eco%2Ekr%2Fchallenge%2Fneo%5Faffiliate%2Fsetcookie%2Easp%3Flp%3Dhttp%253A%252F%252Fwww%252Egmarket%252Eco%252Ekr%252F%253Fjaehuid%253D200003658%2526gate%255Fid%253D88901A36%252D1B85%252D4B64%252D8D63%252DE82BBB9CC4AC%26PARTNERSHIP%3DIHsgImMlNUZWYWx1ZUZyb21DbGljayIgOiIyMDAwMDU2Mnw6fDAwMDA3NDgyNTF8OnwwMHw6fDM3MDYwOTg0fDp8dGVzdHw6fE9LIiwgImphZWh1aWQiIDogIjIwMDAwMzY1OCIgfSAg%EF%BB%BF

 

 

링크는 userAgent로 모바일과 데스크탑 사용자를 구분하고, 모바일인 경우는 Firebase의 Dynamic Link, 데스크탑인 경우에는 일반 지마켓 홈 링크로 리다이렉트된다.

 

모바일은 Android / iOS / mWeb을 구분하고, Android/iOS의 경우에는 앱이 설치되어 있다면 앱을 실행한다.

 

여기서 Android로 분류되지만 userAgent에 google이 포함되는 경우(= 구글 크롤링봇)는 앱이 설치되어 있어도 mWeb으로 이동하도록 작업했고, 이를 테스트하려고 한다.

 

위 웹뷰 코드를 통해 간단하게 앱이 실행되지 않는 것을 확인할 수 있다.

 

지마켓 앱이 설치되어 있어도 실행되지 않음