2024년 4월 3일 수요일

미국 대학 입시 - 2. Common Data Set

Common Data Set은 미국 대학들이 입시와 관련되어 상세한 학교의 정보를 기록한 자료이다. Common이라는 이름답게, 동일한 포맷으로 같은 질문들에 대해 정보를 제공하게 되어 있다. 대학 입시와 관련된 미국의 대표적인 기관들인 College Board, Peterson’s, 그리고 U.S. News & World Report에서 함께 포맷을 만들어 각 대학에 제공하고, 대학들은 이 자료를 성의껏 작성하여 제공함으로써 투명한 정보를 제공하고 학생들의 대학 선택을 돕는다.

이 자료를 일목요연하게 정리하여 제공하는 사이트가 있으면 좋겠으나, 현재까지는 각 대학들이 자체적으로 pdf 파일 형태로 각 학교 웹사이트에서 제공하는 자료를 일일히 모아서 직접 내용을 확인하는 방법밖에는 없어 보인다. AI 검색엔진 등에 "특정 대학들에 대해 common data set을 찾아서 주요 정보를 테이블로 정리해 제공하라"고 요청하면 정리해 주긴 하는데, 정리된 데이터 중 사실과 동떨어진 수치가 섞여있어 신뢰하기 어려웠다.

일단 학교마다 제공하는 pdf 파일의 위치가 다 달라, Google 검색어에 "학교명" + "common data set"을 넣어서 파일을 찾아야 한다. 최근 파일을 제공하지 않는 학교들도 있다. 이런 경우는 어쩔 수 없이 과거 파일을 참고하거나, U.S. News나 Niche와 같은 웹사이트에서 제공되는 정보로 만족해야 한다. 특히 유학생을 많이 선발하는지, 유학생에게 재정지원을 잘 해주는지 등의 정보는 Common Data Set을 보지 않고는 찾기 어렵다.

Common Data Set은 아래와 같은 여러 section으로 나누어진다.

A – General College Information: 학교 주소, 사립인지 공립인지, 공학인지 남/여학교인지, 학기제인지 쿼터제인지, 수여하는 학위의 종류 등 일반적인 정보

B – Enrollment and Persistence: 전체 학부 학생 수(남/녀), 1학년 학생 수(남/녀), 대학원 학생 수(남/녀), 인종별 학부 학생 수 및 1학년 학생 수 (유학생은 nonresidents), 수여한 학위 수 (학사/석사/박사), 졸업율(4년/5년/6년), 1학년의 리텐션율

C – First-Time, First-Year (Freshman) Admissions: 각종 1학년 입시 정보 - 지원자수(남/녀), 합격자수(남/녀), 등록자수(남/녀), 주립대의 경우 in-state/out-of-state/international에 따른 지원자/합격자/등록자수, waitlist 숫자 및 합격자수, 지원자격, 고등학교 과목별 요구사항, 입학 사정시 고려 요소별 중요도, SAT/ACT 필수 여부, 지원자 SAT/ACT 점수 분포, 지원자 고등학교 석차 및 GPA 분포, 입시 정책 (Application Fees, Closing Dates, Notification Date(s)), Early Decision, Early Action 등 여부, 

D – Transfer Admissions: 편입 관련 정보

E – Academic Offerings and Policies: 온라인 수업, 복수 전공 등 정책, 졸업 필수 과목

F – Student Life: 기숙사, 동아리 등 학교 생활 관련 정보

G – Annual Expenses: 학비, 기숙사비, 기타 비용

H – Financial Aid: 정부나 외부기관 포함 재정지원/장학금 총액, 재정지원 신청한 학생수, 받은 학생수, 필요한 액수 중 지원한 비율, 학자금 대출, 재정지원/장학금 받은 유학생 수, 재정지원/장학금 받은 유학생의 평균 액수, 재정지원 신청 정보

I – Instructional Faculty and Class Size: 교수 수(남/녀), 학위, 교수-학생 비율, 수업당 학생수 분포

J – Degrees Conferred by Disciplinary Areas: 학위 수여된 전공별 비율


2024년 3월 30일 토요일

미국 대학 입시 - 1. 대학의 종류

미국에는 4천여개의 대학이 있다고 한다. 그중 2년제인 community college를 제외한 4년제 대학도 대학원 위주인 연구중심대학과 학부 위주인 리버럴 아트 칼리지(Liberal Arts College)로 나눌 수 있다. 리버럴 아트 칼리지를 인문대학이라고 하지 않은 것은, 이런 학교들이 인문학만 가르치는 것이 아니고 과학이나 CS, 공학 등도 가르치기 때문이다. 한국에 흔히 이름이 알려져 있는 대학들은 대부분 연구중심대학이다. 리버럴 아트 칼리지, LAC들은 학교 규모가 작은 편이고 학생수가 적은데다, 연구 결과로 매스컴을 탈 일이 적기 때문에 한국에서 유명세를 타기는 어렵다.


연구중심대학

흔히 알고 있는 하버드, 예일, 프린스턴 등의 아이비리그 대학들, MIT, 스탠퍼드, 칼텍 등 우리가 많이 들어본 대학들이 주로 여기에 속한다. 주립대 중 잘 알려진 UC Berkeley나 UCLA, 미시건대 등도 다 연구중심대학에 속한다. 연구중심대학의 교수들은 주로 연구에 비중을 두기 때문에 대학원 위주로 시스템이 돌아간다. 아무래도 교수들이 학부 수업에는 정성을 덜 쏟게 될 것이고, 따라서 학생들은 수백명 이상 수강하는 대형 강의실에서의 수업이나 대학원생이 강의하는 수업을 듣게 되기도 한다. 4년 내내 교수와의 일대일 면담을 해본 적 없다는 학생들도 많다. 

주립대 같은 경우는 설립 목적상 특히 입학은 비교적 쉬운 편이나 졸업은 쉽지 않으며, 좋은 학점을 받기는 더 어렵다. 워낙 학생 수가 많아 누가 누군지도 잘 모르고, 혼자서 알아서 챙겨야지 누가 도와주지 않는다. 이런 주립대의 단점을 보완하기 위해 Honors 칼리지라는 것이 있다. 주립대에서 특별히 성적이 우수한 학생들을 따로 선정해 일종의 특혜를 주는 것인데, 장학금은 물론 교수들이 따로 시간을 내서 챙겨주고, 과목 선택 우선권, 가장 좋은 기숙사, 주차 혜택까지 부여한다고 한다. 물론 상세한 것은 학교마다 다르겠지만. 그러다보니 상위권 주립대의 Honors 합격은 아이비리그급 사립대 합격만큼 어렵다.


