505. 비밀번호 저장 방식 - KDF(Key Derivation Function) 활용 (PBKDF2, bcrypt, scrypt, Argon2) 및 솔트(Salt) 적용
핵심 인사이트 (3줄 요약)
- 본질: 고객의 비밀번호는 암호화(Encryption)해서 저장하는 것이 아니다. 관리자도 절대 원본을 풀어서 볼 수 없도록 영원한 블랙홀인 **일방향 해시(One-way Hash)**로 뭉개버리되, 해커의 슈퍼컴퓨터를 비웃듯 무작위 쓰레기값(Salt)을 섞고 연산을 미친 듯이 10만 번 꼬아버리는(Key Stretching) KDF(키 유도 함수) 방어 아키텍처다.
- 가치: 세상에 절대 안 털리는 DB는 없다. 해커가 우리 회사의
users테이블을 통째로 USB에 담아 훔쳐 도망갔을 때(최악의 상황 가정 - Zero Trust), 해커가 훔쳐 간 해시 암호문($2a$10$...)을 원본 비밀번호(1234)로 되돌리는 데 100만 년이 걸리게 만들어, 고객의 타 사이트 연쇄 해킹(크리덴셜 스터핑)이라는 치명적 2차 재앙을 100% 물리적으로 차단한다.- 융합: 단순한 고속 해시(MD5, SHA-256)의 태생적 맹점을 파괴하기 위해 고안되었으며, 해커의 GPU 병렬 연산(무차별 대입)을 박살 내기 위해 의도적으로 서버의 CPU와 메모리를 갉아먹게 설계된 Bcrypt, Scrypt, Argon2 알고리즘이 데브옵스의 인증 프레임워크(Spring Security) 코어에 강제로 융합되어 국룰(Standard)로 자리 잡았다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: 사용자가
password123치고 회원가입을 한다. DB에 이걸 그대로 넣으면 미친 회사다. 그래서 믹서기(해시)에 넣고 갈아서A8bC9...로 만들어 저장한다. 나중에 로그인할 때 다시password123을 치면 믹서기에 한 번 더 갈아보고, 뱉어낸A8bC9...가 DB와 똑같으면 "오! 통과!" 시켜주는 게 기본 원리다. 근데 일반 믹서기(SHA-256)는 너무 빨리 돌아서, 해커가 세상의 모든 단어를 다 갈아서 엑셀(레인보우 테이블)로 만들어놓고 역추적을 해버렸다. 그래서 **"소금(Salt)을 한 줌 뿌려서 레인보우 테이블을 맹인으로 만들고, 믹서기를 10만 번 뻑뻑하게 돌려(Stretching) 해커의 해독 속도를 기어 다니게 만드는 특수 믹서기(KDF)"**가 탄생했다. -
필요성: 2010년대 넥슨, 네이트 등 대한민국의 거대 플랫폼들이 줄줄이 털렸다. 고객 수천만 명의 아이디와 비밀번호가 몽땅 중국 다크웹에 풀렸다. 사람들은 귀찮아서 모든 사이트(은행, 게임, 메일)의 비번을 통일해서 쓴다. A사이트(허접한 곳)가 털렸는데, B은행(철통 보안) 내 계좌의 돈이 해커에게 인출되는 기가 막힌 참사(Credential Stuffing)가 도미노처럼 번졌다. **"우리 회사가 털리는 건 어쩔 수 없지만, 우리 때문에 고객의 다른 은행 계좌가 털리는 2차 가해(책임)는 무조건 막아야 한다"**는 무거운 윤리적, 법적 책무(KISA 가이드라인 2번)가 이 무자비한 비밀번호 해싱 기술을 멱살 잡고 끌어올렸다.
-
💡 비유: 비밀번호 저장은 마피아(해커)에게 쫓기는 목격자 얼굴(비밀번호)을 숨기는 **'증인 보호 프로그램'**과 같습니다.
- 평문 저장: 목격자 얼굴을 길거리에 그냥 내놓고 다니는 미친 짓.
- 단순 해시(SHA-256): 목격자 얼굴에 선글라스 하나 씌워놓음. 마피아가 몽타주 책(레인보우 테이블)을 쓱 넘겨보면 1초 만에 누군지 알아챔.
- Salt + KDF (Bcrypt): 목격자 얼굴에 염산(Salt)을 부어서 아예 뼈까지 녹여버리고, 붕대로 10만 겹(Stretching) 칭칭 감아 미이라로 만들어버리는 잔혹하지만 완벽한 수술입니다. 마피아가 미이라를 훔쳐 가도, 붕대를 1장 푸는 데 1년이 걸리게 만들어(느린 연산 속도 강제) 결국 누군지 밝혀내는 것을 수학적으로 포기하게 만드는 징그러운 방어술입니다.
-
등장 배경 및 발전 과정:
- 고속 해시의 딜레마 (SHA-256의 몰락): SHA-256은 원래 "데이터가 안 깨지고 잘 왔는지 1초 만에 빛의 속도로 검사" 하려고 만든 착한 함수다. 해커가 비트코인 채굴기(GPU) 1,000대를 끌고 와서 이 함수로 초당 수천억 개의 비밀번호를 쳐보며(Brute-force) 정답을 맞춰버렸다. "빠르다"는 게 해커에게 축복이 된 역설이 터졌다.
- Bcrypt와 Scrypt의 구원 (방어적 늦춤): "해커를 열받게 하려면 암호화 속도를 고의로 똥컴처럼 느리게 만들면 되잖아!" 브루스 슈나이어 등 암호학의 신들이 일부러 연산을 복잡하게 꼬아서 CPU를 질척거리게 파먹는
Bcrypt를 만들었고, 이것이 수십 년간 1티어를 지켰다. - Argon2의 왕좌 등극 (현재): 해커가 CPU 대신 그래픽카드(GPU/ASIC)를 사서 무식하게 병렬로 돌리자 Bcrypt도 위협받았다. 2015년 전 세계 해시 대회(PHC)에서 우승한
Argon2가 등장했다. GPU가 가장 싫어하는 '메모리(RAM)를 팍팍 긁어먹는 흑마법'을 갈아 넣어 해커의 하드웨어 투자 자체를 파산시켜 버리는 현존 인류 최고의 종결자로 군림 중이다.
-
📢 섹션 요약 비유: 옛날 방어법(SHA)은 도둑을 쫓아낼 때 **'빠른 권총'**을 쏘는 것과 같았습니다. 도둑도 기관총(GPU)을 들고 와서 같이 갈겨버렸죠. 현대의 비밀번호 해싱(KDF)은 우리 집 앞마당을 아예 **'무릎까지 푹푹 빠지는 끈적끈적한 늪지대(의도적인 연산 지연)'**로 만들어 버리는 것입니다. 도둑이 포르쉐(슈퍼컴퓨터)를 끌고 와도 늪지대에서는 무조건 바퀴가 빠져 기어 다닐 수밖에 없는 환장할 물리적 함정입니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
1. 양대 핵심 흑마법: 솔트(Salt)와 키 스트레칭(Key Stretching)
KDF(Key Derivation Function) 엔진을 굴리는 두 개의 미친 톱니바퀴다.
-
솔트 (Salt, 소금 치기)
- 문제: A 유저와 B 유저가 똑같이 비번을
1234로 했다. 해시를 돌리면 둘 다 똑같이A8bC9...가 나온다. 해커가1234 = A8bC9...라는 족보(레인보우 테이블)를 만들어놓고 돌리면 둘 다 1초 만에 털린다. - 해결 (Salt): A 유저의 비번
1234뒤에 컴퓨터가 무작위로x#9@(솔트)를 붙여서1234x#9@로 갈아버린다. B 유저 뒤에는z!2$(솔트)를 붙여1234z!2$로 간다. - 결과: 비번은 둘 다
1234지만, DB에 저장된 해시값은 완전히 다른 외계어가 된다! 해커가 기껏 모아둔 '1234 레인보우 테이블 정답지'가 완벽하게 휴지 조각이 되는(레인보우 테이블 파괴) 기적이다.
- 문제: A 유저와 B 유저가 똑같이 비번을
-
키 스트레칭 (Key Stretching, 엿가락 늘리기)
- 문제: 해커가 GPU를 100대 사서 1초에 1,000억 번씩 무차별 대입을 해댄다(Brute-force).
- 해결 (Stretching): 믹서기에 1번 갈고 나온 즙을, 다시 믹서기에 넣고 간다. 이걸 10만 번(Work Factor) 반복한다.
Hash(Hash(Hash(...(1234)...))) - 결과: 서버가 로그인 한 번 처리하는데 무려 0.2초나 걸리게 고의로 렉(Delay)을 유발한다. 정상 고객은 로그인할 때 0.2초 걸려도 "음, 인터넷이 느리네" 하고 넘긴다. 하지만 초당 1,000억 번을 뚫어야 하는 해커 입장에서 1번에 0.2초가 걸리면? 100만 년 동안 컴퓨터를 켜놔도 비번 1개를 못 푸는 수익성(ROI) 파산 상태에 직면하여 해킹을 포기하게 된다.
2. KDF 4대 천왕 알고리즘 스펙 비교표 (면접/실무 절대 국룰)
이 4가지를 시간순으로 나열하고 장단점을 찌르는 것이 보안 아키텍트의 기본 소양이다.
| 알고리즘 | 탄생 | 해커 억제 메커니즘 (방어 흑마법) | 현대 아키텍트의 평가 (Status) |
|---|---|---|---|
| PBKDF2 | 구식 | 가장 뻔하게 해시(SHA-256)를 여러 번 반복해서 빙글빙글 돌리는 교과서적 스트레칭. | 미국 정부(NIST) 표준이라 공공기관에서 억지로 씀. 하지만 GPU 병렬 연산에 너무 쉽게 뚫려서 방어력 최하위. |
| Bcrypt | 중기 | (1999년) 브루스 슈나이어 발명. 블로피시(Blowfish) 암호를 꼬아서 CPU 연산을 미친 듯이 무겁게(Cost) 파먹게 만듦. | 가장 검증된 글로벌 절대 국룰(Standard). Spring Security의 디폴트. 하지만 메모리는 안 먹어서 해커의 GPU 커스텀 칩(ASIC)에 뚫릴 틈을 살짝 내줌. |
| Scrypt | 중기 | CPU 뿐만 아니라 메모리(RAM) 용량까지 미친 듯이 잡아먹도록(Memory-hard) 설계됨. 해커가 RAM을 수백 기가 사야 해서 파산함. | 훌륭하지만 세팅 파라미터가 너무 복잡해서 대중화 실패. Bcrypt와 Argon2 사이에 낀 비운의 2인자. |
| Argon2 | 최신 | (2015년 대회 우승작) 해커의 꼼수(GPU 병렬, 부채널 공격)를 모두 씹어먹는 극강의 CPU + RAM 동시 파먹기 끝판왕. | OWASP가 **"현존하는 가장 강력한 1위 방어막, 무조건 이거 써라!"**라고 찬양함. 최신 프로젝트의 아키텍처 도입 0순위 타겟. |
- 📢 섹션 요약 비유: 해커가 자물쇠를 풀려고 1만 명의 노가다 꾼(GPU)을 데려왔습니다. PBKDF2는 자물쇠를 10만 개 겹쳐놓은 겁니다(노가다 꾼이 1만 명이니 금방 풉니다). Bcrypt는 자물쇠 구멍을 엄청 뻑뻑하게 만들어서 열쇠 돌리다 손목(CPU)이 나가게 합니다. Argon2는 자물쇠를 푸는 데 무조건 '넓은 책상(메모리 1GB)'이 필요하게 만듭니다. 노가다 꾼 1만 명이 책상 1만 개를 사 올 돈이 없어서 아예 공터(해킹 팜)를 지을 엄두조차 못 내고 파산하게 만드는 가장 영악하고 악랄한 경제학적 방어입니다.
Ⅲ. 융합 비교 및 다각도 분석
1. 일반 암호화(Encryption - AES) vs 비밀번호 해시(KDF - Bcrypt)
주니어들이 툭하면 KISA 심사에서 박살 나는 가장 치명적인 개념 오류다.
| 척도 | 양방향 암호화 (AES-256, RSA) | 일방향 해시 + KDF (Bcrypt, Argon2) 👑 |
|---|---|---|
| 목적 | 나중에 다시 원본으로 돌려서(복호화) 화면에 예쁘게 보여줘야 할 때 | 절대 원본으로 돌리면 안 되고, 로그인할 때 비교(Verify)만 찰칵 하고 넘길 때 |
| 적용 타겟 | 주민등록번호, 계좌번호, 이메일 주소 | 오직 비밀번호 (Password) 단 하나! |
| 키(Key) 관리 | Secret Key를 금고(KMS)에 꽁꽁 숨겨야 함 (키 털리면 끝장남) | 키(Key) 자체가 필요 없음. 솔트(Salt)는 그냥 해시값 옆에 같이 텍스트로 저장해도 무방함. |
| 치명적 헛발질 | 비밀번호를 AES로 짰다? 해커가 키만 훔치면 비번 100만 명분 1초 만에 싹 풀림 (대참사) | 비밀번호를 완벽히 막음. (대신 이걸로 주민번호 암호화하면 폰번 바꿀 때 원본 조회가 안 돼서 앱 망함) |
과목 융합 관점
-
소프트웨어 공학 (클린 아키텍처와 Spring Security 융합): 자바 개발자가 KDF(Bcrypt)를 구현한답시고 소스코드에 100줄짜리 믹서기 쌩 코딩(Raw coding)을 치면 안티패턴이다. 현대 스프링(Spring Security) 아키텍처는
PasswordEncoder라는 갓벽한 인터페이스 껍데기를 제공한다. 개발자는 이 껍데기만 바라보고 코딩한다(의존성 역전). 스프링 컨피그 1줄에@Bean public PasswordEncoder pe() { return new BCryptPasswordEncoder(); }라고 박아두면 끝이다. 나중에 세상이 발전해서 Bcrypt가 털리고 Argon2로 갈아타야 할 때? 저 컨피그 딱 1줄만new Argon2PasswordEncoder()로 갈아 끼우면 수십만 줄의 비즈니스 로직 수정 단 1도 없이 전체 시스템의 보안 뼈대가 1초 만에 최신식으로 진화(Crypto-Agility)하는 아키텍처의 황홀경이다. -
클라우드 컴퓨팅 (서버리스 오토스케일링 딜레마): Bcrypt와 Argon2의 철학은 "서버 CPU를 0.5초 동안 일부러 미친 듯이 갉아먹는다(지연시킨다)"는 것이다. 그런데 이 무거운 놈을 AWS Lambda(서버리스) 같이 0.1초 만에 떴다 죽고 초당 요금이 청구되는 곳에 올리면? 로그인 트래픽이 1만 명 몰릴 때 람다 CPU가 폭주해서 클라우드 서버 요금(Billing) 폭탄을 맞고 파산하는 웃지 못할 딜레마가 터진다. 아키텍트는 "보안을 위해 성능(Cost)을 태울 것인가?"를 처절하게 계산(Work Factor 튜닝)하여, 0.5초가 아닌 0.2초 정도로 타협점을 세팅하는 밸런싱 아키텍트의 역량을 뽐내야 한다.
-
📢 섹션 요약 비유: AES 암호화는 **'은행의 금고(양방향)'**입니다. 필요할 때 매니저가 열쇠로 열고 돈(데이터)을 넣었다 뺐다 합니다. 반면 비밀번호(KDF) 해싱은 은행의 **'지문 인식기(일방향)'**입니다. 내 손가락을 지문 인식기에 넣는다고 내 손가락 모형이 3D 프린터로 복원(복호화)되어 튀어나오진 않습니다. 그냥 "이 손가락 무늬가 어제 그놈 맞네?" 확인(비교)만 1초 만에 해주고 끝입니다. 비밀번호는 절대 금고에 넣는 돈처럼 취급해서는 안 됩니다.
Ⅳ. 실무 적용 및 기술사적 판단
실무 시나리오
-
시나리오 — 솔트(Salt) 재사용이 낳은 "바보들의 합창": 주니어 개발자가 "비밀번호 썡으로 넣지 말고 솔트(Salt) 섞어서 해시하래!"라는 책을 읽었다. 그래서 전역 변수에
String SALT = "myCompanySalt123";이라고 박아두고, 100만 명의 가입자 비밀번호 뒤에 똑같은 소금 하나만 미친 듯이 섞어서(1234myCompanySalt123) MD5 믹서기에 돌렸다. 해커가 털어보니 어이가 없었다. 해커는 "아, 이 회사는 모든 놈한테 똑같은 소금(myCompanySalt123)을 치네?"를 눈치채고, 이 소금값이 반영된 새로운 자기만의 레인보우 테이블을 1시간 만에 돌려 만들어서 100만 명의 비번을 그대로 다 풀어버렸다.- 아키텍트의 해결책: 고정 솔트(Static Salt)의 파멸적 안티패턴이다. 소금은 똑같은 맛소금을 쓰면 안 된다. 아키텍트는 **"사용자 1명당 무조건 세상에 단 1개밖에 없는 고유하고 랜덤한 솔트(Unique Random Salt, 128bit 이상)를 매번 새로 생성하여 버무려라!"**라고 강제해야 한다. A유저는 솔트 1번, B유저는 솔트 2번. 이렇게 해야 해커가 100만 명을 뚫으려면 레인보우 테이블을 100만 개 만들어야 하는 '수학적 멸망' 상태에 빠져 공격을 포기하게 된다. (참고로 최신
Bcrypt함수는 뼈대 자체가 알아서 무작위 솔트를 자동 생성해 주므로 개발자가 삽질할 일 자체를 막아준다.)
- 아키텍트의 해결책: 고정 솔트(Static Salt)의 파멸적 안티패턴이다. 소금은 똑같은 맛소금을 쓰면 안 된다. 아키텍트는 **"사용자 1명당 무조건 세상에 단 1개밖에 없는 고유하고 랜덤한 솔트(Unique Random Salt, 128bit 이상)를 매번 새로 생성하여 버무려라!"**라고 강제해야 한다. A유저는 솔트 1번, B유저는 솔트 2번. 이렇게 해야 해커가 100만 명을 뚫으려면 레인보우 테이블을 100만 개 만들어야 하는 '수학적 멸망' 상태에 빠져 공격을 포기하게 된다. (참고로 최신
-
시나리오 — KISA 심사관 앞에서의 당당한 오해 (SHA-256 맹신주의): 공공기관 차세대 프로젝트 오픈 전날, 감리관이 왔다. "주민번호 암호화는 뭘로 했소?" 개발자 왈 "가장 튼튼한 해시인 SHA-256 썼습니다! 단방향이라 절대 안 풀려요!" 감리관이 한숨을 쉬며 서류를 집어 던지고 릴리즈를 폭파했다. 고객이 "내일 당장 주민번호 뒷자리 까먹었다고 알려달라면, 복호화 안 되는 해시에서 어떻게 꺼내서 화면에 보여줄 건데?"라고 물었다. 개발자는 꿀 먹은 벙어리가 되었다.
- 아키텍트의 해결책: 비즈니스 도메인(Business Context)과 암호화 뼈대의 미스매칭이다. 비밀번호는 나중에 꺼내볼 일이 없다. 틀리면 "비밀번호 재설정" 시키면 끝이다(해시 적용 완벽). 하지만 '주민번호, 신용카드 번호, 이메일 주소'는 나중에 결제하거나 청구서 보낼 때 반드시 원본 숫자가 필요(복호화 필요)하다. 아키텍트는 이 명확한 선을 긋고, "평생 안 볼 거(비번) = Bcrypt 해시", "내일 다시 꺼내봐야 할 거(주민/계좌) = AES-256 양방향 암호화"로 테이블 컬럼 설계를 철저하게 찢어놔야 한다.
도입 체크리스트
- 조직적: Work Factor(작업 증명 코스트)의 점진적 업그레이드 전략이 있는가? Bcrypt를 쓸 때 강도를 조절하는 숫자가 있다(
Cost=10). 10을 주면 1,024번 꼬아서 0.1초가 걸린다. 하지만 무어의 법칙에 의해 5년 뒤 컴퓨터는 10배 빨라진다. 해커도 10배 빨라진 칩을 들고 온다. 아키텍트는 "매 2년마다 하드웨어 성능 발전을 체크하고, Bcrypt의 Cost 값을10 ➡ 12 ➡ 14로 지속적으로 올려치기(Bump-up)하여 해커와의 창과 방패 싸움 연산 속도(0.1초~0.5초 방어선)를 영원히 유지하라"는 암호화 수명 주기(Lifecycle) 정책을 세워야 한다. - 기술적: 해시값 길이(Column Length) DB 뼈대 붕괴 주의! 옛날 개발자가 비밀번호 DB 컬럼을
VARCHAR(50)으로 좁게 짜놨다. 새로운 보안팀장이 와서 Bcrypt를 도입했는데, Bcrypt가 뱉어내는 웅장한 해시 쓰레기 문자열은 60바이트($2a$10$...)다. 회원가입을 빡! 눌렀는데 DB에서 "Data too long" 500 에러를 뿜으며 서버가 터졌다. 아무리 좋은 보안 코딩이라도, 밑바닥 DDL(테이블 스키마) 아키텍처가 그 크기(VARCHAR(255))를 넉넉하게 받아주지 못하면 런칭 당일 대재앙이 빚어진다.
안티패턴
-
"내가 비번 복호화해서 이메일로 친절히 알려줄게~" (비밀번호 찾기의 파탄): 고객이 비밀번호 찾기를 눌렀는데, 회사가 이메일로 "고객님의 원래 비밀번호는
password123입니다!"라고 친절하게 원본을 까발려서 보내주는 짓. 100% 해킹 당할 사이트다. 원본을 안다는 건, 애초에 DB에 해시(KDF)로 안 꼬아놓고 평문이나 허접한 양방향(AES) 암호화를 썼다는 가장 완벽하고 자백적인 범죄(CWE-257) 증거다. "진정한 인증 시스템은 관리자인 나조차도 네 비밀번호가 뭔지 모른다. 까먹었으면 무조건 버리고 임시 토큰 받아 새걸로 다시 설정(Reset)해라!" 이것이 피도 눈물도 없는 절대 보안 헌법이다. -
📢 섹션 요약 비유: 비밀번호 원본을 알려주는 시스템은, **'열쇠 가게 아저씨가 우리 집 열쇠 복사본을 몰래 자기 책상 서랍에 하나 더 숨겨두고 있는 꼴'**입니다. 친절해 보이지만, 열쇠 가게 아저씨가 털리면 우리 집도 같이 털리는 겁니다. 완벽한 KDF 보안은 **'도어록을 지문인식으로 달아버리는 것'**입니다. 아저씨(관리자)는 내 지문 모양(원본)을 알 길이 없고, 훔쳐 갈 열쇠 쇠붙이 자체도 세상에 존재하지 않습니다. 까먹었으면 내 손가락을 자르고 다른 손가락 지문을 새로 등록(초기화)하는 수밖에 없는 가혹한 독립성입니다.
Ⅴ. 기대효과 및 결론
정량/정성 기대효과
| 구분 | 평문 저장 혹은 1세대 단순 MD5, SHA-256 해싱 (AS-IS) | 고유 솔트 부여 + Bcrypt/Argon2 스트레칭 연산 강제 (TO-BE) | 개선 효과 |
|---|---|---|---|
| 정량 | DB 털릴 시 1초 만에 100만 명 비번 레인보우 테이블 해독 | GPU 돌려도 1개 푸는 데 수년 소요 ➡ 100% 포기 | 크리덴셜 스터핑(2차 연쇄 털림) 및 사회적 피해액 완벽 차단 |
| 정량 | 초당 1만 건 무차별 대입 공격에 1시간 내 로그인 방어선 뚫림 | 1건당 서버가 일부러 0.2초 렉을 유도하여 봇(Bot) 공격 파산시킴 | 봇(Bot) 기반 브루트포스 해킹 시도 성공률 0% 원천 락인 |
| 정성 | "DB 털리면 우리 회사 인생 끝장이다" 매일 밤 잠 못 이룸 | "털어가도 무가치한 쓰레기 텍스트 덩어리일 뿐" | 제로 트러스트(Zero Trust) 철학 완성에 따른 압도적 아키텍트의 담력 확보 |
미래 전망
- 양자 컴퓨터 폭격 앞에서의 방어 (Post-Quantum Hash): 10년 뒤 양자 컴퓨터가 나오면 비대칭키(RSA)는 1초 만에 뚫리지만, 해시 함수(SHA, Bcrypt)는 수학적 구조가 달라서 양자 컴퓨터로도 단방향 암호를 푸는 데는 별로 재미를 못 본다는 게 학계의 정설(Grover's Algorithm)이다. 그래서 KDF(키 유도 함수)는 다가올 양자 시대(Q-Day)에도 해시 덩치(Bit size)만 살짝 키워주면 인류의 마지막 패스워드 방어막으로 영원히 살아남을 것으로 굳게 예측되고 있다.
- 비밀번호(Password) 자체의 완전 멸망 (Passkey / FIDO2): 가장 슬픈 미래는, KDF니 Bcrypt니 하는 위대한 수학적 암호화 지식 자체가 박물관으로 직행한다는 것이다. 구글, 애플, 마이크로소프트가 연합하여 "비밀번호라는 텍스트 자체를 인간의 뇌에서 지워버리자"며 패스키(Passkey) 시대를 열었다. 브라우저가 사용자 기기의 지문(생체)과 비대칭 키 교환으로 서버와 소통한다. 서버 DB에는 해시값이 아니라 그냥 '공개키' 껍데기만 저장되므로, 털려도 해커가 로그인할 방법이 우주에 존재하지 않는다. 5년 내로 이 지긋지긋한 KDF 해싱 전쟁은 끝이 날 것이다.
참고 표준
- OWASP Password Storage Cheat Sheet: 전 세계 서버 백엔드 개발자들의 빛과 소금. "Bcrypt 써라, 솔트는 몇 바이트 치고, 늘리기는 몇 번 돌려라"라고 가장 트렌디하고 정밀한 수학적 조미료 레시피를 매년 업데이트해 주는 절대 교과서.
- NIST SP 800-63B (Digital Identity Guidelines): 미국 표준 기술 연구소가 멱살 잡고 강제하는 비밀번호 저장 법전. "무조건 Salt 쓰고 무조건 KDF 써서 느리게 만들어라, 안 그럼 불법!"이라며 전 우주의 서버 방어 기준을 통일시켜버린 철칙.
비밀번호 저장 방식인 KDF(Key Derivation Function)와 솔트(Salt)의 융합은, 방어자가 해커를 향해 던지는 **'가장 찌질하고도 가장 위대한 물리적 늪(Swamp) 설계술'**이다. 우리는 그동안 인터넷이 빠르면 좋은 줄 알았다. "0.001초 만에 로직을 끝내자!"며 달렸다. 하지만 해커는 우리의 그 속도(CPU)를 훔쳐서 무기를 연마했다. 암호학자들은 딜레마를 깨부쉈다. "그렇다면 해커의 무기(속도)를 역이용하자. 우리가 스스로 우리의 발목을 묶어 연산 속도를 10만 배 의도적으로 느리게(Stretching) 만들면, 1초에 수천억 번을 때려야만 먹고사는 해커는 그 끈적거리는 늪에 빠져 결국 굶어 죽을 것이다." 기계의 발전 속도(GPU)를 인간의 악의적인 수학 공식(Bcrypt/Argon2)으로 옥죄고 질척거리게 만들어, 해커의 경제적 수익성(ROI)을 완벽하게 박살 내버린 이 경이로운 고의적 지연(Intentional Delay), 그것이 패스워드 해싱이 낳은 가장 눈부신 천재적 역발상 방어 아키텍처다.
- 📢 섹션 요약 비유: 일반 해싱(SHA)은 도둑이 뛰어오는 길에 **'투명 유리문'**을 세운 겁니다. 도둑은 뛰어와서 얼굴(해시 충돌)을 팍 박고 아파하지만, 유리를 도끼(GPU)로 미친 듯이 수천 번 깨다 보면 결국 부서집니다. KDF와 솔트(Bcrypt)는 그 문 앞에 **'수심 10미터짜리 꿀과 껌이 섞인 늪'**을 만들어버린 겁니다. 도둑이 대포(슈퍼컴퓨터)를 들고 오든 페라리를 타고 오든 아무 소용이 없습니다. 한 발자국 내디딜 때마다 발이 푹푹 빠져서 10미터를 걷는 데 100만 년이 걸립니다. 도둑은 결국 지쳐서 포기하고 돌아갑니다.
📌 관련 개념 맵 (Knowledge Graph)
| 개념 명칭 | 관계 및 시너지 설명 |
|---|---|
| 암호화 실패 (A02) | KDF와 솔트를 안 쓰고 그냥 평문으로 넣거나, 옛날 MD5 구닥다리 믹서기를 돌렸을 때 쳐맞는 OWASP Top 10의 무시무시한 2위 항목. (이전 장 479번) |
| 레인보우 테이블 (Rainbow Table) | 해커가 KDF(Bcrypt)를 가장 증오하는 이유. "1234 = x8b9"라는 전 세계 공통 비밀번호 암호화 정답지를 엑셀 1TB 분량으로 싹 다 모아놓은 족보인데, 짭짤한 '솔트(소금)' 한 줌 쳐주면 이 1TB짜리 엑셀 정답지가 1초 만에 완전 휴지 조각이 된다. |
| 크리덴셜 스터핑 (Credential Stuffing) | 내 사이트 비번이 털리면 가장 억울하게 연쇄적으로 털리는 해킹 폭격. KDF 늪지대로 해커의 해독 속도를 박살 내야, 우리 고객의 옆 동네 네이버/카카오 계정이 털리는 2차 재앙의 고리를 끊어낼 수 있다. (이전 장 484번) |
| 단방향 해시 (One-way Hash) | KDF 흑마법의 심장(엔진). 돼지고기 갈아서 햄버거 패티(해시) 만들고 나면, 절대로 패티를 옛날 생고기 모양(복호화)으로 복원할 수 없는 수학적 파괴 함수. |
| 무차별 대입 공격 (Brute-force) | 해커가 비밀번호를 찾으려고 aaaa부터 zzzz까지 초당 1억 번씩 키보드를 미친 듯이 갈겨보는 무식한 공격. 이 1억 번의 속도를 1번으로 질척거리게 발목 잡는 게 Key Stretching 엿가락 늘리기다. |
👶 어린이를 위한 3줄 비유 설명
- 내가 일기장에 쓰는 '1234' 비밀번호를 엄마한테 들키기 싫어서, 종이를 가위로 싹둑싹둑 잘라서(단방향 해시) 아무도 못 알아보게 만들고 상자에 넣었어요.
- 그런데 나쁜 도둑(해커)이 전 세계 친구들의 '1234'가 잘린 모양을 미리 똑같이 잘라놓은 **'컨닝 페이퍼 족보(레인보우 테이블)'**를 가져와서 1초 만에 짝맞추기로 내 비밀번호를 알아냈어요!
- 너무 화가 난 나는 종이를 자르기 전에 나만의 특별한 반짝이 스티커(솔트)를 붙이고, 10만 번 넘게 종이를 미친 듯이 잘게 찢어서(키 스트레칭) 도둑이 100년을 맞춰봐도 절대 못 찾게 만드는 최고의 요새 방어법을 **'KDF와 솔트'**라고 부른답니다!