기본 콘텐츠로 건너뛰기

Android Auto Naver Login (네이버 자동 로그인) - 1


# CAUTION #

시작하기 전에 이 방식은 약간의 편법을 이용한 방식이고 안드로이드 4.4 이상부터 지원하는 것을 알려둔다... (그리고 현재 라이브러리로 만드는 중)


사실 이 내용은 누군가의 부탁을 받아서 만들기 시작한건데, 다 완성도 되고 부탁한 애도 관련 일 다 끝낸거 같으니까 포스팅한다...


안드로이드에서 네이버 로그인을 위해서는 간단하게 네이버 API를 사용해서 로그인 하는 방식이 주로 보편적으로 이용된다.




위와 같은 api들이 있는데 네이버 메일을 파싱하거나 네이버 카페의 글 들을 파싱해야되는경우 API 가 없기 때문에 다른 방식을 사용해서 해야된다. 지금부터 그 과정중 가장 기본이되는 네이버 로그인부터 시작해보도록 한다. https://nid.naver.com/nidlogin.login 에서의 네이버 로그인 과정을 분석해보면

  1. id, pw의 길이를 검사해서 입력햇는지 검사
  2. 입력되엇으면 http://static.nid.naver.com/enclogin/keys.nhn 또는 https://nid.naver.com/login/ext/keys.nhn 에 접속해서 랜덤 값을 가져온다
  3. js 에서 RSA 암호화 
  4. 특정 형식으로 POST
  5. 쿠키 받기

간략하게 이러한 과정을 거치는데... 내가 아는 한에서는 안드로이드에서는 js 를 돌릴수는 있지만 C# 처럼 자유롭게(?) 이용하는 것이 힘들다. 그래서 처음 선택한 방안이 HtmlUnit 이라는 것과 Sel..뭔 라이브러리가 있는데 여러개 전부 다 테스트를 해 보았지만 전부 작동이 되지를 않았다...

그래서 그냥 라이브러리 없이 진행하기로 했다.

일단 하는 방식은 간단하게 다음과 같다.
  1. 웹뷰를 이용해서 로그인
  2. 쿠키유지
엄청 간단하다. 그런데 이러한 의문이 들 수도 있다.
Q1. 웹뷰를 쓰면 입력을 수동으로 해야될텐데, 그럼 자동이 아니잖아???
A. 웹뷰 써도 자동으로 할 수 있어!

이제 답을 말하자면 WebView에서 ID와 PW를 JS를 이용해서 자동으로 입력하게 할 것이다.

우리는 3가지 정도의 CSS 선택자를 알아야된다.

CSS 정리
이름 ID 입력 PW 입력 Login 버튼
CSS 선택자 #id #pw .btn_global

이제 CSS 선택자를 알아냈으니 이제 코드를 짜보자
일단 웹뷰를 선언한 뒤에

        WebView web = (WebView)findViewById(R.id.loginView);

그 다음에 쿠키를 저장해 두기위해서 CookieSyncManager을 사용한다.

        CookieSyncManager.createInstance(getApplicationContext());
        CookieSyncManager.getInstance().startSync();
        CookieManager.getInstance().setAcceptCookie(true);

그 다음에 우리는 자바스크립트를 이용해 줘야되므로 활성화 해주고 솔직히 뭐해줘야 될지 잘 모르겟어서 필요해 보이는건 전부 때려박아버렷다.
        web.getSettings().setJavaScriptEnabled(true);
        web.getSettings().setSaveFormData(true);
        web.getSettings().setAppCacheEnabled(true);
        web.getSettings().setDatabaseEnabled(true);
        web.getSettings().setDomStorageEnabled(true);

그리고 이런 코드를 한줄추가한다. 대충 설명하자면 캐쉬를 사용할수 있는 경우 만료 되도 사용하고 아닌경우에는 네트워크에서 받아와서 사용한다는 내용이다.
        web.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

//2016-08-25 글 수정 : 네이버 로그인 페이지 수정으로 인한 버튼 CSS선택자 수정

(길어져서 2편에서 계속...)


댓글

이 블로그의 인기 게시물

C의 volatile