Liberal Arts College

학부 수업에 중점을 두는 대학들이다. 미국 내 LAC로 최상위권인 Williams, Amherst, Pomona, Harvey Mudd college 등도 아마 한국에서는 들어본 적이 없는 듣보잡 대학 취급을 받을 것이다. 그러나 이런 대학들은 미국 내에서는 아이비리그 대학에 붙고도 선택하기도 할 정도로 좋은 학교들이다. LAC들은 주로 규모가 작고 학생 대 교수 비율이 매우 낮다. 수업은 20명 이내의 소규모로 토론 위주의 수업이 이루어지고, 다양한 인문학적 소양과 과학적/논리적 사고를 키우는데 중점을 둔다. 많은 책을 읽고 토론하고 글쓰기 능력을 키우게 된다고 한다. 또한 서로가 서로를 잘 아는 사이가 된다. 교수와 학생 간의 관계가 매우 친밀하고, 수시로 교수들을 찾아가서 대화하고 관계를 맺을 수 있다. 전담 카운슬러가 있어 잘 챙겨주는 학교가 많다. 졸업 후 대학원, 의대, 법대 진학 등을 염두에 둔 학생들이 많으며, 교수의 추천서가 큰 힘이 된다고 한다. 일부 상위권 LAC 들은 유학생 비율이 높고 유학생에게도 장학금이나 재정 지원을 잘 주는 편이어서, 재정 지원이 필요한 유학생들은 LAC를 집중적으로 노려보는 것이 좋다.


Community College

2년제인 community college는 지역 내 가까운 곳에서 누구나 원하는 수업을 들을 수 있는 교육기관에 가깝다. 고등학교 졸업장만 있으면 입학이 된다고 보면 된다. 학비도 매우 저렴해서, California의 경우 듣는 과목수에 따라 달라지지만 연간 24학점 기준으로 유학생도 1만불 이하의 학비를 지불하면 된다. 그리고 community college에서 2년 보낸 후 주립대로 편입이 가능하다. California의 경우 아예 캘리포니아 주립대 (University of California)로 편입이 보장되는 Transfer Admission Guarantee (TAG)라는 프로그램도 있다. 물론 Computer Science 등 경쟁이 치열한 전공으로의 편입은 어렵고 최상위 UC들은 편입을 받는 숫자가 제한되어 있으나, 그렇지 않은 학과들로 다른 UC들은 목표로 한다면 최소 학점 기준만 맞춘다면 편입이 가능하다. 캘리포니아를 예로 들었지만 다른 주들도 비슷한 프로그램이 있을 것이다.

일단 학비가 무척 저렴한데다 입학이 쉽고, UC 등 유명 주립대로의 편입이 보장된다니 환상적으로 들린다. 그러나 이러한 편입도 장점만 있는 것은 아니다. 우선 다른 친구들은 4년제 대학교에 가는데 본인은 CC로 가는 것을 아이들이 원하지 않는다. 그리고 CC에 다니는 동안에는 사실상 대학생활이라는 것이 존재하지 않고, 먼저 4년제 대학교 간 친구들이 1, 2학년 기간 동안 하게 될 학교 생활, 동아리 활동, 교우 관계 구축 등을 할 기회를 잃게 된다. 게다가 캘리포니아 같은 경우는 애초에 CC에 오는 학생들 대부분이 편입을 노리고 오기 때문에 생각만큼 공부나 고학점 취득이 쉽지는 않다고 한다.


2024년 3월 29일 금요일

미국 대학 입시 - 0. 개요

한국 학교에 잘 다니고 있던 아이들이 이런저런 사유로 국제학교로 옮기게 되면서, 그동안 남의 일로만 생각했던 미국 대학 입시에 관심을 갖고 찾아보게 되었다. 요즘은 우리나라 입시도 복잡하지만, 미국 대학 입시는 그보다 몇배는 더 복잡하지 않을까 싶다. 다행히 요즘은 많은 정보를 인터넷 서치와 유튜브를 통해 취득할 수 있고, 네이버 카페 등을 통한 정보 교류도 활발하여 비교적 짧은 기간에 어느 정도 파악을 할 수 있게 되었다. 새로 알게 되는 정보들 못지 않게 또 잊어버리는 것도 많아, 어딘가에 적으면서 정리해야 할 필요를 느끼게 되었다. 스스로를 위한 정리이지만, 나처럼 미국 대학 입시에 대해 전혀 모르던 분들에게는 도움이 되는 정보가 될 수도 있을 것 같다.

수많은 미국 대학에 대한 정보는 어디서부터 찾아야 하나?

하버드, MIT, 스탠포드 이런 대학교들은 당연히 한국에서도 유명하기 때문에 다들 알지만, 랭킹 10위권 내에도 한국에서는 잘 들어보지 못한 학교들이 등장하기 시작한다. 따라서 내가 이름을 들어본 학교 위주로 구글 검색해서 학교 홈페이지를 일일히 찾아보는 것은 큰 의미가 없다. 미국에는 4천여개의 4년제 대학교가 있다고 하니, 아무래도 랭킹 순으로 혹은 어떤 기준으로 검색을 해 볼 수 있는 사이트에서 찾아보는 게 합리적일 것이다.
이러한 사이트들에서 적당한 학교들을 일단 추려내는 작업이 필요하다.

미국 대학은 뭘 보고 학생을 뽑나?

