핵심 요약
비밀번호는 느린 해시 함수로 저장해야 한다. argon2id가 현대적 권장(메모리-하드)이고, bcrypt는 오래 검증된 안전한 선택이다. SHA-256·MD5는 너무 빨라 무차별 대입에 취약하니 절대 쓰지 마라. 솔트는 두 라이브러리가 자동 처리한다.
1. 권장과 파라미터
| 알고리즘 | 핵심 파라미터 | 비고 |
|---|---|---|
| argon2id | memory·time·parallelism | OWASP 1순위 |
| bcrypt | cost(라운드) 10~12 | 72바이트 제한 주의 |
2. 사용 예
// bcrypt
const hash = await bcrypt.hash(password, 12)
const ok = await bcrypt.compare(input, hash)
// argon2
const hash = await argon2.hash(password) // argon2id 기본
const ok = await argon2.verify(hash, input)
3. 함정
- bcrypt는 72바이트 이후를 잘라낸다 — 매우 긴 비번/사전 해시 조합 주의
- cost를 너무 낮추면 보안 약화, 너무 높이면 로그인 지연 — 서버에서 ~100ms 목표로 조정
- 해시 비교는 반드시 라이브러리 compare/verify로(타이밍 공격 방지)
자주 묻는 질문
SHA-256으로 해시하면 안전하지 않나요?
SHA 계열은 빠르게 설계돼 GPU로 초당 수십억 번 시도가 가능합니다. 비밀번호엔 의도적으로 느린 bcrypt/argon2를 써야 합니다.
솔트를 직접 만들어야 하나요?
아니요. bcrypt/argon2는 솔트를 자동 생성해 해시 문자열에 포함합니다. 별도 컬럼이 필요 없습니다.

댓글 0