본문 바로가기
ETC/Python

Naver Login with Python requests 1(소스코드)

by Guardy 2020. 7. 8.
728x90

selenium으로 네이버 로그인을 하는 경우가 많은데

requests를 이용하여 login을 하려고 한다.

 

NAVER에서 로그인 후 개발자 모드 기능을 통해 확인해보면

https://nid.naver.com/nidlogin.login 에서 POST를 보내는데 ID와 PW는 빈칸이고 encpw와 bvsd가 가득차있다.

 

nidlogin

 

encpw가 무엇인지 알기 위해 개발자모드에서 검색한결과 

https://nid.naver.com/login/js/default/common200225.js?20200424에서 

function encryptIdPwSplit() {
	var id = $("id");
	var pw = $("pw");
	var encpw = $("encpw");
	var rsa = new RSAKey;

	if (keySplit(session_keys)) {
		rsa.setPublic(evalue, nvalue);
		try{
			encpw.value = rsa.encrypt(
				getLenChar(sessionkey) + sessionkey +
				getLenChar(id.value) + id.value +
				getLenChar(pw.value) + pw.value);
		} catch(e) {
			inSubmitProgress = false;
			return false;
		}
		$('enctp').value = 1;

		setTimeout(function() {
			$("id").value = "";
			$("pw").value = "";
			$("bvsd").value = "timeout";
			$('frmNIDLogin').submit();
		}, 5000);
		try {
			if (bvsd){
				bvsd.f(function(a) {
					$("id").value = "";
					$("pw").value = "";
					$("bvsd").value = a;
					$('frmNIDLogin').submit();
				});
			}
		} catch (e) {
			$("id").value = "";
			$("pw").value = "";
			$("bvsd").value = "error1|"+e.name+"|"+e.message;;
			$('frmNIDLogin').submit();
		}
	}
	else
	{
		getKeyByRuntimeIncludeSplit();
	}
	inSubmitProgress = false;
	return false;
}

다음을 발견할 수 있었다.

encpw는 rsa를 통해서 세션키와 id value와 pw value를 암호화한 값이었다.

rsa는 nvalue와 evalue로 이루어져있는데, 이 값은 어디서 가져올까 또한 세션키도 가져와야한다.

이 값들은 https://nid.naver.com/login/ext/keys.nhn에서 가져올 수 있었다. 

function keySplit(a) {
	keys = a.split(",");
	if (!a || !keys[0] || !keys[1] || !keys[2] || !keys[3]) {
		return false;
	}
	sessionkey = keys[0];
	keyname = keys[1];
	evalue = keys[2];
	nvalue = keys[3];
	$("encnm").value = keyname;
	return true
}

이 소스를 보면 값들은 ,로 구분할 수 있으며 순서대로 sessionkey , Keyname, evalue, nvalue이다.

또한 로그인시 보내는 encnm값은 keyname이었다.

python split함수를 이용하여 이를 구분해준다. 

key_str = requests.get('https://nid.naver.com/login/ext/keys.nhn').content.decode("utf-8")
sessionkey , Keyname, evalue, nvalue = key_str.split(',') 

그 다음 가져온 evalue와 nvalue를 16진수에서 10진수로 바꿔줘야 한다.

evalue, nvalue = int(evalue, 16), int(nvalue, 16)
encpw.value = rsa.encrypt(
				getLenChar(sessionkey) + sessionkey +
				getLenChar(id.value) + id.value +
				getLenChar(pw.value) + pw.value);

이부분을 구현하기 위해서 파이썬으로 바꿔준다.

message = [sessionkey,naver_id,naver_pw]
merge_message = ""
for s in message:
   merge_message = merge_message + ''.join([chr(len(s)) + s])
merge_message = merge_message.encode()
encrypted = rsa.encrypt(merge_message, pubkey)

여기까지 하면 반절은 끝난 것이다.

다음글에서는 bvsd까지 채워서 request까지 하는 과정을 진행할 예정이다.

 

이해가 안되는 부분은 댓글로 남겨주시면 설명해드리겠습니다.

RSA가 뭔지 모르시는분은 나무위키 를 보고 이해해보세요

 

다음글 보기

728x90