우리나라 대학교들은 일단 내신 성적과 수능 점수를 볼 것이고, 그 외에 다양한 전형들이 있고 생기부에 적힌 여러가지 스펙들을 볼 것이다. 미국 대학도 비슷하나, 각 학교의 재량이 매우 크다.
  • GPA (Grade Point Average) - 내신에 해당하는 것으로, A = 4, B = 3, C = 2, D = 1 이런 배점을 기본으로 하되 난이도가 높은 Honors 과목이나 AP 과목에는 추가점을 주어 weighted GPA를 보는 학교도 있다. GPA는 기본적으로 학생이 얼마나 성실하게 학교 생활을 했는지와 얼마나 똑똑한지를 동시에 보여주는 척도가 된다. 또한 어떤 과목들을 들었는지 과목별 요구사항이 있기도 하고 (가령 수학, 영어는 4년간 필수로 들어야 한다는 식이며 과학, 사회도 4년 필수 혹은 3년이 필수이나 4년 권장, 제2외국어도 같은 언어로 4년 권장 등 학교마다 다 다르다.), 또 얼마나 어려운 과목들을 들었는지가 중요한 평가 요소이다.
  • 표준화 시험 점수 - 수능에 해당하는 SAT나 ACT 시험 점수이다. 다만 수능처럼 국가 주도의 시험이 아니고 업체가 제공하는 것이며, 원하는 만큼 여러번 볼 수 있다. GPA는 학교마다 교육 수준이나 grade 매기는 편차가 클 수 있기 때문에, 수준을 비교하기 위해 표준화된 시험 점수가 도움이 되는 것이다. 그러나 이러한 표준 시험 점수가 학생의 가정 경제 수준에 비례한다는 비판도 있어 왔고, 특히 코로나 기간에 물리적으로 시험장에 모여서 시험을 치르는 것이 불가능해짐으로 인해서 대부분의 대학이 표준화 시험 점수를 필수가 아닌 선택 사항으로 변경했었다. 최근에는 MIT, 예일, 브라운 등 주요 대학을 필두로 SAT/ACT 점수를 다시 필수 제출로 변경하는 학교들이 생겨나고 있다. AP 과목을 수강하고 AP 시험을 봐서 받은 점수(학점 아님)를 표준화 시험 점수로 인정하기도 한다.
  • 과외 활동 (Extracurricular Activities, 줄여서 EC) - 학과목 이외의 모든 활동을 통칭하는 것으로, 학교에서 하는 동아리 활동, 운동, 음악, 봉사활동, 수상 경력 등을 의미한다. 아이비리그 등 명문 대학교들의 경우, 대부분의 지원자들이 성적은 다 뛰어나기 때문에 이러한 EC 요소들이 당락을 좌우하는 큰 역할을 한다. 즉 단순히 성적만 놓고 SAT 1점, GPA 0.1점 차이로 당락이 결정되는 것이 아니라, 가령 SAT 50점이나 GPA 0.3점이 더 낮더라도 더 인상적인 EC 활동이 있는 학생이 합격할 수 있다는 것이다. 이러한 활동들은 학생의 인성, 사회성, 리더십, 시간 관리 능력을 보여주며, 학생이 얼마나 스마트한지도 보여준다. 즉 하루종일 공부만 해서 간신히 A를 받은 학생보다 하루에 두시간씩 운동하고 일주일에 10시간 이상씩 학생회 활동과 봉사활동도 해가면서 A를 받은 학생이 더 똑똑하다고 보는 것이다.
  • 에세이 - 에세이는 단순히 자기소개서가 아니다. 기본적으로는 어떤 질문들에 답하는 것이다. 인생에서 어떤 어려움을 겪었고 이를 어떻게 이겨냈는지 쓰라는 자기소개에 가까운 에세이도 있지만, 사회 문화에 대한 통찰력을 요구하는 에세이도 있고, 창의성을 요구하는 에세이도 있다. 에세이는 하나만 쓰는 것이 아니며, 여러가지 주제에 대해 많은 에세이를 요구하는 학교들도 있다.
  • 추천서 - 대학 입학에 왜 추천서가 중요한지는 모르겠지만, 미국 문화에서는 추천서를 중요하게 여긴다. 기본적으로 고등학교의 입시 카운슬러의 추천서와 학교 선생님 두 분의 추천서가 필요하다. 그 외에 추가 추천서는 자유인데, 심지어 미국 대통령의 추천서를 받는 학생도 있다고 한다.

미국 대학의 학비는 어느 정도나 되나?

미국 대학의 학비는 살인적인 수준이다. 왠만한 사립대학의 1년 학비는 보통 6만불이 넘어가며 매년 오르고 있다. 또한 기숙사비와 식비, 그외 보험료나 책값 등 여러 비용을 모두 합쳐 COA (Cost Of Attendance)라고 하는데, 보통 8만불에서 9만불 정도 된다. 연간 1억원이 훌쩍 넘는 금액이다. 주립대는 해당 주의 주민들에게는 In-state라 하여 학비가 저렴하지만, 타주 학생들이나 유학생들은 OOS(Out-of-State) 학비를 내야 하는데 이것도 만만치 않다. 캘리포니아 주립대인 UC Berkeley의 OOS 1년 학비는 4만5천불 수준이다. 사립대학교보다는 싸지만, 여전히 COA는 7만불에 육박한다. 미시건 주립대의 OOS 1년 학비는 무려 5만5천불이다. 물론 플로리다 주립대(학비 약 3만불)처럼 저렴한 주립대도 있다. 저렴한 주립대라 해도 COA는 여전히 한국 돈으로 연간 6천만원에 달한다. 한국 대학 등록금과는 비교하기 어려울 정도로 큰 차이가 난다.

다행인 것은, 모든 학생들이 이 돈을 다 내고 학교에 다니는 것은 아니라는 것이다. 많은 학교들이 실제로는 많은 학생들에게 장학금과 재정 지원 명목으로 훨씬 저렴한 비용으로 학교를 다닐 수 있도록 해준다. 우리는 흔히 장학금이라고 구별없이 사용하지만, 미국대학들은 Merit-based Scalarship과 Need-based Financial Aid를 명확히 구분하고 있다.
  • Merit-based Scalarship (성적 우수 장학금): 성적 우수라고 번역했지만 사실 성적 이외에 운동 특기나 리더십 등 다른 EC 측면에서의 장점을 모두 고려해서 대상자와 액수를 선정한다. 액수는 아주 적을 수도 있고 많을 수도 있으며, 학생의 가정 형편은 고려하지 않으므로 집이 재벌이어도 받을 수 있다.
  • Need-based Financial Aid (재정 지원): 학생의 가정 형편에 따라, 대학을 다니기 위해 필요한 액수를 지원해 주는 것이다. Grant라는 것은 조건없이 깎아 주는 금액이고, Loan은 대출, Work-study는 학생이 학교에서 아르바이트를 해서 벌어야 하는 돈이다. 가령 학교의 COA는 9만불이지만 가정의 소득과 지출을 고려한 가정 형편상 학비로 연간 2만불밖에 낼 수 없다고 하면, 나머지 7만불을 재정 지원을 통해 보조해 준다. 하버드의 경우 가정 소득이 연간 8만5천불 이하이면 COA 전액을 지원해준다.
