[drf] user custom

최동혁·2023년 5월 14일
0

DRF

목록 보기
17/19

django.contrib.auth.models.User

  • Django에서는 기본적으로 User 모델을 제공해서 간단한 인증 시스템에 적합한 기능을 제공한다.
  • 그러나 Django REST Framework (DRF)을 사용하여 API를 개발할 때, 기본 User 모델로는 API 요청에 맞는 커스터마이징이 어려울 수 있다.
  • 이에 따라 DRF에서는 기본 User 모델을 커스텀하여 필요한 추가 필드, 메서드, 권한 등을 포함하는 사용자 모델을 만들어 사용하는 것이 권장된다.

Django에서 커스텀 사용자(Custom User)를 정의할 때 UserManager 클래스를 사용하는 이유는 4가지가 있다.

  1. 사용자 관리 기능

    • UserManager 클래스는 Django의 인증 시스템과 관련된 사용자 관리 기능을 제공한다. 사용자 생성, 수정, 삭제 등과 같은 일반적인 사용자 관리 작업을 처리할 수 있다. 이를 통해 커스텀 사용자 모델에 대한 일관된 관리 기능을 구현할 수 있다.
  2. 인증 기능

    • UserManager 클래스는 사용자 인증에 필요한 기능을 제공한다. 인증은 사용자의 로그인, 로그아웃, 암호화된 비밀번호 설정 및 검증 등을 포함한다. 커스텀 사용자 모델의 필드 및 동작에 따라 인증 과정을 구성할 수 있도록 UserManager 클래스를 사용한다.
  3. 유효성 검사

    • UserManager 클래스는 사용자 생성 및 수정 시 입력 데이터의 유효성을 검사하는 기능을 제공한다. 예를 들어, 필수 필드의 값이 제공되었는지, 유일성 제약 조건을 충족하는지, 비밀번호가 일치하는지 등을 검사할 수 있다.
  4. 장고의 관례와 호환성

    • Django는 기본 제공 User 모델과 함께 UserManager 클래스를 사용하는 것을 권장한다. Django의 여러 기능과 서드파티 앱들은 이 관례를 따르고 있어서 커스텀 사용자 모델을 정의할 때도 호환성과 일관성을 유지하기 위해 UserManager 클래스를 사용하는 것이 일반적이다.

사용 방법

  • 일단 Django 커스텀 유저를 정의하기 위해서는 UserManager Class가 필요하다.
    • UserManager 클래스는 이름을 어떻게 하든 상관은 없다. BaseUserManager 클래스를 상속받기만 하면 된다.

BaseUserManager

  • BaseUserManager는 User를 생성할 때 사용하는 헬퍼 클래스이다.
  • User를 생성할 때는 User data가 BaseUserManager를 거쳐 생성된다.
  • 필자는 이번에 create_user 함수와 create_superuser 함수를 정의해 사용하도록 하겠다.
class UserManager(BaseUserManager):
    def create_user(self, phone_number, password=None):
        if not phone_number:
            raise ValueError("Users must have a phone number")
        user = self.model(
            phone_number=phone_number,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, phone_number, password):
        user = self.create_user(
            phone_number=phone_number,
            password=password,
        )
        user.is_staff = True
        user.is_admin = True
        user.save(using=self._db)
        return user

create_user

  • create_user 함수는 관리자를 포함한 모든 사용자를 생성할 때 실행되는 함수이다.
  • User에 해당하는 필드(Field) 값들을 받고, 이를 데이터베이스에 저장하는 역할을 한다.
  • 기본적으로 is_adminis_staff 필드는 False로 지정되어 있다.
  • 이 필드들은 관리자를 생성할 때는 아래에서 설명하는 create_superuser 함수를 거쳐 True값으로 변경된다.

create_superuser

  • create_superuser 함수는 관리자를 생성할 때 실행되는 함수이다.
  • 우선 들어온 정보들을 받아 일반 사용자를 만드는 함수인 create_user 에서 사용자 정보를 데이터베이스에 저장하고, is_supseruser, is_staff 부분을 True로 만들어 데이터베이스에 저장한다.

