기술블로그-Django편

🔐 Django 비밀번호 암호화와 검증 완전 정리

Chansman 2025. 5. 13. 11:45

🔐 Django 비밀번호 암호화와 검증 완전 정리

비밀번호를 안전하게 저장하고 검증하기 위한 Django의 핵심 메서드인 make_password()와 check_password()의 작동 원리를 이해하고 실습 예제를 통해 정리합니다.


1. 🔧 make_password() - 비밀번호 해시화

from django.contrib.auth.hashers import make_password

hash1 = make_password("password")
hash2 = make_password("password")

✅ 특징

  • 같은 문자열이라도 해시값이 다르게 생성됨
  • 이유: Django는 내부적으로 **salt(소금값)**를 랜덤하게 추가하여 해시를 생성하기 때문
  • 결과:
print(hash1 == hash2)  # False

🔐 목적

  • 해커가 비밀번호 DB를 탈취하더라도 동일한 해시값이 없게 만들어 무차별 대입 공격 방지

2. ✅ check_password() - 비밀번호 확인

from django.contrib.auth.hashers import check_password

check_password("password", hash1)  # True
check_password("password", hash2)  # True

💡 작동 방식

  • 입력한 평문 비밀번호를 동일한 방식으로 해시 처리
  • 저장된 해시값과 비교하여 일치 여부 확인

3. 🧠 시각화 흐름 정리

입력값:      "password"
   ↓
make_password("password")
   ↓
hash1 = 'pbkdf2_sha256$260000$abcd...'
hash2 = 'pbkdf2_sha256$260000$xyz...'  (다름!)
   ↓
check_password("password", hash1) → ✅ True
check_password("password", hash2) → ✅ True

4. ✅ 요약 비교표

함수 역할 사용 시기 결과

make_password() 평문 → 해시화 회원가입, 비밀번호 변경 시 저장용 해시 생성
check_password() 평문 vs 해시 비교 로그인 인증 시 True / False 반환

5. 📌 실전 팁

  • 사용자 객체 생성 시 해시 적용:
from django.contrib.auth.hashers import make_password

user = CustomUser.objects.create(
    username="user4",
    password=make_password("password")
)
  • 혹은 create_user() 사용 시 내부적으로 set_password() 적용됨:
CustomUser.objects.create_user(username="user4", password="password")

✅ 결론

  • Django는 매번 다른 해시값을 생성함으로써 보안을 강화합니다.
  • check_password()는 동일한 평문 입력을 정확히 확인 가능하게 합니다.
  • 실무에서는 항상 평문 비밀번호를 그대로 저장하지 말고 해시 처리해야 합니다!

이제 set_password()와 create_user()의 내부 흐름도 함께 보고 싶다면 다음 포스팅에서 이어드립니다! 😊