🔐 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 |