Django admin
, Django auth
를 쓰지 않다가 사용할 일이 생겼다
그 중, Django auth
에 대해 필요한 부분만 포스팅하면 좋을 것 같다는 생각이 들었다.
모든 출처는 공식문서
Django auth
는 인증/인가를 모두 처리한다.
Django auth
의 User
객체는 기본적으로 5개의 컬럼을 가지고 있다.
username
password
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
는 암호를 저장할 때, 그 값을 그대로 저장하는 게 아닌 해시된 값을 저장한다
이런식으로 암호화되어 저장됨
authenticate
는 username
과 password
를 이용해 인증하는 메소드이다.
기존의 email
을 받던 필드 내용은 개인사정으로 phone_number
로 변경했다.
(둘 다 unique=True
설정해서 괜찮)
authenticate
의 결과가 존재하면 객체가 리턴되고, 없으면 아무것도 반환되지 않는다
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
비밀번호가 완전히 숫자가 아닌지 확인한다.
그 외 회사에 맞는 규정에 맞게 추가하면 된다.
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'
이렇게 설정을 해줘야 한다.
이거 안 해주면 Django
의 auth_user
가 기본 모델이 된다.