사용자 비밀번호를 저장하고 로그인 때 검증하려 합니다. 복호화 가능한 암호화나 일반 해시 대신 비밀번호 전용 해시를 쓰는 이유와 설정 기준은 무엇인가요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
로그인에서는 저장한 비밀번호를 복호화할 필요 없이 입력 후보가 맞는지만 확인하면 됩니다. 따라서 복호화 가능한 암호화나 빠른 일반 해시보다 후보 하나를 검증하는 데 의도적으로 시간과 메모리가 들도록 설계된 비밀번호 전용 해시 (password hashing)를 사용합니다. DB가 유출돼도 공격자가 사전과 흔한 비밀번호를 대량 대입하는 속도를 늦추는 것이 목적이며, 해시가 역산 불가능하다는 설명만으로는 충분하지 않습니다.
salt와 비용의 역할을 나눕니다
사용자마다 무작위 salt를 만들고 해시 결과와 함께 저장합니다. salt는 같은 비밀번호를 쓴 계정의 결과가 같아지는 것을 막고 공격자가 미리 계산한 표를 재사용하기 어렵게 하지만 비밀값은 아닙니다. salt를 알아도 공격자는 특정 계정에 후보를 계속 넣을 수 있으므로 후보 하나의 계산 비용이 필요합니다. 단순 SHA-256(password)는 너무 빨라 대량 대입에 유리합니다. SHA-256(salt + password)도 salt의 장점은 일부 얻지만 여전히 빠른 해시입니다.
다음 표처럼 같은 ‘해시’라는 이름 아래에서도 후보 검증 비용과 운영 조건이 다릅니다.
| 방식 | 비밀번호 저장에서의 의미 |
|---|---|
SHA-256(password) |
계산이 빨라 많은 후보를 빠르게 시험할 수 있음 |
SHA-256(salt + password) |
사용자별 salt로 사전 계산의 재사용은 줄이지만, 개별 후보 계산은 여전히 빠름 |
PBKDF2-HMAC-SHA-256 |
SHA-256을 내부 구성 요소로 사용하되, 반복 횟수로 후보 하나를 검증하는 계산 비용을 높임 |
Argon2id·scrypt |
계산 시간뿐 아니라 메모리 사용 비용도 파라미터로 조정할 수 있음 |
bcrypt |
work factor로 계산 반복량을 조정함. Argon2id처럼 별도의 메모리 크기 파라미터를 조정하는 방식은 아님 |
PBKDF2-HMAC-SHA-256은 SHA-256을 내부 구성 요소로 사용하면서 반복 횟수로 계산 비용을 높이는 방식입니다. Argon2id와 scrypt는 계산 시간뿐 아니라 메모리 비용도 조절해 병렬 대입 비용을 높일 수 있습니다. bcrypt는 work factor로 반복 비용을 조절하지만 Argon2id처럼 별도 메모리 크기 파라미터를 같은 방식으로 제공하지 않습니다. 알고리즘 이름만 보고 FIPS 요구를 충족한다고 판단하지 않고, 검증된 구현과 운영 모듈 조건을 확인하겠습니다.
현실의 장비에서 정책을 정합니다
비용은 무조건 크게 잡지 않습니다. 실제 인증 서버에서 목표 지연, 동시 로그인 수, CPU·메모리 예산, rate limit을 함께 측정합니다. 온라인 rate limit은 서비스 endpoint의 남용을 줄이고, 비밀번호 해시 비용은 유출된 DB에 대한 오프라인 대입을 늦추는 서로 다른 방어입니다. 존재하지 않는 계정과 잘못된 비밀번호의 응답 차이로 계정 존재가 드러나지 않도록 오류 메시지와 전체 처리 시간도 살피겠습니다.
해시 문자열에는 알고리즘과 비용 파라미터가 함께 들어가야 로그인 시 검증 방법을 알 수 있습니다. 정책을 높일 때 기존 사용자의 모든 비밀번호를 미리 원문 없이 재해시할 수는 없으므로, 구 방식으로 한 번 검증에 성공한 시점에 새 정책으로 다시 해시하는 점진 전환을 사용합니다. 장기 미접속 계정은 만료·재설정·추가 인증 정책으로 별도 처리합니다. pepper를 쓰는 경우에는 salt와 달리 비밀 키 관리와 교체·분실 복구가 필요하다는 점을 분리해 설계합니다.
비밀번호 원문은 로그·예외·분석에 절대 남기지 않습니다. 테스트는 동일 비밀번호의 salt별 결과, 잘못된 비밀번호, 비용 파라미터 식별, 기존 해시 로그인 후 재해시, 입력 길이 경계와 동시 인증 부하를 포함합니다. 목표는 가장 강한 알고리즘 이름을 붙이는 것이 아니라 유출·온라인 남용·운영 장애라는 서로 다른 공격과 비용을 함께 통제하는 것입니다.
표의 차이는 ‘어떤 이름이 더 안전한가’보다 공격자가 후보 하나를 계산하는 자원과 서비스가 정상 로그인을 처리할 자원의 균형에 있습니다. 저장 형식에 salt와 비용 정보가 없으면 나중에 정책을 올리거나 여러 알고리즘을 공존시키기 어렵습니다. 비밀번호 변경과 관리자 강제 재설정은 기존 hash를 재사용하지 않고 새 salt로 계산하며, 재설정 메일의 토큰도 비밀번호 hash와 같은 값으로 취급하지 않고 별도 만료·소비 규칙을 둡니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 복호화 필요성의 부재와 느린 후보 검증의 목적을 설명한다.
- salt·계산 비용·메모리 비용·pepper의 역할을 구분한다.
- Argon2id·PBKDF2·bcrypt의 선택을 환경 제약과 연결한다.
- 실측 튜닝·점진 재해시·원문 비노출을 운영 절차로 제시한다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 단순 SHA-256이나 salt만으로 오프라인 대입이 충분히 느려진다고 말한다.
- salt를 비밀 키처럼 보관하거나 pepper를 일반 salt처럼 취급한다.
- 비용을 무조건 최대로 올려 정상 인증 자원 고갈을 만든다.
- 비밀번호 원문을 로그에 남기거나 알고리즘 이름만으로 규정 준수를 단정한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 비밀번호 해시 정책을 강화했습니다. 로그인하지 않는 오래된 계정은 어떤 재설정·만료 절차로 전환하나요?
- pepper 키 교체·분실·복구를 salt 교체와 다르게 운영해야 하는 이유는 무엇일까요?
- 계정 존재 노출을 줄이면서 해시 비용과 rate limit을 어떻게 조정할까요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.