using=self._db

  • using은 Django의 데이터베이스 라우팅(Database Routing) 기능을 사용하여 명시적으로 데이터베이스를 지정하는 데 사용되는 매개변수이다.
  • Django에서는 여러 개의 데이터베이스를 사용할 수 있으며, 각 데이터베이스에 대한 라우팅을 제어하고자 할 때 using 매개변수를 사용할 수 있다.
  • self._db는 현재 사용 중인 데이터베이스를 가리키는 속성이다.
  • using=self._db는 현재 데이터베이스를 사용하여 데이터를 저장하도록 지정한다.
  • 이는 다중 데이터베이스 환경에서의 데이터 일관성과 라우팅을 지원하기 위한 목적으로 사용될 수 있다.

set_password

  • set_password는 Django의 내장 메서드로, 사용자의 비밀번호를 안전하게 설정하는 데 사용된다.
  • 비밀번호를 평문으로 저장하는 대신, set_password를 사용하여 비밀번호를 해시(hash)하여 저장한다.
  • 이를 통해 보안성을 강화하고 사용자 비밀번호를 안전하게 보호할 수 있다.
  • set_password 메서드는 인자로 받은 비밀번호를 해시값으로 변환하여 사용자 객체에 저장한다.
  • 따라서 사용자 인증 시에는 입력한 비밀번호와 저장된 해시값을 비교하여 일치 여부를 확인한다.
  • Django의 set_password 메서드에서 사용되는 해시 알고리즘은 기본적으로 PBKDF2 알고리즘이다.
  • PBKDF2(Password-Based Key Derivation Function 2)는 비밀번호 기반 키 파생 함수로, 입력된 비밀번호를 안전하게 저장하기 위해 사용된다.
  • 이 알고리즘은 단방향 해시 함수를 반복하여 적용하고, 솔트(Salt)와 같은 추가 데이터를 사용하여 비밀번호를 보호한다.

AbstractBaseUser

AbstractBaseUser를 상속받는 주된 이유는 Django에서 제공하는 기본 인증 시스템을 커스터마이즈하기 위해서이다.

  • Django의 AbstractBaseUser는 Django의 기본 User 모델의 핵심 기능을 제공하며, 커스텀 사용자 모델을 만들기 위한 베이스 클래스로 사용된다.
  • AbstractBaseUser를 상속받아 커스텀 사용자 모델을 정의하면 다음과 같은 이점을 얻을 수 있다.
  1. 유연한 사용자 모델 구성: AbstractBaseUser를 상속받으면 사용자 모델을 필요에 맞게 구성할 수 있다. 기본 User 모델과는 달리 사용자 이름, 이메일, 핸드폰 번호 등을 식별자로 사용하거나 필요한 추가 필드를 정의할 수 있다.

  2. 인증 시스템 커스터마이즈: AbstractBaseUser를 상속받으면 사용자 인증 시스템을 완전히 커스터마이즈할 수 있다. 비밀번호 저장, 로그인, 로그아웃, 액세스 권한 부여 등과 같은 인증 관련 기능을 필요에 맞게 구현할 수 있다.

  3. Django의 기능과 통합: AbstractBaseUser는 Django의 다양한 기능과 원활하게 통합된다. 예를 들어, 관리자 사이트, 인증 백엔드, 세션 관리 등 Django의 기능을 사용하면서 커스텀 사용자 모델을 사용할 수 있다.

  4. 커뮤니티 지원: Django 커뮤니티는 주로 AbstractBaseUser를 기반으로 한 커스텀 사용자 모델을 지원하고, 관련된 문서와 자료를 제공한다. 커스텀 사용자 모델을 AbstractBaseUser를 기반으로 구현하면 커뮤니티 리소스에 쉽게 액세스하여 도움을 받을 수 있다.

따라서, AbstractBaseUser를 상속받는 것은 Django의 인증 시스템을 커스터마이즈하여 프로젝트의 요구사항에 맞는 사용자 모델을 구현하고, Django의 다양한 기능과 통합하여 효율적인 개발을 지원하는 데 도움을 준다.

User

class User(AbstractBaseUser):
    phone_number = models.CharField(max_length=20, unique=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = "phone_number"
  • Usermanager 클래스의 인스턴스를 objects 속성에 할당하여 사용자 모델의 관리 기능을 제공함.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글