비밀번호 저장 시 해시와 솔트가 왜 필요한가요?
답변 포인트
원문 저장 위험과 brute force 완화를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
비밀번호는 원문 저장을 피하고 bcrypt, scrypt, Argon2 같은 느린 해시 알고리즘과 사용자별 솔트를 사용해야 합니다. 같은 비밀번호도 다른 해시가 되게 합니다.
비밀번호는 평문으로 저장하면 안 되고, 빠른 일반 해시만으로도 부족합니다. 해시와 솔트, 그리고 느린 password hashing 알고리즘을 사용해야 합니다.
해시가 필요한 이유
해시는 비밀번호를 복원하기 어려운 값으로 바꿉니다. 로그인 시 입력 비밀번호를 같은 방식으로 해시해 저장값과 비교합니다. DB가 유출되어도 평문 비밀번호가 바로 노출되지 않습니다.
솔트가 필요한 이유
같은 비밀번호를 가진 사용자들이 같은 해시를 갖지 않게 사용자별 랜덤 값을 섞습니다.
hash(password) -> 같은 비밀번호는 같은 결과
hash(password + user_salt) -> 사용자마다 다른 결과솔트는 비밀일 필요는 없지만 충분히 랜덤하고 사용자별로 달라야 합니다.
빠른 해시의 문제
SHA-256 같은 범용 해시는 너무 빠릅니다. 공격자는 GPU로 초당 엄청난 후보를 대입할 수 있습니다. 비밀번호 저장에는 bcrypt, scrypt, Argon2처럼 비용을 조절할 수 있는 알고리즘을 사용합니다.
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12);
const ok = await bcrypt.compare(inputPassword, hash);실무 주의점
- pepper를 쓰는 경우 애플리케이션 시크릿으로 별도 관리합니다.
- 비용 파라미터는 로그인 지연과 보안 수준을 측정해 정합니다.
- 비밀번호 재설정 토큰은 짧은 만료와 단회 사용을 적용합니다.
- 유출 대응을 위해 강제 재설정과 세션 폐기 절차를 준비합니다.
면접 답변 포인트
해시는 평문 노출을 막고, 솔트는 rainbow table과 동일 비밀번호 식별을 어렵게 합니다. 실제 저장에는 bcrypt/scrypt/Argon2처럼 느린 해시를 쓰며 비용 파라미터와 시크릿 관리를 함께 고려한다고 답하면 좋습니다.