재정 지원이란 게 좋아 보이지만, 당연히 대학의 재정에도 한계가 있으므로 모든 학생이 원하는 만큼 재정 지원을 받을 수는 없다. 다행히 기부금으로 조성된 재정이 풍부한 학교들은 학생을 뽑을 때 재정 형편을 고려하지 않는 Need-blind 정책을 시행하고 있으나, 아쉽게도 이런 혜택은 미국 시민권자나 영주권자에게만 주어지고 유학생에게는 주어지지 않는 경우가 대부분이다. 현재 미국 내에 총 100여개의 학교가 Need-blind 정책을 시행하고 있으나, 유학생에게도 Need-blind를 적용하는 학교는 총 8개에 불과하다. (하버드, 예일, 프린스턴, 다트머스, MIT, 앰허스트, 보든칼리지, 브라운)

Need-blind가 아닌 학교들은 Need-aware라고 하는데, 이는 입시 사정 과정에서 학생이 얼만큼의 재정 지원을 필요로 하는지를 보고, 이를 학생을 뽑는데 고려한다는 뜻이다. 학교 입장에서는 특출나게 우수한 학생이라면 재정 지원을 해서라도 뽑고 싶을 것이지만, 비슷한 수준의 학생이라면 학비를 full로 낼 수 있는 학생을 뽑는 것이 이익일 것이다. 그러므로 아무래도 재정 지원을 필요로 하는 학생은, 특히 유학생은 이런 학교들에 지원할 때는 어느 정도의 불이익을 감수해야 한다.

비자 그리고 미국 대학 졸업 후에는?

미국에서 살고 싶다고 아무나 그냥 갈 수 있는 것은 아니며, 그에 필요한 비자 등을 발급받아야 한다. 미국에서 학교를 다니기 위해서는 F-1 비자를 발급받아야 한다. 학교에 입학이 확정되면 학교에서 I-20라는 서류를 발급해 주고, 이를 기반으로 주한 미국대사관에서 F-1 비자를 받게 된다. 이 비자는 비이민비자이기 때문에, 학업을 마치고 다시 한국으로 돌아올 것이라는 보증이 필요하다. 따라서 학업을 마칠 수 있는 충분한 재정이 있는지, 한국으로 확실히 돌아올 것인지를 입증할 수 있는 부모의 소득 증명, 통장 잔고 증명 등을 필요로 한다. 이 F-1 비자는 학업을 위한 것이므로, 학교 내에서의 아르바이트나 별도의 CPT(Curricular Practical Training)를 발급받아 가능한 인턴십 외에는 다른 경제 활동을 할 수 없다.

사실 미국 대학에 진학하는 이들 중 상당수가 이후 미국에 남아서 취업을 원할텐데, 이를 위해서는 취업 비자가 필요하다. 우선 학교를 졸업하면 OPT(Optional Practical Training)라고 해서 1년간 미국에서 일할 수 있는 자격을 받을 수 있다. 이걸 근거로 미국 회사에 취업을 해서 일을 시작하고, OPT가 만료되기 전에 적법한 다른 비자를 받으면 된다. 그러나 실제로 대표적인 취업 비자인 H-1B는 매년 신청자 수가 비자 개수를 훨씬 웃돌기 때문에 추첨으로 대상자를 결정하며, 회사에서 채용, H-1B 준비와 신청, 추첨, 심사 및 비자 발급에 소요되는 시간을 고려했을 때 (3월 말에 추첨, 10월부터 근로 시작 가능) 한번에 추첨에 당첨된다 해도 1년으로 시기를 맞추기가 쉽지 않다. 게다가 추첨에 떨어지기라도 하면 그대로 한국으로 돌아와야 한다. 따라서 미국 기업들 입장에서는 어지간히 채용하고 싶은 인재가 아니고서야 이런 risk를 안고 있는 외국인을 굳이 채용해야 할 이유가 없다.

이러한 과정에서 전공이 매우 중요한 역할을 하게 되는데, STEM(Science, technology, engineering, and mathematics) 분야의 경우 1년이 아닌 3년짜리 OPT를 받을 수 있기 때문이다 (1년 후 2년 연장 가능). 추첨을 통해 H-1B를 받아야 하는 것은 변함이 없지만, 3년이라는 기간이 주어지므로 1년에 비해 확률은 크게 올라가게 되고 기업들의 risk도 그만큼 줄어들게 된다. 따라서 채용 가능성도 높아진다. 또 한가지 중요한 사실은 H-1B 비자 신청을 위해서는 석사나 학사 학위가 필요한데, 기업에서 하게 되는 업무와 관련된 전공 학위가 있어야 한다는 것이다. 그러므로 미국 대학 유학을 갈 때에는, 어떤 전공을 택해 어떤 직업을 얻을 수 있을지, 이를 통해 H-1B를 받을 수 있을 것인지 미리 조사를 해야 한다.

미국 대학 입시 전략

어떤 대학이든 학비를 full로 내는데 어려움이 없는 집안이라면 그냥 가장 좋은 대학, 가고 싶은 대학을 골라서 그곳에 들어가기 위한 입시 전략을 세우면 그만이다. 혹은 시민권자나 영주권자라면 장학금이나 재정 지원을 받는 것도 훨씬 수월하고, In-state 학비를 적용받아 주립대에 가면 학비 부담도 적다. 또 졸업 후에 미국에서 취업하는 데에 아무런 제약이 없다. 

