'2015/10'에 해당되는 글 3건

  1. 2015.10.31 User-Agent 변경 또는 추가 3
  2. 2015.10.29 RSA 암호화 javascript, C# 호환 관련 3
  3. 2015.10.29 CORS 문제 문제 문제

이전 글에서 User-Agent를 통해서 로그인 연동을 하였다고 하였습니다.

Cordova 문서를 살펴보면 아래와 같은 설정(config.xml)을 통해서 User-Agent를 전부 또는 추가할 수 있습니다.

http://cordova.apache.org/docs/en/edge/guide/platforms/android/config.html


<preference name="OverrideUserAgent" value="Mozilla/5.0 My Browser" />
<preference name="AppendUserAgent" value="Test/1.0" />

User-Agent:Mozilla/5.0 (Linux; Android 4.4.4; SHV-E370K Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 Test/1.0


하지만 해당 설정은 기본 WebView에서만 사용할 수 있는 설정입니다.

Cordova 4.0부터는 Crosswalk WebView(Google Chromium)를 플러그인 형태로 추가할 수 있습니다. 안드로이드 WebView가 기본적으로 느리고 ionic에서 사용하는 몇몇 기능들 동작들이 제대로 안되는 문제도 있습니다. 다만 Crosswalk WebView를 추가하게 되면 앱 사이즈가 20MB정도 늘어납니다.

Crosswalk WebView에서 위의 설정을 사용할 수가 없어 Crosswalk WebView 소스에서 커밋된 리스트 중에 User-Agent를 설정하는 부분을 찾았습니다.

https://github.com/crosswalk-project/cordova-plugin-crosswalk-webview/commit/0bea1d0313d05bfd74f02e52d2f85efdd7c48f4e


해당 commit위의 소스를 하나 더 적용시키면 중요한 소스는 아래와 같습니다.

private void initWebViewSettings() {

        webView.setVerticalScrollBarEnabled(false);

        String xwalkUserAgent = preferences == null ? "" : preferences.getString(PREF_USER_AGENT, "");

        if (!xwalkUserAgent.isEmpty()) {

            webView.setUserAgentString(xwalkUserAgent);

        }

    }

그런데 위의 소스는 Override되기만 하기 때문에 User-Agent에 들어가는 안드로이드 버전, 디바이스 정보 등등을 알수가 없습니다. 그래서 검색을 해보니 아래와 같이 변경을 하면 됩니다.

http://stackoverflow.com/questions/4103963/is-there-a-way-to-obtain-the-default-user-agent-string-aside-from-webview-getset


private void initWebViewSettings() {

        webView.setVerticalScrollBarEnabled(false);

        String xwalkUserAgent = preferences == null ? "" : preferences.getString(PREF_USER_AGENT, "");

        if (!xwalkUserAgent.isEmpty()) {

            String userAgent = System.getProperty( "http.agent" );

            webView.setUserAgentString(userAgent + " " + xwalkUserAgent);

        }

    }

User-Agent:Dalvik/1.6.0 (Linux; U; Android 4.4.4; SHV-E370K Build/KTU84P) Test/1.0


User-Agent 값을 비교해보시면 아시겠지만 브라우저 정보는 보이지 않습니다. 브라우저 정보는 Crosswalk WebView라 어떻게 보면 굳이 꼭 필요한가란 생각과 시간의 문제도 있고 이정도면 괜찮을 것 같습니다.


iOS에는 기본 WebView를 사용할 수도 있는데 아직 테스트는 해보지 않았습니다.


Posted by resisa
,

RSA를 이용하여 아이디와 패스워드를 암호화 하려고 하는데 클라이언트(javascript)에서 공개키로 암호화를 하고 서버(C#)에서 개인키로 복호화를 하는데 Bad Data 또는 포맷 예외가 발생하여 관련 내용을 검색해보았습니다.


http://stackoverflow.com/questions/19418021/rsa-encrypt-password-in-javascript-but-failed-to-decrypt-that-in-c-sharp


복호화가 실패하는 이유는 1. 둘 언어간에 byte order가 다르고 2. padding이 다르기 때문입니다.

위의 사이트에서는 해결 방법으로 Jocys JS.NET 라이브러리를 알려줍니다.

해당 라이브러리는 마치 C# 구문과 동일하게 javascript로 구현을 해놓았고 네임스페이스, 클래스명까지 동일하게 구현을 해놓았습니다. 우와~~~


http://www.jocys.com/Common/JsClasses/Documents/


// Create HMAC-MD5 Algorithm.
var hmac = new System.Security.Cryptography.HMACMD5(); 
// Convert string to array of bytes.
var key = System.Text.Encoding.UTF8.GetBytes("test key"); 
var data = System.Text.Encoding.UTF8.GetBytes("test data"); 
// Compute hash. 
var hashBytes = hmac.ComputeHash(key, data);
// Convert to HEX string.
var hex = System.BitConverter.ToString(hashBytes);
// Convert to GUID so you can store it inside database.
var guid = new System.Guid(hashBytes);


C#구문과 완벽하게 일치합니다.


실제로 RSA를 사용하여 암호화를 하니 발생하던 에러도 당연히! 사라졌습니다. 엄지척 ^^

Posted by resisa
,

CORS 문제 문제 문제

모바일 2015. 10. 29. 04:09

회사 일이 많아져서 정신없이 바쁘네요 ㅜㅜ

어떻게 하다보니 하이브리드앱에 모바일 웹을 넣는 조금은 변태적인 구조로 개발을 하게되었습니다.

거기다가 모바일 웹을 인앱브라우저 형태로 보여주기만 하는게 아니라 모바일웹처럼 보이는 하이드리드 앱이라고 해야하나 그런 모양새가 되어버렸습니다. 네이티브로 다 개발하기에는 이미 시간이 얼마 남지 않았고 앞으로 개발해야 하는 것도 눈에 밟히고;; 순수? 하이브리드로 하고 싶었지만 여러가지 이유로 무산 여튼 변태적인 구조속에서 골치가 아픈건 로그인 연동(모바일웹이 iframe으로 들어갔습니다)인데 크로스 도메인으로 인한 쿠키 공유가 되지 않아 무한 검색을 하다가 nodejs 플러그인(CorsProxy)을 찾았습니다.

https://www.npmjs.com/package/corsproxy


별도의 프록시 서버가 구동된다고 보면 되는데 사용 방법을 보면 아시겠지만 Prefix? 도메인명을 맞춰줘서 어떤 사이트라도 Sub도메인명이 되게 하여 해결하는 것입니다.(https도 지원)

http://localhost:1337/localhost:3000/sign_in

http://localhost:1337/my.domain.com/path/to/resource


다만 ionic framework+cordova로 만든 하이드리드 앱에 이걸 어떻게 넣어줘야하냐인데 방법이 없다는게 함정;;

무한 검색을 해보았지만 디바이스에서는 안된다는 글을 보고 nodejs 플러그인이 정말 많구나를 느끼며 낚시글을 마감합니다. ㅎㅎㅎ


아 그래서 쿠키를 포기하고 특정 User-Agent + 쿼리 스트링으로 연동하기로 했답니다;;;


크로스 도메인 관련 정리된 사이트는 아래걸 한번 보면 도움이 될듯 싶습니다.

http://www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier

Posted by resisa
,