특수문자보다 길이: 비밀번호 강도를 비트로 계산하는 법
대문자·숫자·특수문자 규칙을 지킨 비밀번호가 여전히 약한 이유, 엔트로피로 강도를 계산하는 방법, 패스프레이즈, NIST가 바꾼 비밀번호 권고와 2단계 인증을 정리했습니다.
회원가입 화면에 “영문 대소문자, 숫자, 특수문자를 포함해 8자 이상”이라는 조건이 뜹니다. 몇 번 거절당한 끝에 Password1!을 입력하면 초록색 체크 표시가 나옵니다. 규칙은 모두 지켰습니다. 그런데 이 비밀번호는 유출된 비밀번호 목록에서 가장 먼저 시험해 보는 부류에 들어갑니다.
규칙을 지켰는데 왜 약할까
문자 종류 규칙은 “사람들이 다양한 문자를 고르게 섞어 쓸 것”을 기대합니다. 실제 사람들은 그렇게 하지 않습니다. 대문자는 맨 앞에, 숫자는 끝에, 특수문자는 ! 하나를 맨 뒤에 붙입니다. a를 @로, o를 0으로 바꾸는 식의 치환도 공격 도구가 제일 먼저 적용하는 규칙입니다. 규칙이 비밀번호를 복잡해 보이게 만들 뿐, 추측하기 어렵게 만들지는 못하는 셈입니다.
그래서 비밀번호의 강도는 “무엇이 들어 있느냐”가 아니라 **“몇 번 만에 맞힐 수 있느냐”**로 따져야 합니다.
강도를 비트로 세기
비밀번호를 무작위로 만든다면 가능한 조합의 수는 계산할 수 있습니다. 사용할 수 있는 문자가 N종류이고 길이가 L이면 조합은 N^L개입니다. 이 수를 2의 거듭제곱으로 나타낸 지수, 즉 log₂(N^L) = L × log₂N을 엔트로피라고 하고 비트 단위로 셉니다.
- 소문자 26종류로 8자: 8 × log₂26 ≈ 37.6비트
- 대소문자·숫자·특수문자 25개를 합친 87종류로 8자: 8 × log₂87 ≈ 51.5비트
1비트가 늘 때마다 공격자가 시험해야 할 수는 두 배가 됩니다. 38비트와 52비트는 14비트 차이, 약 16,000배 차이입니다.
그래프에서 눈여겨볼 곳은 소문자만 쓴 16자(75.2비트)가 온갖 문자를 섞은 8자(51.5비트)보다 훨씬 강하다는 점입니다. 문자 종류를 26개에서 87개로 세 배 넘게 늘려도 한 글자당 약 1.7비트가 더해질 뿐이지만, 글자를 하나 늘릴 때마다 4.7~6.4비트가 더해집니다.
감이 오도록 시간으로 바꿔 보겠습니다. 유출된 해시를 오프라인에서 1초에 100억 개씩 시험할 수 있다고 가정하면, 모든 조합을 다 시도하는 데 걸리는 시간은 다음과 같습니다.
| 비밀번호 | 엔트로피 | 전부 시도하는 데 |
|---|---|---|
| 소문자 8자 | 37.6비트 | 약 21초 |
| 87종류 8자 | 51.5비트 | 약 3.7일 |
| 단어 5개 | 64.6비트 | 약 89년 |
| 87종류 12자 | 77.3비트 | 약 59만 년 |
초당 100억 번은 SHA-256처럼 빠른 해시로 저장된 경우를 떠올린 가정입니다. 서비스가 bcrypt나 Argon2id처럼 일부러 느린 해시를 썼다면 공격 속도는 훨씬 떨어집니다(해시 함수 글 참고). 어느 쪽이든, 사용자가 통제할 수 있는 것은 길이입니다.
한 가지 주의할 점이 있습니다. 이 계산은 비밀번호를 무작위로 만들었을 때만 성립합니다. Password1!은 87종류 10자라서 공식상 64비트가 넘지만, 실제로는 공격 사전의 앞부분에 있으므로 몇 초도 버티지 못합니다. 사람이 머리로 지어낸 비밀번호에는 이 공식을 적용할 수 없습니다.
외우기 쉬운 긴 비밀번호, 패스프레이즈
무작위 16자는 강하지만 외우기 어렵습니다. 대안이 무작위로 고른 단어 여러 개를 이어 붙이는 패스프레이즈입니다. 주사위로 단어를 고르는 다이스웨어(Diceware) 방식이 대표적인데, 전자프론티어재단(EFF)이 공개한 7,776개(주사위 5개의 조합 수, 6⁵) 단어 목록을 쓰면 단어 하나가 약 12.9비트입니다. 단어 6개면 77.5비트로, 87종류에서 무작위로 고른 12자와 비슷합니다.
핵심은 단어를 직접 고르지 않는 것입니다. 좋아하는 노래 가사나 유명한 문장은 무작위가 아니므로 공식이 적용되지 않습니다. EFF 목록은 영어 단어로 되어 있습니다. 한국어 단어로 만들어도 원리는 같지만, 서비스에 따라 비밀번호에 한글을 받지 않는 곳이 있으니 확인이 필요합니다.
권고도 바뀌었다
미국 국립표준기술연구소(NIST)의 디지털 신원 가이드라인(SP 800-63B, 2025년 7월에 확정된 4차 개정판)은 오랫동안 당연하게 여겨지던 규칙을 여럿 뒤집었습니다.
- 비밀번호 하나만으로 로그인하는 경우 최소 15자, 다른 인증 수단과 함께 쓰는 경우 최소 8자로 합니다.
- 최대 길이는 적어도 64자까지 허용하는 것이 좋습니다.
- 대문자·숫자·특수문자를 반드시 섞으라는 식의 조합 규칙을 강제하지 않습니다.
- 정기적인 변경을 요구하지 않습니다. 유출된 증거가 있을 때만 바꾸게 합니다.
- 대신 새 비밀번호를 유출된 비밀번호, 사전 단어,
aaaa나1234같은 반복·연속 문자열 목록과 대조해 걸러 냅니다.
3개월마다 바꾸라고 하면 사람들은 Spring2026! 다음에 Summer2026!을 씁니다. 변경 주기가 오히려 예측 가능한 비밀번호를 만든다는 판단입니다.
비밀번호 하나에 모든 것을 걸지 않기
아무리 강한 비밀번호도 여러 사이트에서 같이 쓰면 소용이 없습니다. 한 곳에서 유출되면 공격자는 같은 이메일과 비밀번호를 다른 서비스에 차례로 넣어 봅니다(크리덴셜 스터핑). 사이트마다 다른 비밀번호를 쓰려면 사람의 기억력으로는 부족하므로, 비밀번호 관리자가 사실상 필수입니다. 관리자의 마스터 비밀번호 하나만 긴 패스프레이즈로 외우고, 나머지는 관리자가 만들고 기억하게 하는 방식입니다.
그리고 중요한 계정에는 2단계 인증을 켭니다. 인증 앱의 6자리 코드는 비밀번호가 유출되어도 로그인을 막아 줍니다. 문자 메시지 인증은 유심 복제 같은 공격에 약해서 인증 앱보다 한 단계 아래로 봅니다. 지원하는 서비스라면 패스키(Passkey)가 가장 좋습니다. 가짜 사이트에서는 아예 작동하지 않아 피싱에 강합니다.
비밀번호 생성기로 만들어 보기
비밀번호 생성기는 브라우저의 암호학적 난수(crypto.getRandomValues)로 비밀번호를 만듭니다. 길이와 문자 종류(소문자, 대문자, 숫자, 특수문자)를 고르면 이 글과 같은 방식으로 계산한 대략의 비트 수를 함께 보여 줍니다. I, l, 1, O, 0처럼 헷갈리는 글자를 빼는 옵션도 있습니다. 길이를 8에서 16으로 바꿔 보면 숫자가 얼마나 뛰는지 바로 보입니다. 만든 비밀번호는 서버로 보내지도, 저장하지도 않습니다.
참고
- NIST SP 800-63B-4, Digital Identity Guidelines: Authentication and Authenticator Management (2025)
- EFF, “EFF Dice-Generated Passphrases” (단어 목록)
- OWASP, Authentication Cheat Sheet