전체 목록
보안Medium#219

비밀번호 저장 시 해시와 솔트가 왜 필요한가요?

#보안#Password#Hash#Salt

답변 포인트

원문 저장 위험과 brute force 완화를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.

정답 및 해설

빠른 요약

비밀번호는 원문 저장을 피하고 bcrypt, scrypt, Argon2 같은 느린 해시 알고리즘과 사용자별 솔트를 사용해야 합니다. 같은 비밀번호도 다른 해시가 되게 합니다.

비밀번호는 평문으로 저장하면 안 되고, 빠른 일반 해시만으로도 부족합니다. 해시와 솔트, 그리고 느린 password hashing 알고리즘을 사용해야 합니다.

해시가 필요한 이유

해시는 비밀번호를 복원하기 어려운 값으로 바꿉니다. 로그인 시 입력 비밀번호를 같은 방식으로 해시해 저장값과 비교합니다. DB가 유출되어도 평문 비밀번호가 바로 노출되지 않습니다.

솔트가 필요한 이유

같은 비밀번호를 가진 사용자들이 같은 해시를 갖지 않게 사용자별 랜덤 값을 섞습니다.

Text
hash(password)                 ->    
hash(password + user_salt)      ->   

솔트는 비밀일 필요는 없지만 충분히 랜덤하고 사용자별로 달라야 합니다.

빠른 해시의 문제

SHA-256 같은 범용 해시는 너무 빠릅니다. 공격자는 GPU로 초당 엄청난 후보를 대입할 수 있습니다. 비밀번호 저장에는 bcrypt, scrypt, Argon2처럼 비용을 조절할 수 있는 알고리즘을 사용합니다.

JavaScript
import bcrypt from 'bcrypt';

const hash = await bcrypt.hash(password, 12);
const ok = await bcrypt.compare(inputPassword, hash);

실무 주의점

  • pepper를 쓰는 경우 애플리케이션 시크릿으로 별도 관리합니다.
  • 비용 파라미터는 로그인 지연과 보안 수준을 측정해 정합니다.
  • 비밀번호 재설정 토큰은 짧은 만료와 단회 사용을 적용합니다.
  • 유출 대응을 위해 강제 재설정과 세션 폐기 절차를 준비합니다.

면접 답변 포인트

해시는 평문 노출을 막고, 솔트는 rainbow table과 동일 비밀번호 식별을 어렵게 합니다. 실제 저장에는 bcrypt/scrypt/Argon2처럼 느린 해시를 쓰며 비용 파라미터와 시크릿 관리를 함께 고려한다고 답하면 좋습니다.

관련 질문

같은 카테고리/태그 기준