본문 바로가기

카테고리 없음

네이버 자동 로그인 구현[분석]

네이버 자동 로그인 구현

예전에 개인적으로 의뢰를 받아 했던 작업인데 이제 공개해도 될 것 같아서 쓴다.

어떤 분에 네이버 자동 로그인을 어찌어찌해서 만들어서 쓰고 있었는데 안된다고 해서 소스를 보내주신걸 봤었다. 그냥 폼 필드에 ID와 비밀번호를 써놓고 form에 설정됐던 action으로 넘기는 초보적인 로그인 방식이었다. (더 예전에는 id와 pwd를 url에 바로 써서 GET으로 던지면 로그인이 되던 때도 있었단다)

일단 이게 먹히고 있었던 것도 신기하였는데, 다행히 이런 위험한 방식이 이 사람이 나한테 문의를 한 시점 바로 전날 쯤에 바뀌었다.
그래서 로그인이 안된다고 의뢰를 했던 것이고 분석에 들어갔다.

네이버 로그인 페이지는 https://nid.naver.com/nidlogin.login이다. 일단 이 페이지에서 땡겨오는 javascript 소스 목록들을 보면 대충 어디를 파고 들어가야 할지 보일 것이다.

Screen Shot 2015-05-11 at 1.36.51 AMnetwork 상황을 보면 common.all.js나 common.utjil.js 가 보인다. logintheme.js는 사실 별로 쓸모가 없어보인다.

로그인 버튼을 누르면 실제적으로 정보를 보내게 될텐데 로그인 버튼이 포함된 form을 보면 다음과 같이 confirmSubmit()이라는 함수를 호출하는 것을 알수있다.

Screen Shot 2015-05-11 at 1.43.45 AM

이 함수는 다음과 같이 생겼는데 간단한 existence 체크만 하고 encryptIdPw를 호출하게 돼있다.

encryptIdPw 함수는 실제적으로 session키와 id및 입력된 password를 가지고 rsa encryption을 수행하게 된다.

RSA라니? evalue, nvalue가지고 조립을 하는 것 같은데, evalue, nvalue를 어디서 가져오는지 알아야했다.

여기 보면 keySplit이라는 함수가 evalue, navlue를 세팅하게 돼있고, encryptIdPw에서 keySplit(session_keys)를 부르는 것으로 보아 session_keys를 누가 세팅하는지를 알아야했다.

소스를 몇번 더 추적해보면 비밀번호 집어넣는 칸에서 getKeysv2라는 함수를 keypress 이벤트에 걸렸을때 호출해주게 돼있고 getKeysv2함수는 대충 매 분마다 /login/ext/keys.nhn라는 곳에 ajax요청을 하고, 그 결과를 session_keys에 세팅해놓게 된다.

Screen Shot 2015-05-11 at 1.55.35 AM

비밀번호를 입력할 때 getKeysv2를 호출함

Screen Shot 2015-05-11 at 1.55.56 AM

/login/ext/keys.nhn 에서 뭔갈 불러온다

뭘 불러오는지 봤더니 콤마(,)로 연결된 굉장히 긴 스트링인데, session_keys를 쪼개는 함수를 읽어보면 아래의 내용처럼 분리가 되는것 같다.

keys.nhn에서 굉장히 긴 string을 불러온다.

keys.nhn에서 굉장히 긴 string을 불러온다.



이제 이 값들로 어떻게 RSA 알고리즘에 집어넣는지를 봐야한다.

evalue, nvalue가 각각 a, b로 들어가게 돼있다. 참고로 여기서 n과 e는 RSA 암호화에 쓰이는 공개키의 구성 요소인 큰 소수 p,q 의 곱 n과 승수 e 이다. 이렇게 하여 n과 e로 공개키 셋업을 하고 위의 소스에서 봤듯이 message는 session키 및  아이디, 비밀번호로 구성한 후 공개키로 암호화를 하게 된다.

결국엔 이렇게 셋업된 value를 가지고 encpw라는 값으로 만들어서 keyname (아마 public key <n,e>와 쌍을 이루는 private key를 서버에서 찾기 위한 id일듯)과 함께 넘기면 서버에서 private key를 이용하여 메시지를 풀어내어 id, pwd를 확인할 것이라 추측된다.

간단히 ruby 코드로 검증을 해보았다.

 

Screen Shot 2015-05-11 at 2.22.03 AM

실제로 수행해보면 Screen Shot 2015-05-11 at 2.23.01 AM

마지막에 응답으로 sid가 세팅된 url로 redirect하는 것을 알 수 있다. 실제로 browser에 저 url을 넣으면 로그인이 된 상태로 네이버에 들어가진다.