2017년 12월 31일 일요일

파이썬을 이용한 네이버 카페 업무 자동화 2

지난 글에서 네이버 카페 특정 레벨의 회원 아이디 리스트 얻기와 찾아진 명단으로 게시글 검색하는 내용까지 다루었다. 실제 해야 하는 작업은 검색 결과를 바탕으로 회원 레벨을 조정하는 것. 이제 이 마지막 작업을 자동화할 단계이다.

회원 레벨 조정은 어느 메뉴에서든 할 수 있지만, 관리 메뉴의 전체 멤버 관리 화면이 아이디로 검색해 원하는 멤버를 찾아 레벨 조정하기 편리하게 되어 있어 그걸 이용하기로 했다.

준비 과정은 동일하게 셀레늄을 import하고 크롬 드라이버를 띄운다. 이제 브라우저 화면의 원하는 자리에 원하는 값을 넣고 원하는 버튼을 누르는 작업을 파이썬으로 한줄씩 코딩해 넣으면 된다. 물론 아이디 목록이 들어있는 파일을 읽어와서 이 작업을 반복하는 for 루프 하나 만들고.

원하는 자리나 원하는 버튼을 찾아내는 것은 지난 글에서 쓴 대로, 크롬 브라우저에서 마우스 우클릭 후 맨 아래 "검사(N)" 메뉴를 클릭하면 된다. 오른쪽에 창이 열리면서 해당 element가 반전되어 보이는데, 먼저 반전된 element에 마우스 우클릭하여 copy - copy element를 눌러보자. 메모장 등에 붙여넣어보면 element 내용을 확인할 수 있는데, 여기 id나 name 등이 포함되어 있어야 find_element_by_id(), find_element_by_name() 등으로 찾을 수가 있다. 어떤 버튼은 copy element로 보면 별다른 정보가 없는데, 이때는 copy - copy xpath를 선택하고 find_element_by_xpath()를 이용해서 찾으면 된다.



가령 (2)번 버튼의 경우 copy element로 해서 보면 "<span>검색</span>" 이렇게밖에 안 나오지만, copy xpath로 보면 "//*[@id="frmSearch"]/div/div/div[1]/a[1]/span"로 나온다.

한단계 한단계 찾아나가는 과정에서는 파이썬 쉘을 띄워놓고 한 줄씩 실행해 보고 잘 되면 코드에 넣고 그런 식으로 하면 된다.

버튼을 클릭했을 때 팝업창이 뜨는 경우가 있다. 예를 들어 등급을 선택하고 (5)번 변경 버튼을 누르면 대상자를 확인하고 코멘트를 입력하는 팝업이 뜬다. 이때는 팝업창 쪽으로 포커스를 전환해 줘야 팝업 창에서 필요한 작업을 수행하고 팝업을 닫을 수 있게 된다. 이때 필요한 명령은 driver.switch_to_window()다. 먼저 handle = driver.window_handles 처럼 해서 현재 떠 있는 창들의 핸들값을 얻은 다음, 필요한 창으로 전환하면 된다. 메인 윈도우의 핸들은 handle[0]에, 팝업창의 핸들은 handle[1]에 저장된다. driver.switch_to_window(handle[1])로 포커스를 팝업창으로 전환하면 된다.

팝업창에서 코멘트 넣고 확인 버튼을 누르면 이번엔 경고창 (alert)이 뜬다. 확인 눌러서 닫으면 되는데 이것도 처리해줘야 한다. driver.switch_to.alert.accept() 명령으로 간단하게 처리 가능. 그리고 나면 팝업창은 닫히는데, 그렇다고 해서 핸들이 메인 윈도우로 저절로 돌아가지는 않으므로 driver.switch_to_window(handle[0])로 다시 포커스를 돌려줘야 한다.

사실 노하우는 이게 거의 전부다. 문제는 이렇게 해서 돌려보니 자꾸 오류가 나는데, 그건 버튼을 누른 후 해당 웹페이지를 가져올 때까지 기다린 후 다음을 진행해야 하는데 기다리는 시간이 충분치 않아서이다. 쉘에서야 한 줄씩 차례차례 실행하니 문제가 없지만 다 짜서 돌리면 딜레이를 주지 않으면 값을 읽어오지 못한다. 게다가 이 딜레이는 인터넷 상황, 서버 로딩에 따라 매우 유동적이다. 코딩 후 테스트시에는 각 단계에서 1초의 딜레이만으로 아무 문제없이 잘 돌았는데, 막상 실제 등급 조정 작업을 120명 걸어놓고 돌려보니 단계별 3초 딜레이로도 충분치 않은 경우가 있었다. 그렇다고 무작정 길게 할 수도 없는 것이고, 확실히 로딩이 된 걸 확인하고 넘어갈 수 있는 방법이 필요하다. 아래는 총 정리된 파이썬 코드.