가장 쓰이지 않는 C/C++ 언어의 volatile 이라는 키워드가 있다. 이 키워드는 대부분의 참고 서적들이 컴파일러의 최적화를 막아준다고만 적어둘 정도로 사용 빈도수가 적기도하고 중요도 까지도 낮은 그런 키워드인 셈이다. 하지만 이 키워드가 임베디드 소프트웨어 에서는 중요한 키워드중 하나가 된다. 거의 하드웨어가 사용하는 메모리 선언 시에 사용되고 다음과 같은 경우에 사용되는 편이다. 메모리 맵 입출력(MMIO)을 제어 인터럽트 서비스 루틴 사용 멀티 쓰레드 환경 이렇게 3가지에 사용되는데 임베디드에서는 주로 아래와 같은 예시들과 같은 경우에 주로 사용된다. 예시 1) unsigned int* test; test = (unsigned int*) 0x1020; test = (unsigned int*) 0x1028; 예를 들어서 다음과 같은 코드가 있을때 컴파일러는 중간 문장은 필요 없는 것으로 판단하고 제거한뒤 컴파일 할것이다. unsigned int* test; test = (unsigned int*) 0x1028; 결과 적으로는 위 문장만 실행되는데 volatile 키워드를 사용하면 이것들이 전부 컴파일 되서 전부의미를 가지게 된다 volatile unsigned int* test; test = ( volatile unsigned int*) 0x1020; test = ( volatile unsigned int*) 0x1028; 예시 2)  예를 들어 0x1234에 8비트의 status 레지스터가 있고, 이 레지스터가 0이 아닌 값을 가질때까지 폴딩하기 위해서 아래와 같은 코드를 작성했다. (루시퍼님 블로그의 예시가 적당해서 가져왔다) INT8U *ptr = (INT8U *)0x1234; while (*ptr == 0) 만약 옵티마이징을 키게 된다면 이것은 move ptr, #0x1234 move a, @ptr loop bz loop 이렇게 다시는 0x1234값을 받아오지 않게 어셈블...

HomeNews Alpha Final!

그런데 인성인증인데 왜 기술적인걸로 프로젝트를 햇더라 파싱은 제리코 라이브러리를 사용해서 완성시켰다. 이제 PPT짜러...! 거의 다완성되간다!

C언어 register 변수의 함정카드

C언어를 하다보면 register 라는 CPU의 레지스터에 자료를 저장하는 변수를 알수있다. 대신에 한 프로그램에서 최대 2개 정도까지만 사용이 가능하고 지역변수만 가능 및 32bit CPU는 32bit 크기의 변수만 사용 가능하다. 장점만 보면 기본적으로 메모리쪽에 저장되는 일반 변수들보다 더 빠르게 접근이 가능할 것 같은데...인라인 어셈이랑 메모리랑 레지스터랑 비교하면 어떤게 가장 빠른지 궁금해서 한번 테스트 해보게 되었다. 우선 테스트 해볼 코드는 다음과 같다. 거의 동일한 연산을 하고 다른 점이 있다면 인라인 어셈은 전부 다 레지스터를 이용해서 연산한다는 정도...? 위의 코드를 컴파일 해서 실제로 돌려보면 실행 결과는 다음과 같이 나온다. !? 그냥 아무런 형식도 지정해주지 않은 auto와 똑같은 결과가 나온다. # C언어는 기본적으로 아무런 형식을 지정해주지 않으면 auto로 해준다. # int a => auto int a 그래서 어째서 저런 결과가 나왔는지 컴파일에 옵션을 줘서 어셈파일을 분석해 보았다. 인라인 어셈 auto for register for push ebp mov ebp, esp mov ecx, 0 jmp SHORT $INLoop$3 $INLoop$3: cmp ecx, 10000000 jae SHORT $EXIT$4 mov eax, ecx shl eax, 2 inc ecx jmp SHORT $INLoop$3 $EXIT$4: cmp ebp, esp call __RTC_CheckEsp popebp ret,0 push ebp mov ebp, esp sub esp, 8 mov DWORD PTR [ebp-8], -858993460 mov DWORD PTR [ebp-4], -858993460 mov DWORD PTR _i$2[ebp], 0 jmp SHORT $LN4@For $LN...