우리는 커뮤니티를 이용할 때 가장 먼저 무엇을 할까? 일부 커뮤니티는 비회원으로 게시글 작성/수정이 가능하지만 일반적인 경우에는 회원가입을 한 뒤에 게시글 작성/조회/수정/삭제가 가능하다. Django에서는 회원가입시 Auth(authentication system) 기능과 Authorization 기능을 제공하고 있다. 이는 Django만의 강점중 하나이다.
Authentication(인증)
Authorization(권한, 허가)
초기화
데이터 베이스 초기화 후 마이그레이션을 진행하도록 하자. 이미 데이터베이스에 많은 데이터들이 저장되어 있기 때문에 오류가 발생할 수 있다.
migrations 파일 삭제(migrations 폴더 및 init.py는 삭제하면 안 됨.)
dbsqlite3 삭제
django-extensions 설치
$ pip install django-extensions
settings.py
INSTALLED_APPS에 django_extensions
등록
ipython 설치
$ pip install ipython
프로젝트 settings.py
마지막 문단에 추가!
AUTH_USER_MODEL = 'accounts.User'
//
shell plus
$ python manage.py shell_plus
exit()
으로 빠져나올 수 있다.
//
models.py
기존의 우리는 models.py에서 html에서 넘어온 데이터들을 DB에 저장할 수 있도록 텍스트의 길이와 같은 설정들을 직접 설정해주었지만 회원가입 기능을 구성을 할 때는 AbstractUser모델을 상속받아서 이미 django에서 설정한 설정을 이용만 하자. 즉, 우리가 import한 AbstractUser 모델에는 엄청나게 많은 필드들이 이미 깔려있다. 우리는 이 AbstractUser를 우리 입맛대로 쓰고싶은 거는 쓰고, 쓰기 싫은거는 쓰지 않고 사용하게 될 것이다.
회원은 가입시 일반적으로 암호(password)를 저장하고, 별도의 처리가 필요하다. Django에서는 기본적으로 PBKDF2(Password-Based Key Derivation Function)를 사용하여 저장한다.
단방향 해시함수를 활용하여 비밀번호를 다이제스트로 암호화하며, 이는 복호화가 불가능하다.
단방향 해시함수는 MD5, SHA-1, SHA-256 등이 존재하며 Django는 SHA-256을 활용한다.
다이제스트 : 암호화된 값 혹은 해시값
단방향 해시함수의 경우 레인보우 공격 및 무차별 대입공격 등의 문제가 발생 가능하다. 따라서 솔팅, 키 스트레칭의 기법을 추가적으로 활용한다.
솔팅(Salting) : 패스워드에 임의의 문자열인 salt를 추가하여 다이제스트를 생성
키 스트레칭(Key Stretching) : 해시를 여러 번 반복하여 시간을 늘림
착한 Django는 이 기능을 모두 제공하고 있다.
$ python manage.py startapp accounts
settings.py
INSTALLED_APPS에 'accounts' 추가 및 프로젝트 폴더 path설정!
accounts 파일에 urls.py
생성!
models.py
다음과 같이 작성! 해당 형식은 django에서 권하는 형식이므로 잘 지키도록 하자.
urls.py
views.py
signup.html
서버 실행!
django에서 제공하는 회원가입폼을 적용한 모습이다.
추가로 bootstrap5를 적용해보자.
base.html
서버 새로고침!
bootstrap5가 적용된 모습이다.
회원 탈퇴를 위해 accounts에서 delete를 위한 urls.py, views.py를 설정하자!
path('delete/',views.delete,name='delete'),
패스 설정 완료
회원 탈퇴 완료! 이건 좀 간단하다.
모델폼을 상속받아보자. 사실 custom은 취향차이지만 꼭! 꼭! 쓰도록 하자.
views.py
현재 signup함수에서는 UsedrCreationForm을 import하여 django가 제공하는 회원가입 기능들을 구현하고 template을 통해서 사용자에게 보여주었다.
Model custom
Django는 새 프로젝트를 시작하는 경우 비록 기본 User 모델이 충분하더라도 커스텀 User 모델을 설정하는 것을 강력하게 권장하고 있다. 커스텀 User 모델은 기본 User 모델과 동일하게 작동하면서도 필요한 경우 나중에 맞춤 설정을 할 수 있기 때문이다.
forms.py
생성!
첫 번째 줄에 from django.contrib.auth.forms import UserCreation
은 views.py에서 import하여 signup함수에서 똑같이 사용했던 UserCreationForm이다.
forms.py에서 UserCreationForm이라는 폼을 상속받아서 CustomUserCreationForm 클래스를 생성하자. 기존에 forms.py형식과 같다. 다른 점은 CustomUserCreationForm은 UserCreationForm을 상속받아 그 기능을 그대로 사용할 수 있는데 이미 UserCreationForm에는 이미 많은 필드들이 존재한다.
정말 많다.............
따라서 fields = '__all__'
로 설정할 경우 많은 정보를 입력받을 수 있게된다.
따라서 우리가 필요한 데이터만을 입력받아 저장할 수 있도록 fields 설정을 해야한다.
로그인 한 사람의 기록을 admin에서 확인하고 싶다면? admin.py에 다음과 같이 등록하자.
해당 형식은 django에서 권고하는 방법이므로 프로젝트 시작시 이렇게 설정을 하도록 하자.
이것이 바로 우리가 프로젝트 settings.py에 설정한 까닭은 프로젝트 내 USER모델을 우리가 설정한 accounts 애플리케이션에 User를 설정한 것이다.
따라서 만약 우리가 진행한 USER모델을 참조하여 쓰기 위해서는 get_user_model()을 사용하자
바로 다음 포스트에서 이어서 진행하도록 하겠다.