향후 개선 방향은 현재 아이디만 추출하게 되어 있는 것을 아이디와 별명을 함께 추출하여 사람이 보기 좋게 적절히 포맷 만들어 저장하는 것, 단계별 막연히 3초 정도 딜레이 준 것을 try - catch 문으로 1초씩 딜레이 늘려가며 로딩 확실히 될 때까지 루프 돌다가 넘어가게 하는 것이다. 그러나 내가 원래 하려던 등급 조정 작업은 이미 끝났으므로, 이 개선 작업은 과연 언제 하게될지 기약이 없다. 아마 올 연말에나 다시 하게 되지 않을까?

2017년 12월 25일 월요일

스마트폰 잠금에 대한 설명

1. 스마트폰 화면잠금은 필수!

스마트폰을 왜 잠궈야 할까? 물론 내 스마트폰이 남의 손에 들어갈 일이 절대로 발생할 리가 없다면, 잠그지 않아도 괜찮다. 그러나, 도난, 분실의 우려는 물론이고, 잠시 부주의한 사이 누군가 내 스마트폰을 만질 수도 있다. "내 폰에는 중요한 게 없어서 잠그지 않아도 괜찮다."고 하는 분들이 있는데, 이분들은 한국 사회에서 "신원확인"의 대부분을 휴대폰으로 한다는 사실이 무엇을 의미하는지 진지하게 생각해 보지 않아서 그렇다. 휴대폰 소액결제는 물론이고, 고가의 유료 통화, 문자, 게임 아이템 구매 등 휴대폰 만으로 직접 돈을 쓸 수 있는 방법만도 수없이 많다. 게다가 휴대폰으로 신원 확인을 통해 대출을 받거나 할부로 물건을 구매하는 등 예상할 수 있는 피해는 한계를 정하기 어렵다.

물론 휴대폰이 잠시 내 손을 떠난게 겨우 5분이라면 그 사이에 누군가 내 명의로 대출을 완료하기는 어렵겠지만, 그정도 시간이면 누군가 내 폰에 악성 앱을 설치하기에는 충분한 시간이다. 악성 앱은 장기적으로 내 주소록과 사진은 물론, 카메라와 마이크를 원격 조정해 내 생활을 모두 감시하거나 모바일 뱅킹을 할 때 비밀번호, 공인인증서 비밀번호 등을 모두 훔쳐낼 수 있다.

그리고 분실, 도난이 내가 조심한다고 100% 막아지는 일인가? 휴대폰과 지갑을 같이 분실한다면? 그 휴대폰에 잠금이 안 걸려 있다면? 나는 이런 상황은 상상조차 하고 싶지 않다. 혹자는 휴대폰 잠금 걸어봐야 다 풀어낸다고도 하지만, 그 잠금을 푸는 데 걸리는 시간을 벌 수 있다면 그 사이에 통신사에 연락해 번호를 정지시킬 수 있다. 잠금이 안 걸려 있다면, 누군가 내 폰을 손에 넣는 순간부터 내가 그 사실을 인지하는 순간까지 내 인생은 완전히 다른 누군가의 손에 맡겨져 버리는 셈이다. 그 폰으로 내가 목숨보다 사랑하는 내 가족에게 전화를 해서 사기를 친다면? 그들의 생명을 위태롭게 한다면?

자, 만약 당신의 스마트폰에 화면잠금이 설정되어 있지 않다면 지금 당장 설정 메뉴에 들어가서 설정하도록 하자. 단순 패턴이라도 없는 것보다 낫다. 물론 패턴에서 기역자나 니은자, N이나 Z 이런 패턴은 두세번만 시도해 보면 바로 풀리니 이런 것보다는 어려운 걸로 설정해야 한다. 네자리 PIN 설정에 0000이나 1234 이런 걸 쓰지 말아야 하는 것처럼. 보다 길고 어려운 패스워드로 설정하는 사람도 있지만 사실 휴대폰 키보드로 매번 패스워드를 입력하는 것은 매우 불편하고 오타의 위험도 높으니 패스워드는 오히려 권장하지 않는다.


2. 휴대폰 전원 켤 때 잠금

휴대폰 전원 켤 때 잠금 메뉴는 일반 화면잠금과는 다른 것인데, 제대로 이해하고 사용하는 사람이 많지 않다. 사실 이해하기가 아주 쉽지는 않다. 잠금 설정할 때 이걸 선택해야 할지 고민하는 분들을 위해 이게 뭐하는 기능인지, 어떤 장점이 있고 또 어떤 위험성이 있는지 설명하려 한다. 휴대폰 전원 켤 때 잠금은 먼저 화면잠금 설정이 되어 있어야 추가로 설정 가능한 기능이다. 두 상황에서 같은 패스워드를 사용한다.

