TIL61 - Django auth

Kiyong Lee·2022년 2월 2일
0

Django

목록 보기
35/35

Django auth


Django admin, Django auth를 쓰지 않다가 사용할 일이 생겼다

그 중, Django auth에 대해 필요한 부분만 포스팅하면 좋을 것 같다는 생각이 들었다.

모든 출처는 공식문서


1. 개요

Django auth는 인증/인가를 모두 처리한다.


2. 인증시스템 사용하기


User

Django authUser 객체는 기본적으로 5개의 컬럼을 가지고 있다.

username
password
email
first_name
last_name


사용자 생성

가장 일반적인 방법은 create_user()를 사용하는 것이다.

from django.contrib.auth.models import User

user = User.objects.create_user('john', 'lennon@beatles.com', 'pwdjohn')
user.last_name = 'lennon'
user.save()

슈퍼유저(관리자) 생성

python manage.py createsuperuser --username=joe --email=joe@email.com

일반적인 생성방법인데, 뒤에 명령어를 기억하는 게 어렵다면 아래와 같이 입력만 해도 된다

python manage.py createsuperuser

이것만 입력하면 변수 입력하라고 메시지가 나오니 입력하면 된다.


비밀번호 변경

from django.contrib.auth.models import User

user = User.objects.get(id=1)
user.set_password('1234')
user.save()

Django는 암호를 저장할 때, 그 값을 그대로 저장하는 게 아닌 해시된 값을 저장한다

이런식으로 암호화되어 저장됨


사용자 인증

authenticateusernamepassword를 이용해 인증하는 메소드이다.

기존의 email을 받던 필드 내용은 개인사정으로 phone_number로 변경했다.
(둘 다 unique=True 설정해서 괜찮)

authenticate의 결과가 존재하면 객체가 리턴되고, 없으면 아무것도 반환되지 않는다


2. 비밀번호 관리


Django는 유연한 비밀번호 저장 시스템을 제공하며, 기본적으로 PBKDF2를 사용한다.

Django 설정을 참조하여, PASSWORD_HASHERS를 설정한다

기본 값으론 아래와 같다

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.ScryptPasswordHasher',
]

나는 PBKDF2PasswordHasher에 대해서만 포스팅 할건데, PBKDF2는 여러번의 반복, 해싱을 한다.

Bcrypt에서 해싱과 salting을 배웠었는데 그 때 그 내용이다.

해싱 : 임의의 길이 데이터를 고정된 길이의 데이터로 매핑
salting : 실제 비밀번호 이외에 랜덤데이터를 더해서 해시값 계산하는 방법


수동으로 비밀번호 관리

django.contrib.auth.hashers

이 모듈은 해시된 암호를 만들고, 유효성을 검사하는 함수 집합을 제공한다.

check_password(password, encode)
make_password(password, salt=None, hasher=default)

check_password는 일반 텍스트 암호를 데이터베이스의 해시화된 암호를 비교하는 메소드이다.
password에는 내가 프론트엔드로부터 받은 비밀번호 입력 값을,
encode에는 데이터베이스의 해시화된 암호를 입력한다.

내가 입력한 비밀번호가 1234라고 한다면

user = User.objects.get(id=1)

def check_password('1234', user.password) :

이렇게 쓰게 된다.

make_password는 입력받은 비밀번호를 암호화해서 데이터베이스에 저장하는 메소드이다.

password는 내가 입력한 비밀번호를, hasher는 아까 password_hashers를 사용한다.

def make_password(password='1234', hasher=PBKDF2PasswordHasher()

이렇게 쓰면 된다.


비밀번호 확인 활성화

비밀번호 유효성 검사는 AUTH_PASSWORD_VALIDATORS에서 설정한다.

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 9,
        }
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

  • UserAttributeSimilarityValidator
    암호와 사용자 속성 집합 간의 유사성을 확인한다.
  • MinuminLengthValidator
    암호가 최소 길이를 충족하는지 확인한다. 여기선 최소 길이가 9글자이다.
  • CommonPasswordValidator
    암호가 일반 암호 목록에 있는지 확인한다. 기본적으로 20,000개의 공통 암호가 포함된 목록과 비교한다.
  • NumericPasswordValidator
    비밀번호가 완전히 숫자가 아닌지 확인한다.

그 외 회사에 맞는 규정에 맞게 추가하면 된다.


3. 사용자 정의, 사용자 모델 지정

Django에서 호환되는 사용자 지정 모델을 구성하는 가장 쉬운 방법은 AbstractBaseUser를 상속받는 것이다.

  • USERNAME_FIELD
    사용자를 식별하기 위한 필드를 설명하는 문자열이다.
    unique=True가 설정되어야 한다.
  • EMAIL_FIELD
    유저 모델의 이메일 필드를 설명하는 문자열이다. get_email_field_name()에 의해 리턴된다.
  • REQUIRED_FIELDS
    createsuperuser를 통해 사용자를 생성할 때, 묻는 필드 리스트이다.
  • is_active
    쉽게 말해 사용자가 활성/비활성이냐를 묻는 건데 가입하면 True, 탈퇴하면 False로 설정하는 게 예시

그리고 커스텀 유저 모델을 대체 할 수 있다.

Django의 기본 User 변수들을 봤을 때, 내가 새로 만들어야 하는 경우

AUTH_USER_MODEL = 'myapp.User'

이렇게 설정을 해줘야 한다.

이거 안 해주면 Djangoauth_user가 기본 모델이 된다.

profile
ISTJ인 K-개발자

0개의 댓글