🔐 Django에서 make_random_password() 오류 해결기 (Django 5.x 대응)

2025. 5. 19. 15:46·기술블로그-Django편

🔐 Django에서 make_random_password() 오류 해결기 (Django 5.x 대응)

🧨 1. 문제 상황 요약

소셜 로그인 회원가입 시 다음 코드에서 오류가 발생:

user.set_password(User.objects.make_random_password())

발생한 오류:

AttributeError: 'UserManager' object has no attribute 'make_random_password'

🔍 2. 오류 원인 분석

항목 설명

Django 버전 5.2.1
User 모델 커스텀 User 모델 사용 (AUTH_USER_MODEL = 'member.User')
문제 원인 Django 5.x부터 make_random_password()가 BaseUserManager에서 삭제됨
영향 User.objects가 해당 메서드를 갖고 있지 않음 → AttributeError 발생

✅ 3. 기존 방식 유지하면서 해결하기

기존에 하고 싶던 코드

user.set_password(User.objects.make_random_password())

해결 방법 → UserManager에 메서드 직접 구현

# member/models.py
import random
import string

class UserManager(BaseUserManager):
    def create_user(self, email, password):
        ...

    def make_random_password(self, length=10):
        chars = string.ascii_letters + string.digits
        return ''.join(random.choices(chars, k=length))

결과

user.set_password(User.objects.make_random_password())  # ✅ 정상 작동

🧠 4. 왜 이 방식이 안전한가?

  • 기존 구조 (User.objects)를 그대로 유지
  • Django 5.x에서도 안정적으로 작동
  • 보안상 충분히 강한 임시 비밀번호 생성 가능
  • make_random_password()를 직접 커스터마이징도 가능 (예: 특수문자 포함 등)

📌 5. 정리 요약

항목 내용

오류 원인 Django 5에서 기본 메서드 삭제됨
해결 방법 UserManager에 직접 동일한 메서드 추가 구현
기존 코드 유지 가능 여부 ✅ 가능
보안성 ✅ 충분히 안전함 (랜덤 + 조합 가능)

💡 추가 팁

  • 비밀번호 없이 가입하려면 set_unusable_password()도 고려 가능
  • make_random_password()에 옵션 추가로 보안 강화 가능:
def make_random_password(self, length=12, allowed_chars=None):
    if allowed_chars is None:
        allowed_chars = string.ascii_letters + string.digits + '!@#$%^&*()'
    return ''.join(random.choices(allowed_chars, k=length))

이제 Django 5에서도 코드 수정 최소화 + 완전 대응이 가능합니다 💪
프로젝트 전체에 깔끔하게 반영해보세요!

'기술블로그-Django편' 카테고리의 다른 글

🧠 DRF와 Form 방식의 코드 생성 흐름 차이 - 왜 staticmethod를 써야 하고, commit=False를 쓰는가?  (0) 2025.05.20
🧪 Django shell로 클래스/메서드 유효성 확인하는 방법 총정리  (0) 2025.05.19
📘 Django에서 as_view()가 필요한 이유 - FBV vs CBV 완전 정리  (0) 2025.05.19
🔐 Django signing.dumps() 완벽 이해하기  (0) 2025.05.19
📌 OAuth2 & 네이버 소셜 로그인 흐름 완전 정리  (0) 2025.05.16
'기술블로그-Django편' 카테고리의 다른 글
  • 🧠 DRF와 Form 방식의 코드 생성 흐름 차이 - 왜 staticmethod를 써야 하고, commit=False를 쓰는가?
  • 🧪 Django shell로 클래스/메서드 유효성 확인하는 방법 총정리
  • 📘 Django에서 as_view()가 필요한 이유 - FBV vs CBV 완전 정리
  • 🔐 Django signing.dumps() 완벽 이해하기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (798) N
      • Python (32)
      • 프로젝트 (114)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    livebroadcast
    hotcoffeecase
    basalcellcarcinoma
    chinanightlife
    bts
    youngprofessionals
    btsreunion
    btsjungkook
    chatgpterror
    life reflection
    americaparty
    trumpmuskclash
    americanlaw
    newpoliticalparty
    homebartrend
    self-growth
    travel ban
    smartphonedurability
    btsdischarge
    college reunions
    RM
    remittance
    global politics
    urbantrends
    lawsuitculture
    btscomeback
    titaniumcase
    gpterror
    classaction
    뷔
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
🔐 Django에서 make_random_password() 오류 해결기 (Django 5.x 대응)
상단으로

티스토리툴바