안드로이드에서 자바스크립트 사용하기(보안이슈)

안드로이드에서만 작동하는 네이티브 앱의 경우는 알 수 없다.

다만 내가 웹을 위주로 개발을 하다보니…

안드로이드의 경우에도 모바일 앱이 아닌 모바일 웹인 경우가 많다.

즉, 화면만 모바일 기기로 보는 것일 뿐, 안에 내용은

일반적인 웹 서비스이다.

다만 모바일로 보기 위하여 WebView 라는 클래스의 도움을 받아

화면에 뿌려줄뿐…

여기서 문제가 발생한다.

웹 서비스의 경우 대부분 javascript 로 구성되어져있다.

안드로이드 환경에서 모바일 웹을 구현 할때에는

웹 서비스 URL 의 경우 h ttps(SSL)이 기본으로 되어 있어야만

javascript 를 사용할 수 있다.

※ 물론 예외는 있다.

SSL 이 적용 되지 않은 웹 서비스는 모바일 웹 어플리케이션을

개발 할 수 없다는 말인가..?

그것은 아니다.

@Javascritp 라는 어노테이션을 이용하여 다음과 같이 구현 할 수 있다.

MainActivity.java

//javascript 사용여부 true
mWebView.getSettings().setJavaScriptEnabled(true);
//웹서비스 <-> 안드로이드간 통신할 클래스 및 객체명 정의
mWebView.addJavascriptInterface(new WebBridge(), "android");

 

MainActivity.java

아래와 같이 기기 고유 ID 와 Push 메시지를 보낼 때 필요한 토큰 값을 return 받는

메소드를 정의하여 준다.

public class WebBridge{
    @JavascriptInterface
    public String getPhoneId(){
        return Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
    }

    @JavascriptInterface
    public String getToken(){
        return FirebaseInstanceId.getInstance().getToken();
    }
}

 

모바일 웹서비스에서 호출 방법은 간단하다.

아래와 같이 사용하면 위에서 정의한 phoneId 와 token 값을 확인 할 수 있다.

//모바일웹과 일반웹을 구분하기 위함
if(window.android){
	alert(window.android.getPhoneId());
	alert(window.android.getToken());
}

물론 위와 같이 사용하였을 경우 일반적인 웹 서비스에서는 window.android 객체를

찾을 수 없기 때문에 실행되지 않지만, 모바일 웹에서는 정상 작동한다.


위와 같이 작업을 마치고 APK를 생성한 다음 Google Play Console 에 등록하면..

이상한(?) 메일을 받아 볼 수 있다..

설명을 보면…

상세사유와 수정해야 할 APK 버전, 그리고 수정 마감일(?)이 날아온다.

어플리케이션을 등록 해본 적이 처음이라 주의 사항 같은건가. .싶어서 넘어갔었는데..

수정마감일이 지나면, 구글플레이에서 등록한 어플리케이션이 등록 취소 된다.

즉, 다운 로드 받을 수 없는 상황이 발생되기 때문에…

사용자가 많은 어플리케이션의 경우 큰 타격을 입지 않을까 싶다.

하여 처음에는 Webview에서 URL을 호출 할때 http -> https 로 변경한 후

어플리케이션을 등록해보았다… (테스트 할 당시 캐시 문제인지 정상작동..ㅠㅠ)

//이전버전
//mWebView.loadUrl("http://esoclan.com");
//임시변경
mWebView.loadUrl("https://esoclan.com");

절대.. 네버.. SSL 이 등록되어 있지 않다면, 위와 같은 실수는 할지 말 것..!

웹어플리케이션을 실행해보면, 흰 화면만 나오고.. 아무것도 진행이 안된다;;

물론 SSL 처리가 되어있다면 위와 같은 방식으로 처리해도 될 지도…?

하지만 SSL 처리가 되어 있었다면… 여기저기 search 할 필요도 없었겠지만..;;

최종적으로 찾은 결과는 아래와 같다.

//javascript 사용여부 true
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(final WebView view, String url) {
        if(url.indexOf("test.php") > -1) {
            String phoneId = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
            String tokenId = FirebaseInstanceId.getInstance().getToken();
            mWebView.loadUrl("javascript: updateInfo('" + phoneId + "', '" + tokenId + "');");
        }
    }
});

javascript 사용여부는 true이고

WebView 클래스의 mWebView 객체에 내장되어 있는

setWebViewClient 클래스를 선언하여 이용한다.

onPageFinished 메소드를 오버라이드 한다.

특정 URL에 해당하면 javascript 명을 호출하여준다.
※ 해당 URL 에서 javascript 메소드가 선언되어 있거나,
선언되어있는 js를 include 해주어야 한다.

이때 javascript 의 인자는 필요한 값을 넘겨주면 된다.


위와 같이 하고 플레이 스토어에 다시 등록하면, 별다른 보안 이슈 메일이 오지 않고,

정상적으로 등록되어 서비스를 이어 나갈 수 있게 된다.

0 글이 마음에 드셨다면 하트 꾸욱~