그러나 유학생 신분이고 금수저 집안이 아니라면 졸업 후 진로와 비자 문제도 미리 고민해야 하고, 학비에 대한 고민도 필요하다. 아이가 하나가 아니라 둘 이상이라면 더 그럴 것이다. 따라서 유학생 신분으로 미국 대학의 입시 전략은 단순히 최고의 대학을 고르는 문제가 아니라 "어떻게 비용을 덜 들이면서, 졸업 후 취직이 가능한 좋은 대학에 갈 것이냐"라는 조금 더 복잡한 문제가 된다. 어떤 전공이 취업이 유망한지, 어떤 전공을 해야 H-1B 취업비자 가능성이 높은지, 어떤 학교가 인턴십 기회가 많은지, 어떤 대학이 학비가 싼지, 어떤 대학이 성적 우수 장학금을 잘 주는지, 어떤 대학이 유학생에게도 재정 지원을 해주는지, 이런 모든 정보를 적극적으로 파악하고 조사해서 전략을 세워야 한다.

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. 원격 잠금

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

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

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

2017년 11월 10일 금요일

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

네이버의 영어책 읽기 카페에서 스탭으로 활동하고 있는데, 연말에 회원 레벨 조정 작업을 할 일이 생겼다. 간단한 일이지만 수백명이나 되는 회원에 대해 확인을 수동으로 다 하려니 상당히 지루한 일이 될 것 같아, 자동화를 위해 방법을 찾아보기로 했다.

일단 아래 적은 것들 대부분 인터넷 검색하면 다 나오는 것이므로, 다른 사이트에서 자세히 설명되어 있는 내용을 부가적으로 설명하지는 않고 전체적인 흐름만 기록하고자 한다. 전체적으로 여기의 도움을 많이 받았다.

첫번째로 필요한 것은 파이썬 설치다. 아직 파이썬2를 쓰는 사람도 있지만 특별한 이유가 없다면 가급적 파이썬3를 설치하도록 하자. Windows 피씨에도 무리없이 설치할 수 있고, path도 설정해 주면 cmd 터미널에서 현재 어느 디렉토리에 있든지 쉽게 사용 가능하다.

둘째 웹 자동화에 필수적인 것이 셀레늄(Selenium)이다. 파이썬 모듈로 설치하면 된다. pip install selenium 명령으로 쉽게 설치할 수 있다. 또한 웹페이지를 읽고 처리하려면 Beautiful Soup의 도움이 필요하다. 역시 pip을 써서 pip install bs4 명령으로 쉽게 설치할 수 있다.

세째 셀레늄에서 다룰 수 있는 브라우저 설치다. 크롬 드라이버를 설치하면 된다. 위에서 언급한 블로그에 자세히 나와 있으므로 따라하면 된다.

다 설치되었으면 cmd 창에서 python shell을 띄우고 크롬을 띄워보자. 크롬 브라우저가 새로 뜨면서 "자동화된 테스트 소프트웨어에 의해 제어되고 있습니다"라는 안내창이 보일 것이다. 아래에서 물론 경로는 크롬 드라이버가 깔려 있는 디렉토리명이다.

>>> from selenium import webdriver
>>> driver = webdriver.Chrome('c:/temp/chromedriver')

네째로 알아야 할 것은 브라우저의 개발자 도구다. 이건 별도로 설치할 필요는 없고 크롬 메뉴에서 개발자 도구를 선택하면 된다. 웹페이지에서 특정 리스트 항목이나 버튼의 element나 xpath를 확인하기 위해서는 마우스 오른쪽 버튼을 클릭하고, 맨 아래 "검사(N)" 메뉴를 선택하면 된다. 즉시 오른쪽에 새로운 창이 생기면서 상세한 내용을 보여준다.

이제 본격적으로 네이버를 공략할 차례다. 매일 자동으로 사람 손을 거치지 않고 반복해서 해야 하는 일이 있다면 로긴을 위해 아이디, 패스워드를 자동으로 보낼 수도 있으나, 코드에 하드코딩하는 것은 가급적 피하는 것이 좋다. 나는 아이디까지만 입력된 상태에서 파이썬 코드는 잠시 대기시키고, 패스워드 입력은 수동으로 하는 쪽을 택했다. input()을 이용해 파이썬은 대기시킨 상태에서, 패스워드 입력 후 로긴에 성공하고 나서 cmd 창에서 enter를 눌러 이후 코드를 진행시켜주면 된다.

네이버 카페에서 내가 필요로 하는 작업은 두가지였다. 하나는 관리 메뉴에서 특정 레벨의 회원 명단을 조회하여 아이디 리스트를 얻어오는 것, 둘째는 특정 게시판에서 이 아이디로 각각 검색하여 검색 결과 (게시물의 개수)를 얻어오는 것. 현재는 해당 레벨의 회원 수가 수백명 수준이라 대충 마우스로 긁어다 엑셀에 넣는 방식으로 아이디 리스트를 뽑아내는 것도 가능하겠지만, 만약 수천명이 된다면 그렇게는 불가능할 것이다.

1. 특정 레벨의 아이디 리스트 얻기
네이버 카페 관리 메뉴의 전체 회원 조회 페이지를 보면, 드롭 다운 메뉴로 레벨을 고르고, 또 그 옆의 드롭 다운 메뉴로 한 페이지에 보여지는 회원수를 설정하게 되어 있다. 회원수가 한번에 보여줄 수 있는 숫자를 넘게 되면 하단에 페이지 번호가 표시된다.

