selenium으로 네이버 로그인을 하는 경우가 많은데
requests를 이용하여 login을 하려고 한다.
NAVER에서 로그인 후 개발자 모드 기능을 통해 확인해보면
https://nid.naver.com/nidlogin.login 에서 POST를 보내는데 ID와 PW는 빈칸이고 encpw와 bvsd가 가득차있다.
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가 뭔지 모르시는분은 나무위키 를 보고 이해해보세요
'ETC > Python' 카테고리의 다른 글
파이썬 엑셀 읽고 쓰기 (Python Excel Read / Write) (0) | 2020.07.28 |
---|---|
파이썬 exe 파일 만들기 + 자동으로 꺼지는 현상 해결 (0) | 2020.07.26 |
Python을 이용해서 Email 보내기 (1) | 2020.07.23 |
Daum Login with Python requests 1(소스코드) (5) | 2020.07.09 |
Naver Login with Python requests 2(소스코드) (7) | 2020.07.09 |