이 기능을 이해하려면, 먼저 "암호화"라는 것을 이해해야 한다. 이 기능은 데이터 암호화와 직접 관련되어 있는 기능이기 때문이다. 우리말로 암호라는 말이 두가지 의미로 쓰여 혼동이 되기 때문에, 이 글에서는 영어로 encryption은 "암호화"로, password는 "패스워드"로 구분해 사용하겠다. 그리고 안드로이드는 화면잠금에 패턴, PIN, 패스워드 세가지를 지원하는데 (LG 휴대폰은 노크코드도 지원한다), 편의상 이걸 통틀어 패스워드로 부르겠다.

아무튼 암호화란, "암호키"를 사용해 데이터를 알아볼 수 없는 형태로 바꾸고, 오직 암호키를 가진 사람만 본래 형태로 복호화하여 데이터를 알아볼 수 있게 하는 기능이다. 본래 안드로이드의 데이터 암호화는 원하는 사용자가 설정 메뉴에서 직접 "암호화하기" 버튼을 눌러 수동으로 하게 되어 있었는데, 이게 안드로이드 6.0 마쉬멜로우부터 기본 암호화로 바뀌었다. 즉 출시 시점부터 마쉬멜로우를 탑재하고 나온 안드로이드폰이라면 내가 폰을 사는 시점에 이미 데이터 저장 영역은 암호화가 설정되어, 내가 저장하는 모든 데이터는 자동으로 암호화되어 저장된다.

이게 왜 유용한 기능이냐 하면, 이렇게 암호화되어 저장된 데이터는 그 상태로 폰이 꺼져 있거나 메모리가 폰에서 분리된 상태로 누구의 손에 들어간다 해도 암호키를 모른다면 복호화할 수 없기 때문이다. 물론 보안에서 "절대 불가능한" 것은 없고, 암호를 푸는데 충분히 오랜 시간이 걸린다고 하는 것이 더 정확하겠다. 아무튼 현존하는 가장 강력한 컴퓨터로 수십년 이상의 시간이 걸린다면 충분히 안전하다고 봐도 좋을 것이다.

그런데 이렇게 암호화되어 있어도, 폰을 사용하려면 암호키를 사용해 데이터를 복호화해야 한다. 그럼 그 암호키는 어디서 오는 것일까? 당연히 어딘가에 저장되어 있다. 그러나 암호키를 그대로 어딘가에 저장해둔다면, 해커는 그 암호키를 읽어낼 수 있을 것이다. 따라서 암호키를 그대로 저장하면 안되고, 암호키를 다시 암호화해서 저장해야 한다. 마치 금고 열쇠를 안전한 곳에 두기 위해, 금고 열쇠를 저장하는 또 다른 금고를 마련하는 식이다. 그럼 이 두번째 금고 열쇠, 즉 암호키를 암호화하는데 쓰는 두번째 암호키는 또 어떻게 보호하는 걸까?

이 두번째 암호키가 바로 휴대폰 전원 켤 때 잠금 메뉴와 관련이 있다. 이 메뉴를 활성화하면, 사용자의 패스워드를 이 두번째 암호키를 만드는 데 사용하는 것이다. 이렇게 설정해 놓으면, 폰을 켜면 부팅이 진행되기 전에 사용자의 패스워드를 먼저 묻고, 사용자가 입력한 패스워드를 이용해 두번째 암호키를 얻어낸다. 이걸로 금고를 열어 첫번째 암호키를 꺼내고, 이걸로 사용자의 데이터를 복호화해 폰을 정상적으로 부팅시키게 된다. 반대로 이 메뉴를 활성화시키지 않으면, 사용자의 패스워드 대신 단말기에서 생성해 낸 "기본 암호키"를 이용하기 때문에 사용자의 패스워드 입력 없이도 폰이 정상적으로 부팅이 된다.

자 이제 휴대폰 전원 켤 때 잠금 메뉴를 활성화한 경우의 장단점을 설명해 보자. 이 모드의 장점은, 내가 패스워드를 입력해야만 그걸로 두번째 암호키를 얻어낼 수 있으므로, 패스워드를 모른다면 그 누구도 데이터를 복호화해 낼 수 없다는 것이다. 따라서 폰을 분실하거나, 도난당하거나, 파손되거나, 어떤 상황에 처하더라도 내 데이터는 안전하다는 것이 보장된다. 그리고 당연하게도, 데이터를 복호화할 수 없으니 내 폰의 전원이 꺼져 있다면 내가 아닌 그 누구도 내 폰을 켜서 사용할 수 없다. 그 어떤 화면잠금 해제 툴이나 루팅 툴도 모두 무용지물이다. 반면 단점은, 역시 그 누구도 데이터를 복호화낼 수 없다는 것이다. 즉 내가 패스워드를 잊어버린다면, 세상 그 누구도 데이터를 복호화낼 수 없게 된다. 제조사 서비스센터도, 구글도 데이터를 복호화해낼 수 없다.

