비밀번호는 어떻게 해킹되는가?
영화에서 묘사되는 것처럼 계정이 해킹되는 일은 거의 없습니다. 실제 환경에서 공격자가 비밀번호를 얻는 경로는 대개 세 가지 중 하나입니다. 첫째는 크래킹으로, 서비스에서 탈취한 비밀번호 해시 데이터베이스를 상대로 후보 값을 하나씩 대입하여 알아내는 방식입니다. 둘째는 탈취로, 피싱 페이지에 사용자가 직접 입력하게 하거나 악성코드로 복사해 빼돌리는 방식입니다. 셋째는 재사용으로, 과거에 유출된 비밀번호를 가져와 피해자가 다른 서비스에서도 같은 암호를 사용했을 것이라 기대하고 대입해 보는 방식입니다. 이 세 가지 방식은 각각 대응하는 방어책이 완전히 다르기 때문에 명확히 구분해야 합니다. 이 글에서는 주요 공격 수법을 살펴보고 각각에 효과적인 대응책을 소개합니다.
데이터 유출을 통한 비밀번호 재사용
해마다 수많은 서비스에서 보안 침해 사고가 발생하며, 사용자 데이터베이스가 유료로 판매되거나 공개 포럼에 유출됩니다. 공격자는 유출된 이메일 주소와 비밀번호 조합을 확보한 뒤 은행, 포털 메일, 온라인 쇼핑몰, 소셜 네트워크 등에 자동으로 대입해 보는데, 이러한 공격을 크리덴셜 스터핑이라고 부릅니다. 이 과정에는 어떠한 추측 작업도 필요하지 않으며, 사람들이 비밀번호를 재사용한다는 단순한 이유 하나 때문에 성공합니다. 모든 곳에서 동일한 비밀번호를 쓴다면 아무리 복잡한 비밀번호라도 무용지물이 됩니다.
도움이 되는 방법: 모든 계정마다 서로 다른 고유한 비밀번호를 사용하는 것입니다. 이렇게 하면 특정 서비스에서 유출 사고가 발생하더라도 다른 계정으로 피해가 번지지 않습니다.
피싱
피싱 페이지는 계정 정지, 택배 배송 안내, 인보이스 청구 등 긴급하게 느껴지는 이메일이나 메시지의 링크를 통해 연결되는, 정상 로그인 페이지를 교묘하게 모방한 가짜 웹사이트입니다. 사용자가 그곳에 입력하는 모든 정보는 공격자에게 즉시 전송됩니다. 비밀번호를 본인이 직접 타이핑하기 때문에 비밀번호의 길이나 무작위성은 아무런 보호막이 되지 못합니다.
도움이 되는 방법: 메시지에 포함된 링크 대신 직접 저장해 둔 북마크를 통해 사이트에 접속하십시오. 비밀번호 관리자를 사용하는 것도 효과적입니다. 관리자는 사전에 저장된 도메인 주소에서만 비밀번호 자동 입력을 제안하므로, 저장된 비밀번호가 뜨지 않는다면 직접 손으로 입력하기 전에 주소창을 반드시 다시 확인해야 합니다. 또한 2단계 인증을 활성화하면 비밀번호가 노출되더라도 공격자가 바로 로그인할 수 없습니다. 다만 일회용 인증 코드는 비밀번호와 마찬가지로 피싱에 속아 넘어갈 수 있습니다. 반면 패스키와 FIDO2 보안 키는 오직 검증된 진짜 사이트에만 반응하므로 가짜 사이트에 탈취되지 않으며, NIST는 이러한 특성을 피싱 저항성이라고 정의합니다.
악성코드
정보 유출 악성코드라고 불리는 악성 프로그램은 브라우저에 저장된 비밀번호와 세션 쿠키를 복사하여 실행 후 수 초 만에 외부로 전송하며, 키로거는 키보드로 입력되는 모든 내용을 기록합니다. 탈취된 세션 쿠키를 이용하면 공격자는 비밀번호나 2단계 인증 없이도 이미 로그인되어 있는 피해자의 계정에 곧바로 접근할 수 있습니다. 이러한 악성 프로그램은 대개 불법 복제 소프트웨어, 가짜 업데이트 파일, 이메일 첨부 파일을 통해 유입됩니다.
도움이 되는 방법: 소프트웨어는 공식 배포처에서만 다운로드하고, 운영체제와 브라우저를 항상 최신 상태로 유지하며, 예상치 못한 첨부 파일은 위험한 것으로 간주하십시오. 다만 이러한 수칙도 완전한 방패가 되지는 못합니다. 기기가 감염되었다면 안전이 확인된 다른 깨끗한 기기에서 조치를 취해야 합니다. 비밀번호를 변경하고, 각 서비스의 모든 세션 로그아웃 기능을 실행하며, 복구용 이메일, 전화번호, 2단계 인증 설정이 임의로 변경되지 않았는지 점검하십시오. 감염된 기기는 완전히 포맷하고 치료한 후에 다시 로그인해야 합니다.
로그인 화면에서의 무작위 대입
웹사이트의 로그인 입력창에 비밀번호를 직접 대입해 보는 것은 매우 느린 방식입니다. 정상적인 서비스라면 로그인 실패가 몇 번 반복되면 접속을 지연시키거나 차단하고 캡차 입력을 요구하기 때문입니다. 따라서 단일 계정을 지속적으로 공격하는 것은 비효율적이며, 그 반대의 접근법이 널리 쓰입니다. 바로 123456, password, qwerty123과 같은 가장 대중적인 비밀번호 몇 개를 골라 수백만 개의 계정에 한 번씩 대입해 보는 수법으로, 이를 패스워드 스프레잉이라고 합니다. 또한 자녀나 반려동물의 이름, 생일, 응원하는 스포츠 팀 등 소셜 미디어에서 쉽게 찾을 수 있는 개인정보를 활용한 표적형 추측 공격도 같은 방식으로 이루어집니다.
도움이 되는 방법: 흔한 비밀번호를 피하고 자신에 관한 개인정보로 비밀번호를 조합하지 않는 것입니다. 자세한 내용은 강력한 비밀번호를 만드는 방법을 참조하십시오.
유출된 해시에서 오프라인으로 비밀번호 알아내기
올바르게 구축된 서비스는 비밀번호를 일반 텍스트 형태로 저장하지 않고 원래의 값을 역산할 수 없는 단방향 함수의 결과값인 해시 형태로 저장합니다. 그러나 이러한 해시 데이터베이스가 유출되면 공격자는 가능한 비밀번호 후보들의 해시값을 자신의 하드웨어에서 직접 계산한 뒤 유출된 데이터와 대조해 보며 원래 암호를 알아냅니다. 이 과정에는 속도를 제한하는 웹 로그인 폼이 전혀 없으므로 해독 속도는 서비스가 선택한 해시 함수의 종류와 설정에 좌우됩니다. MD5처럼 빠르고 오래된 구형 함수의 경우 최신 그래픽 카드 단 한 장만으로도 초당 수백억 개의 후보를 대입할 수 있습니다. 반면 비밀번호 저장을 위해 고안된 Argon2id나 구형 시스템의 bcrypt와 같은 함수는 의도적으로 연산 속도를 늦추어 대입 속도를 몇 자릿수만큼 떨어뜨리며, 이것이 바로 현재의 보안 권고안에서 이들 알고리즘을 지정하는 이유입니다.
사전 공격
공격자가 대입하는 비밀번호 후보들은 무작위가 아닙니다. 크래킹 도구는 이전 유출 사고에서 수집된 실제 비밀번호 목록과 단어, 이름 사전에서 출발한 뒤, 첫 글자 대문자화, 끝에 연도나 느낌표 추가, 유사 기호 치환 등 인간의 습관을 모방한 규칙을 적용합니다. Summer2024!와 같은 비밀번호는 복잡해 보이지만 공격 프로그램이 가장 먼저 대입해 보는 후보군에 속합니다. 비밀번호를 해싱하기 전에 고유한 무작위 값인 솔트를 추가하는 솔팅 작업은 공격자가 사전 계산된 레인보우 테이블을 사용하거나 동일한 비밀번호를 동시에 한꺼번에 푸는 것을 차단하지만, 예측 가능한 비밀번호를 덜 예측 가능하게 만들어 주지는 못합니다.
무차별 대입 공격
사전 기반의 대입이 모두 실패하면 마지막으로 남는 방법은 모든 가능한 문자 조합을 하나씩 시도하는 것이며, 무작위로 생성된 비밀번호의 경우 길이가 성패를 좌우합니다. 이해를 돕기 위해 공백을 제외한 94개의 인쇄 가능한 ASCII 문자에서 각 문자가 독립적이고 동일한 확률로 선택되는 빠른 해시 환경을 가정해 보겠습니다. 8자리 비밀번호의 경우 가능한 조합은 약 6 × 1015개에 달하며, 초당 백억 개의 대입 속도라면 전체를 시도하는 데 약 일주일이 걸리고 평균적으로 그 절반의 시간 안에 정답이 찾아집니다. 하지만 길이가 12자리로 늘어나면 동일한 하드웨어에서 모든 조합을 시도하는 데 약 150만 년이 걸리며, 16자리의 경우 비교 자체가 무의미할 정도로 천문학적인 시간이 걸립니다. 이것이 바로 길고 무작위적인 비밀번호를 사용해야 하는 명확한 이유입니다. 사전은 거의 쓸모가 없으며, 앞서 언급한 조건에서도 모든 조합을 시도하는 것은 현실적으로 불가능하기 때문입니다. 당사의 강력한 비밀번호 생성기는 브라우저 내에서 안전하게 암호를 생성하며 각 비밀번호의 엔트로피 추정치를 비트 단위로 보여줍니다.
도움이 되는 방법: 인간의 패턴이 전혀 들어가지 않은 긴 비밀번호를 사용하는 것이며, 이는 실제로는 생성기로 만든 암호를 뜻합니다. 서비스가 비밀번호를 어떻게 보관하는지는 사용자가 통제할 수 없으므로, 최악의 상황을 가정하고 빠른 해시 함수로 저장되더라도 추측 공격을 견뎌낼 수 있는 안전한 비밀번호를 선택해야 합니다.
어깨너머 훔쳐보기와 사회공학적 기법
가장 오래된 비밀번호 탈취 수법에는 어떤 첨단 기술도 필요하지 않습니다. 등 뒤에서 어깨너머로 입력을 훔쳐보거나, 모니터에 붙은 메모지를 보거나, 화상 통화 중 공유된 화면을 통해 유출되기도 합니다. 혹은 지원팀 직원이나 동료를 사칭하여 직접 비밀번호를 물어보는 이른바 사회공학적 기법이 사용되기도 합니다. 정상적인 서비스라면 전화, 이메일, 채팅을 통해 고객의 비밀번호를 묻는 일이 절대 없습니다.
도움이 되는 방법: 비밀번호를 다른 사람에게 말하거나 메시지로 전송하지 않고, 타인의 눈에 띄는 장소에 적어두지 않는 것입니다.
핵심 종합
다양한 공격 수법에는 각각에 맞는 보안 습관으로 대응해야 하며, 그중 세 가지가 가장 큰 역할을 합니다. 모든 계정에 사람이 지어낸 것이 아닌 생성기로 만든 고유한 비밀번호를 사용하고, 그 위에 2단계 인증을 적용하며, 서비스가 지원하는 경우 비밀번호 대신 패스키를 사용하는 것입니다. 물론 이 방법들로도 탈취된 세션 쿠키와 같은 모든 위협을 막을 수는 없으므로 앞서 언급한 악성코드 예방 수칙을 함께 실천하는 것이 중요합니다. 더 많은 관련 글은 비밀번호 생성기 자료에서 확인하실 수 있습니다.