드롭 다운 메뉴가 골라진 상태(특정 등급, 한번에 보여주는 회원 수)의 쿼리 URL이 있을 법한데 찾기 어려워, 셀레늄을 이용해 드롭 다운 메뉴를 선택시켰다. 드롭 다운 메뉴를 골라 선택하기 위해서는 브라우저의 개발자 모드를 이용해 element의 id를 찾고, 셀레늄의 Select를 활용해 해당 값을 찾아내어 select하면 된다. (하기 코드 #18~#26 참고)

이제 원하는 명단이 화면에 떴으니, 필요한 정보를 골라 저장하면 된다. Beautiful Soup을 활용하면 다양한 조건에 맞는 element들을 찾아낼 수 있다. 리스트로 뽑아진 결과물에서 내가 필요로 하는 것은 memberid 뿐이므로, 리스트에서 memberid만 추출해 파일에 따로 저장한다.

멤버 명단이 한 페이지가 넘어가면 다음 페이지로 넘겨야 한다. 다행히 총 멤버 수를 명시해 주기 때문에, 해당 멤버수를 근거로 몇번이나 페이지를 넘겨야 할지 알 수 있다. 문제는 1000명이 넘어가면 정확한 숫자가 아니라 "1000이상"으로 출력한다는 것이고, 이 문제는 나중에 따로 생각해 봐야 할 것 같다. 10페이지 단위로 페이지 넘김이 컨트롤되기 때문에 1000명 이상의 임의의 숫자에 잘 대응하는 코드를 작성하려면 좀 고민이 필요해 보인다. 당장 내가 작업해야 하는 등급의 멤버는 400여명 수준이라 이 고민은 일단 생략.

아무튼 페이지 넘기는 버튼은 크롬 개발자 도구에서 xpath를 찾아내어 Selenium으로 클릭해 준다. 여기서 나중에 실행시 이 버튼이 안 찾아진다는 오류 메시지를 만나서 당황했었는데, 알고보니 네이버에서 플래쉬 관련 공지가 해당 버튼을 덮어버려서 생긴 문제였다. 명단 첫 페이지 띄울 때 한번만 뜨기 때문에 나는 그냥 수동으로 닫았는데, 찾아서 자동으로 닫는 걸 시도해도 좋을 듯 하다.

새로운 페이지를 띄울 때마다 Beautiful Soup에 넘기기 전에 살짝 sleep을 주는게 좋다. 안 그러면 덜 완성된 부정확한 정보가 넘어가게 될 수 있다. Selenium Webdriver의 wait을 이용하는 방법과 그냥 간단히 time.sleep()을 이용하는 방법이 있는데 다양하게 테스트해보고 싶었으나 귀찮으므로 일단 2, 3초간 sleep()을 주는 것으로 간단히 해결.

네이버 로긴부터 아이디 수집까지 정리된 코드를 아래 정리했다. 인원수에 따른 반복 처리 및 페이지 넘김 부분은 생략했으니 필요시 추가하면 된다.


2. 찾아진 명단으로 게시판 검색
게시판 검색은 다행히 URL을 이용한 쿼리로 대부분 가능하기 때문에, 앞의 경우처럼 버튼의 xpath를 찾아서 클릭해줘야 할 필요는 없었다. 나는 검색으로 찾아진 게시물의 개수만 필요했기 때문에 (50개가 넘는 경우도 굳이 알 필요 없었기에) 간단하게 끝났지만, 해당 게시물들을 크롤링하며 추가 정보를 찾는 경우나 50개를 넘어서 정확한 게시물의 개수를 다 세어야 하는 경우라면 좀더 복잡한 로직이 필요할 것이다.

쿼리는 아래와 같이 필요한 정보를 넣으면 된다. 기간 정보도 아래처럼 search.searchdate로 포함시킬 수 있다. 검색 버튼을 마우스 우클릭하고 새 탭에서 열기를 누르면 쿼리 URL을 볼 수 있으며, 이 중 불필요한 것은 지우고 필요한 것만 사용하면 된다.

http://cafe.naver.com/카페주소?iframe_url=/ArticleSearchList.nhn%3Fsearch.clubid=클럽아이디%26search.menuid=1280%26search.searchdate=2017-01-012017-12-31%26userDisplay=50%26search.query=검색어

검색으로 나온 게시글 리스트에 접근하려면 먼저 iframe으로 전환해야 한다. 이후 Beautiful Soup select로 원하는 리스트를 찾아서 개수를 저장했다.

아래 정리된 코드는 네이버 로긴 부분은 생략하고, 파일에서 멤버 아이디를 읽어와서 해당 아이디로 검색하고, 해당하는 게시글의 개수를 구해서 저장하는 루틴이다.



결론적으로 네이버 카페도 Selenium과 Beautiful Soup, 그리고 크롬 개발자 도구를 이용해 원하는 작업을 대부분 자동화시킬 수 있을 것으로 보인다. 다만 대부분 iframe 안에서 테이블 리스트 구조로 컨텐츠가 되어 있고 한 화면에 최대로 보여줄 수 있는 리스트의 수가 정해져 있어, 여러 페이지로 결과물이 나오게 될 경우 페이지를 넘겨 가며 작업하는 루틴을 짜는 것이 좀 번거로울 듯 하다.


참고한 글
1. 나만의 웹 크롤러 만들기(3): Selenium으로 무적 크롤러 만들기
2. Django selenium으로 iframe 내부에 접근하기
3. Beautiful Soup 4.4.0 documentation
4. http://selenium-python.readthedocs.io/waits.html
5. 블로그 등에 소스 코드 Snippet 붙여넣기 - GitHub Gist

2014년 7월 26일 토요일

스마트폰 잠금 2분 안에 풀린다고?

** 업데이트 **

제작 피디님과 추가적으로 확인한 결과, 제가 아래에서 "화면 잠금 상태에서 쉽게 할 수 없다"고 했던 그 루팅을 학생들이 실제 했다고 합니다. 아래 피디님의 댓글에도 있지만 사전에 USB디버깅 활성화나 루팅이 되어 있지 않은 상태에서 화면을 잠그고 학생들에게 전달했고, 학생들이 이를 풀었다고 합니다. 인터뷰시 제게 보여준 영상은 이미 루팅이 되어 있는 상태에서 패스워드 파일을 지우는 것 뿐이었기 때문에 제가 오해를 했던 것 같습니다.

아직 이 학생들이 구체적으로 어떤 방법으로 루팅에 성공했는지는 파악하지 못했으나, 그것이 가능했다면 이는 매우 심각한 문제가 아닐 수 없습니다. 다만 이러한 형태의 루팅은 대개 특정 제조사의 특정 버전에 존재하는 알려지지 않은 버그를 이용하는 방식이라, 모든 안드로이드폰에 일괄적으로 적용 가능한 것은 아닐 것으로 생각됩니다. 해당 허점이 최신 버전의 안드로이드에서는 이미 개선되어 있을 수도 있으나, 구체적인 정보가 파악되는 대로 문제를 파악해 필요한 조치를 취하도록 하겠습니다.

** 추가 업데이트 **

자체적으로 분석하여 파악한 문제점에 대해 수정 조치하였습니다. 하고 싶은 말은 많으나 이쯤에서 마무리합니다.


-------------------------------------------------------------------------

오늘 KBS 추적60분에서 스마트폰 보안에 대해 다뤘다. 경각심을 불러 일으키기 위한 문제제기는 잘 했다고 본다. 그런데 방송 중간에 화면 잠금을 설정하고 고등학생들을 불러다 2분 안에 풀 수 있다고 하는 장면이 나왔는데, 이 부분은 오해의 소지가 있다. 나도 잠깐 인터뷰에 나왔는데, 약 1시간에 걸친 인터뷰 중 10초만 잘라서 나간거라 충분히 설명이 되지 않은 부분이 많다. 이번 기회에 스마트폰, 특히 안드로이드 스마트폰 보안에 대해 간략히 정리해 볼까 한다. 단 아래 내용은 LG전자의 공식 입장과는 무관한, 내 개인적인 견해임을 먼저 밝혀두고자 한다.

1. 방송에 나오지 않은 장면

방송 중 화면 잠금을 푸는 장면에서, 원래 영상에는 구체적으로 adb를 이용해서 잠금을 푸는 컴퓨터 화면이 등장했었다. 여기서 잠깐 adb에 대해 간략하게 설명하자면, 안드로이드 개발자를 위한 도구다. 커맨드를 입력할 수 있고 리눅스 쉘도 띄울 수 있다. 쉽게 말해 윈도우로 치면 도스 커맨드창 같은 그런 역할을 하는 거다. 그런데 학생들이 사용하는 adb shell의 프롬프트가 #로 되어 있었다. 이게 무슨 소리야 하는 분들을 위해 설명하자면, 해당 단말은 이미 루팅이 되어 있는 상태라는 것이다. 방송에서 "어떻게 풀었는지?" 인터뷰하는 장면이 나오는데 학생은 "비밀번호가 설정된 파일을 지웠다."고 설명한다. 실제 adb 동작하는 화면을 안 봤더라도 여기서 쉽게 유추할 수 있는데, 이 비밀번호를 저장하고 있는 파일은 루트 (관리자) 권한으로만 접근할 수 있다. 즉 일반 사용자 권한으로는 해당 파일을 삭제할 수 없고, 당연히 잠금도 풀 수 없다.

2. 정말 그렇게 쉽게 단말의 잠금을 풀 수 있나?

모든 안드로이드 폰이 방송에 나온 것처럼 "고등학생들도 아무나 인터넷에서 툴을 다운받아서 2분안에" 쉽게 풀리는 것이 아니다. 몇가지 이유가 있다.
  • adb 연결이 불가능하다 - 방송에서 내 인터뷰가 나간 장면인데, 긴 인터뷰 중 그 부분만 전후 설명없이 나가서, 뜬금없이 USB디버깅이 어쩌고 하는 것이 시청자 입장에서는 무슨 소리인가 했을 가능성이 높다. 쉽게 말하자면, 일반적인 소비자가 쓰고 있는 폰은 USB 케이블을 통해 컴퓨터와 연결해도, adb 실행을 시킬 수 없다. 설정 메뉴에서 "USB디버깅 허용"을 미리 활성화해야 adb 연결이 되기 때문이다. 이걸 사전에 미리 활성화해 놓지 않았다면, 화면이 잠겨 있는 상태에서는 활성화할 수 없다. 더구나 최신 안드로이드 버전에서는, 설령 해당 메뉴가 활성화되어 있다 하더라도, 컴퓨터에서 adb 접속 시도시 폰에서 허용 여부를 묻는 확인 팝업이 뜨게 되어 있다. 화면 잠김 상태에서는 이를 허용하게 할 수 없다.
  • 루팅되지 않은 단말은 잠금화면 초기화가 되지 않는다 - 방송에서는 패턴락이나 PIN, 패스워드를 저장하고 있는 파일을 지워버려서 초기화시킨 것인데, 루팅되지 않은 단말은 그렇게 되지 않는다. 설령 컴퓨터와 adb 연결이 되었다 하더라도, 파일 삭제를 시도해도 파일이 삭제되지 않는다. 권한이 없다는 에러 메시지만 뜬다.
  • 루팅을 쉽게 할 수 없다 - 앞에서 말한대로 방송에 사용된 폰은 사전에 루팅이 되어 있는 상태였다. 그럼 루팅이 안되어 있던 단말을 누군가 루팅할 수는 없을까? 루팅은 비교적 쉽게 할 수 있다고 알려져 있지만, 인터넷에 알려진 대부분의 루팅 방법은 사용자가 자기 폰에 대한 완전한 지배권을 이미 갖고 있는 상태를 가정한 것이다. 화면이 잠겨 있으면 이중 대부분이 무용지물이다. 물론 100% 불가능하다고 말하지는 않겠다. 원래 보안이란게 그렇다. 하지만, 절대 그렇게 쉽게 루팅이 되지는 않는다.

3. 안드로이드 폰을 안전하게 쓰려면?

솔직히 안드로이드 폰은 약간은 기술적인 지식이 있는 사용자를 대상으로 설계된 측면이 강하다. 따라서 많은 부분을 사용자의 선택에 맡겨 두고 있다. 아이폰에서는 탈옥이라는 방법을 통하지 않고는 할 수 없는 임의의 앱 설치 (애플 앱스토어를 통하지 않은 앱 설치)가 간단한 메뉴 설정 하나로 허용되는 것만 봐도, 컨셉 자체가 다르다는 것을 알 수 있다. 따라서 안드로이드 폰을 안전하게 사용하려면 최소한의 관심과 지식이 필요한 것이 사실이다. 대략 아래에 나와 있는 사항들만 잘 지켜도 큰 위험 없이 안드로이드를 사용할 수 있을 것이다.
  • 화면 잠금 반드시 설정할 것 : 이건 안드로이드와도 관계 없고, 어떤 스마트폰이든 반드시 해야 하는 일이다. 잠겨 있지 않은 폰을 잠시라도 다른 사람의 손에 들어갈 수 있게 허용하는 건 내 목숨을 다른 사람에게 내맡기는 격이다.
  • 루팅하지 말 것. 최소한 루팅 상태로 두지 말 것 : 이런 저런 목적에 의해서 루팅을 할 수도 있다. "내 소유 기기의 관리자 권한을 내가 갖겠다는 데 왜 막냐"고 하면 할 말 없다. 그러나 적어도 루팅을 하려면 기술적으로 자기가 무엇을 하고 있는지 정확히 알아야 하고 그에 따른 위험도 인지해야 한다. 루팅한 단말은 제조사에서 무상수리도 받을 수 없다. 그리고 만약 루팅을 했다면, 원하던 루팅의 목적을 달성했으면 다시 일반 사용자 모드로 돌려놓기 바란다. 항상 루팅 상태로 쓰는 것은 폰을 위험에 상시 노출시키는 것이다.
  • USB디버깅 허용하지 말 것 : 이건 사실 무슨 말인지 모르면 허용 안되어 있는 것이다. 이걸 허용하려면 설정 메뉴의 개발자 옵션에 들어가야 하는데, 최근 안드로이드 버전은 이 개발자 옵션 자체가 숨겨져 있다. 개발자라서 필요하다면, 어떤 이유로든 허용했다면, 평소에는 다시 비활성화해 놓고 다니기 바란다.
  • 알 수 없는 출처 앱 설치 허용하지 말 것 : 앞의 항목들이 물리적으로 폰을 잃어버리는 상황을 대비한 거라면, 이 항목은 내가 갖고 있어도 해킹당할 수 있다는 가능성에 대비하는 것이다. 이 옵션은 사실 완전히 없애버렸으면 좋겠는데, 황당하게도 은행 앱이나 회사에서 보안을 필요로 하는 앱을 설치하려면 이 설정을 허용으로 바꿔야 하는 경우가 많다. 꼭 필요한 앱에 한해, 출처를 100% 확신하는 경우에만 허용하자. 그리고 원하는 앱 설치가 끝났으면 반드시 다시 설정 메뉴에 들어가 이 설정을 해제해야 한다. 이게 허용으로 되어 있으면, 이상한 URL 클릭하면 바로 설치가 되어 버린다. 그 순간 이미 게임 끝난 거다.
  • 이상한 URL 클릭하지 말 것 : 해킹 앱을 설치하는 URL은 물론이고, 브라우저의 버그를 이용하는 해킹 사이트로 유도하거나, 사용자의 정보를 캐내기 위한 피싱 사이트로 유도할 수도 있다. 아무튼 잘 아는 지인이 대화를 주고받다가 보내주는 URL이 아닌 이상, 뜬금없이 URL만 달랑 오는 경우 십중팔구 그 지인도 해킹을 당해서 URL을 뿌리고 있는 거라고 보는 게 맞다. 클릭하기 전에 먼저 지인에게 무슨 내용인지 확인하는 건 필수다.
  • SW는 최신으로 유지할 것 : 구글에서는 보안 관련 위험성이 발견되면 지속적으로 패치를 내놓고 있다. 제조사에서는 이러한 구글의 패치와 자체적으로 발견한 문제점 패치들을 SW 업데이트에 포함시켜서 릴리즈한다. 비록 SW업데이트 설명에는 포함되지 않는 경우가 대부분이지만, 매 SW 업데이트는 이러한 다양한 보안 패치들을 포함하고 있으니 꼬박꼬박 최신 SW로 업데이트하도록 하자.
  • 중요한 정보 폰에 저장하지 말 것 : 주민등록증, 보안카드 등을 촬영해 저장한다거나, 공인인증서를 폰에 저장한다거나, 이런 일들은 가급적 안하는 게 좋다. 위에서 이야기한 걸 다 지키고 만반의 대비를 하더라도 만에 하나 그런 것들이 다 뚫려버렸을 때, 피해를 최소화하기 위해서다. 
  • 추가 보안 장치들
    • 킬 스위치 - 분실/도난시 원격으로 폰을 잠궈버려 USB연결은 물론 리커버리 모드나 강제 공장초기화도 불가능하게 만드는 것이다. 이렇게 잠기게 되면 잠김을 푸는 것 뿐 아니라, 중고로 파는 것도 불가능하다. G3를 비롯해 최신 폰들은 이런 서비스를 제공하고 있으니 확인해 볼 것. 단, 이것만 믿고 화면잠금도 설정 안한다거나 하면 곤란하다. 잃어버린 후 잠그기 전까지는 무방비 상태이고, 이 상황에서 폰을 끄거나 통신이 안되는 지하실로 가져가거나 한다면 원격으로 잠그는 명령이 폰에 도달하지 못하기 때문에 잠기지 않기 때문이다.
    • USIM 비밀번호(PIN) - 분실/도난시 폰은 안전하게 잘 잠겨 있더라도, USIM을 빼서 다른 기기에 옮겨 꽂으면 번호는 그대로 사용이 가능하다. 통신사에 분실정지를 시키기 전까지는 소액결재나 정보이용료, 본인인증에 따른 명의 도용까지 다양한 문제가 발생할 수 있다. 즉시 분실정지를 시키면 되지만 분실된 사실을 뒤늦게 알게 되는 경우 피해를 입을 수 있다. 이런 피해를 막으려면 USIM에 비밀번호를 설정하면 된다. USIM 비밀번호는 네자리로 아주 강한 비밀번호는 아니지만, 세번 연속 실패하면 더이상 시도할 수 없게 잠겨버리기 때문에 안전하다고 할 수 있다.
    • 데이터 암호화 - 요즘 안드로이드 폰은 데이터를 암호화할 수 있는 기능을 제공한다. 암호화된 데이터는 본인이 설정한 비밀번호로 풀지 않는 이상 해독해 낼 수 없다. 따라서 폰을 잃어버리더라도, 데이터가 유출될 위험으로부터는 안전하다. 다만 비밀번호를 잊어버리면 데이터를 살릴 방법은 없으니 (서비스센터에서도 불가) 주의하자.
혹시 잘못된 점이나 궁금한 점이 있으면 코멘트 남겨 주시길...