이 모드는 또 하나의 단점이 있는데, 그건 부팅이 정상적으로 진행되려면 패스워드 입력을 받아야 하고, 패스워드 입력을 받기 전에는 아직 폰이 정상적으로 동작하지 않는 상태라는 것이다. 패스워드 입력을 기다리고 있는 상태에서는 비상전화를 제외하고는 그 어떤 기능도 동작하지 않는다. 알람도 울리지 않고, 전화도 오지 않고, 문자도 오지 않는다. 물론 전화를 걸 수도, 다른 어떤 기능도 사용할 수 없다. 오직 비상전화만 걸 수 있다. 이게 왜 문제냐면 밤에 자동으로 SW업데이트를 걸어놓거나 하면, SW업데이트 후 전원이 꺼졌다 켜지면서 아침에 알람이 울리지 않기 때문이다. 물론 전화도 오지 않으니, 지각은 물론 회사에서 애타게 전화를 해도 전혀 모른채로 꿀잠을 자게 될 수도 있다는 것. 다행히 제조사에서는 이 모드로 설정되어 있는 경우엔 야간 자동 SW업데이트를 하지 않도록 하고 있다.

보안에 도움이 되는 기능이긴 한데, 잘 모르고 사용하면 심각한 상황을 맞을 수 있으니 주의해야겠다. 패스워드를 잊어버리는 경우는 의외로 심심치 않게 자주 발생한다. 더구나 요즘은 지문인식 기능으로 인해 폰을 껐다 켜지 않는 이상 패스워드 입력을 전혀 하지 않고 수일~수주 이상 지나가 버리는 경우가 많아, 이 기능을 설정해 놓고서 까맣게 잊어버리는 경우가 생길 수 있다. 이렇게 패스워드를 잊어버리면 현재로서는 정말로 복구할 방법이 없으니 주의가 필요하다.

3. 원격 잠금

만약 화면잠금이나 휴대폰 전원 켤 때 잠금을 설정하지 않았는데 폰을 잃어버렸다면 어떻게 해야 할까? 일단 당장 시급한 것은 통신사에 연락해 분실 신고하고 번호를 정지시키는 것이다. 이것만으로도 당장 소액결제나 유료전화를 막는 것은 물론, 명의 도용 등의 사고를 막을 수 있다. 그러나 폰에 저장되어 있는 개인정보 유출은 막을 수 없다. 이때 이용 가능한 것이 바로 원격 잠금이다. 원격 잠금을 별도로 제공하는 업체나 통신사업자의 서비스를 이용해도 되지만, 안드로이드 폰이라면 구글에서 기본적으로 제공하므로 이걸 이용하면 된다. 여기에 간략한 설명이 있으니 참고. 당연한 이야기지만, 구글에서 제공하는 서비스이므로 사용하려면 본인의 구글 계정을 알아야 한다. 안타깝게도 우리나라에서 아직도 꽤 많은 사용자가 본인의 구글 계정이 뭔지 모르고 안드로이드 폰을 사용한다. 패스워드를 기억 못하는 경우도 아주 흔하고. 이런 상황이라면 이 기능을 사용하기도 어렵게 된다.

게다가 원격 잠금의 한계는, 단말기가 데이터망이든 와이파이든 접속되어 있어야 한다는 것이다. 서버에서 단말기로 명령을 보내는 것이므로, 단말기가 연결되어 있지 않다면 명령을 보낼 수가 없기 때문이다. 즉 휴대폰 도둑이 명의 도용 등이 목적이 아니라 내 단말기의 개인정보를 빼낼 목적이었다면, 내 폰을 손에 넣은 즉시 비행기모드로 바꾸어 버리면 원격 잠금이 동작하지 않게 된다.

결국 기기 추적이나 잠금, 데이터 삭제 등 원격으로 제어 가능한 방법이 있긴 하지만, 한계가 있으므로 이걸 너무 믿지 말고 평소에 화면잠금을 반드시 걸어두어야 한다. 매번 휴대폰을 쓸 때마다 패스워드를 입력하는 게 귀찮다면 지문인식 기능이 있는 폰을 사도록 하자. 지문의 보안성이 그다지 높지 않다고 하지만, 일상적인 상황에서 내 폰을 보호하는 목적으로는 충분하다.