passwords hashing argon2 bcrypt scrypt security

비밀번호 해싱 표준: Argon2, Bcrypt 및 Scrypt가 중요한 이유

비밀번호를 안전하게 저장하는 방법을 배웁니다. Argon2, bcrypt, scrypt 및 PBKDF2를 비교하고 MD5와 같은 단순 해시가 왜 충분하지 않은지 이해해 보세요.

2026-04-11

패스워드 해싱 표준: MD5와 SHA-256이 충분하지 않은 이유

개발자로서 여러분의 가장 중요한 책임 중 하나는 사용자 패스워드를 보호하는 것입니다. 패스워드를 평문으로 저장하는 것은 당연히 재앙이지만, 여전히 많은 개발자가 MD5나 SHA-256 같은 '빠른' 암호화 해시를 패스워드 저장에 사용하는 실수를 범하고 있습니다.

이 가이드에서는 왜 그러한 방식이 취약한지, 그리고 안전한 패스워드 해싱을 위한 현재의 업계 표준은 무엇인지 설명합니다.


1. '빠른' 해시의 문제점

MD5, SHA-1, SHA-256 같은 알고리즘은 빠르게 작동하도록 설계되었습니다. 이들은 대용량 파일의 무결성을 수 밀리초 안에 확인하기 위한 용도입니다.

파일 검사에는 속도가 장점이지만, 패스워드에는 치명적인 단점이 됩니다. 현대의 GPU는 초당 수십억 개의 SHA-256 해시를 계산할 수 있습니다. 만약 공격자가 SHA-256으로 해싱된 패스워드 데이터베이스를 탈취한다면, 무차별 대입(Brute-force) 공격을 통해 불과 몇 시간 만에 거의 모든 단순한 패스워드를 찾아낼 수 있습니다.


2. 현대적인 느린 해싱 알고리즘

무차별 대입 공격을 무력화하기 위해, 우리는 의도적으로 계산 비용이 많이 들도록 설계된 알고리즘을 사용합니다. 이를 '적응형' 해시라고 하며, 하드웨어가 빨라짐에 따라 '작업 계수(Work Factor)'를 높일 수 있습니다.

Argon2: 골드 표준

Argon2는 2015년 패스워드 해싱 대회(Password Hashing Competition)에서 우승했으며, 현재 OWASP와 NIST에서 권장하는 표준입니다.

  • Argon2id: 권장되는 변체입니다. GPU 기반 공격과 사이드 채널 공격 모두에 저항력이 있습니다.
  • 설정 가능: 메모리 사용량, 반복 횟수, 병렬성을 조정하여 서버에서 패스워드 하나를 해싱하는 데 약 500ms가 걸리도록 맞춤 설정할 수 있습니다.

bcrypt: 검증된 클래식

1999년에 개발된 bcrypt는 역사상 가장 널리 사용되고 신뢰받는 알고리즘 중 하나입니다.

  • 작업 계수: '비용(cost)' 매개변수를 사용합니다. 이 값을 1씩 높일 때마다 패스워드 해싱에 걸리는 시간이 두 배로 늘어납니다.
  • 여전히 안전함: 오래되었음에도 불구하고 bcrypt는 현대의 공격에 대해 여전히 매우 안전합니다.

scrypt: 메모리 하드(Memory-Hard)의 선구자

scrypt는 '메모리 하드성'을 도입한 첫 번째 주요 알고리즘입니다. 계산에 상당한 양의 RAM이 필요하므로, 공격자가 전용 해킹 하드웨어(ASIC)를 구축하는 비용을 극도로 높입니다.


3. 알고리즘 그 이상: 솔트와 페퍼

강력한 알고리즘을 사용하더라도 추가적인 보호 계층이 필요합니다.

솔트 (Salt): 레인보우 테이블 무력화

솔트는 해싱 전 패스워드에 추가되는 무작위 문자열입니다.

  • 이유: 솔트가 없다면, 두 사용자가 같은 패스워드('password123')를 쓸 경우 해시값도 같아집니다. 공격자는 '레인보우 테이블(미리 계산된 해시 목록)'을 사용하여 즉시 이를 해독할 수 있습니다.
  • 원칙: 모든 사용자는 계정 생성 시 생성된 고유하고 무작위인 솔트를 가져야 합니다.

페퍼 (Pepper): 비밀 계층

페퍼는 솔트와 비슷하지만, 데이터베이스가 아닌 안전한 설정 파일이나 하드웨어 보안 모듈(HSM)에 저장됩니다.

  • 이유: 공격자가 데이터베이스를 탈취하더라도 애플리케이션의 비밀 키(페퍼)를 모른다면 해시를 해독할 수 없습니다.

4. 개발자를 위한 베스트 프랙티스

  1. MD5나 SHA-1은 절대 금지: 보안 용도로는 완전히 무너졌습니다.
  2. 단순 SHA-256 피하기: 너무 빨라서 GPU로 쉽게 뚫립니다.
  3. Argon2id 또는 bcrypt 선택: 신규 프로젝트에는 Argon2id를 권장하며, bcrypt는 라이브러리 지원이 매우 뛰어난 대안입니다.
  4. 작업 계수 조정: 해싱 시간이 250ms에서 500ms 사이가 되도록 설정하세요. 사용자가 로그인을 기다리기엔 충분히 빠르면서 공격자를 막기엔 충분히 느린 속도입니다.
  5. 항상 솔트 사용: Node.js나 Python의 bcrypt 라이브러리 등 대부분의 현대적인 라이브러리는 솔트 처리를 자동으로 수행합니다.

요약 비교

알고리즘 유형 메모리 하드 권장 여부
MD5 빠른 해시 아니오 ❌ 절대 금지
SHA-256 빠른 해시 아니오 ❌ 부적합 (패스워드용)
PBKDF2 느린 해시 아니오 ⚠️ 레거시 전용
bcrypt 느린 해시 아니오 ✅ 권장
scrypt 느린 해시 ✅ 권장
Argon2id 느린 해시 🏆 최고

결론

패스워드 보호는 단순히 무작위 알고리즘을 선택하는 것이 아니라, 현대 하드웨어의 위력에 저항할 수 있도록 설계된 도구를 사용하는 것입니다. 적절한 솔트작업 계수를 갖춘 Argon2id를 사용함으로써, 여러분은 사용자에게 현재 가능한 최고 수준의 보안을 제공할 수 있습니다.

해시를 테스트하거나 개인 계정을 위한 안전한 패스워드를 생성하고 싶으신가요? 저희의 패스워드 생성기 도구해시 생성기를 사용하여 데이터를 안전하게 보호하세요.