티스토리 뷰

반응형
더보기

로그인 기능을 구현하기 위한 user관련 개념들을 정리해보자. 회원가입을 하기위한 modelform에 대한 개념과 로그인 시 토큰 관리 방법까지 순차적으로 개념을 정리해 나갈 것이다.

 

기본적으로 회원가입을 할 때, 우리는 비밀번호를 2번 작성하고 검증하는 단계를 거쳐야한다. 그러나 장고에서는 알아서 내부적으로 구현이 되어있기 때문에 가져다 쓰기만 하면된다. 그렇게 하기위해서는 장고 내부코드를 확인하는 과정이 필요하다.

 

사용자인증관리를 위해서는 User에 대한 이해가 필수적이다. 반드시 이해하고 넘어가자.

 

User 모델

지금부터 우리는 장고 내부코드를 확인 할 것이다. 이 때 전제가 되는 부분은 장고의 내부 코드는 바꾸는 것이 불가능 하다는 것이다. 따라서 적절한 코드를 가져다 쓰기 위해서는 먼저 내부코드를 이해하는 것이 선행 되어야 한다.

 

공식문서를 확인 하자. 구글에 github django를 검색한다.

들어가서 django/contrib/auth/models.py를 들어가자.

https://github.com/django/django/blob/master/django/contrib/auth/models.py

 

django/django

The Web framework for perfectionists with deadlines. - django/django

github.com

 

 

기본적으로 User라는 클래스가 있다. User를 불러와 쓰려면 User의 부모 디렉터리에 무엇이 있는지를 확인하고, 무엇을 오버라이딩(부모의 매서드를 가져다 쓰는것)을 할 수 있는지 확인이 필요하다. User를 상속해주는 abstractUser를 클릭해서 그 부분을 아래에서 확인해 보자.

 

 

대략적으로 보면 AbstractUser는 변수로 username, first_name, last_name, email 등등 을 담고 있고 AbstractBaseUser의 상속을 받고 있는 것을 알 수 있다.

 

따라서 User는 오버라이딩에 의해 username, first_name, last_name, email 등등의 변수를 사용할 수 있고, AbstractUser가 상속받는 AbstractBaseUser에서 정의된 변수도 사용 할 수 있다.

 

그러면 이제 AbstractUser이 상속 받고 있는 AbstractBaseUser에 들어가 보자.

 

 

대략 위와 같이 구성되어있다.

대략적으로 보면

password = models.CharField(~

last_login = models.DateField(~

is_active = True

라고 되어있다. is_active는 이 사람이 활성화 되어있는 사람인가에 대한 내용을 담고 있다.

 

AbstractBaseUser는 models.Model에게 상속받았다는 것도 확인가능하다. 우리가 확인한 내용들을 정리해 보자.

 

 

상속관계

models.Model AbstractBaseUser AbstractUser User

=> 오른쪽으로 가면서 상속을 받아서 class 생성을 한다.

위에서 본 것 처럼

AbstractBaseUser는 password, lastlogin, is_active를 가지고 있다.

AbstractUser는 username, 성, 이름, 이메일 기타 등등을 가지고 있다.

즉, 우리가 구현 할 상황에 따라 상속받아 쓰면 된다. 아래의 예시를 보고 다시 이해해 보자.

 

case1. 비밀번호는 상속을 받고, 나머지는 직접정의하고 싶은 경우

models.py에서 AbstractBaseUser를 상속받아 MyUser라고 class를 만들면된다.

 

case2. 이름과 이메일은 기본으로 상속받고 주소 같은 것을 정의하고 싶은 경우

AbstractUser를 상속 받아서 class MyUser(AbstractUser):라고 쓰면된다.

 

 

+회원가입로직에서 배운 UserCreationForm을 잠깐 다시 보면

class UserCreationForm(forms.ModelForm)으로 모델폼의 상속을 가진다.

그리고 내부에는 password1과 password2가 정의 되고 있고, Meta부분을 보면 model은 User고, 필드에서는 위에서 배운 User 중에 'Username'만 가져오기 때문에 회원가입 시 ID와 암호 input값으로 총 3가지만 뜨는 것이다.

 

 

 

 

정리

현재 우리는 User를 그냥 가져다 쓰고 있다. 개발을 하다 보면 이 User 말고 customizing 해야 할 필요가 있으면, models.py에서 MyUser 클래스를 만들어서 다른거 가져다 쓸꺼다. 이때 get_user_model이라는 method를 통해서 설정 값 하나만 바꾸면 상황에 따라 UserCreationForm과 같이 위의 것들 가지고 오기가 가능하다.

즉, 유연한 대처를 위해 이제부터 우린 get_user_model을 쓴다.

User  
AbstractUser is_superuser, username, first_name, last_name, email, is_staff, is_active, date_joined
AbstractBaseUser password, last_login
AuthenticationForm 모델관련x, 단지 login정보를 받아서 장고 세션이라는 DB에 저장하기 위한 도구. 여기서만 form.get_user()를 쓸 수 있다.
UserCreationForm 모델을 통한 modelform

User

이제 본격적으로 User 자체에 대한 개념을 알아보자.

공식문서) django user 검색

user authentication in django 들어가자. 그래서 user object 눌러보자.

https://docs.djangoproject.com/en/3.0/topics/auth/default/#user-objects

 

Using the Django authentication system | Django documentation | Django

The Django Software Foundation deeply values the diversity of our developers, users, and community. We are distraught by the suffering, oppression, and systemic racism the Black community faces every day. We can no longer remain silent. In silence, we are

docs.djangoproject.com

위의 5가지가 default user의 속성이다. User에 5가지가 들어있는 이유는 위에서 오버라이딩에 의함이라는 것을 알수있다.

 

위의 코드는 user를 생성해서 DB에 저장 시키는 로직이다. 이해가 안된다면, 회원가입을 GUI환경에서 하는 것이라고 생각하면 된다.

 

creating users를 만드는 걸 읽어보면 create_user()을 써달라고 나온다. 우리는 앞에서 DB에 저장하는 예로, Article 만들려면 Article.objects.create(title=~~, content=~~)이런식으로 했는데 그냥 create를 안하고 create_user()를 써야할까? 그 이유는 패스워드를 고려해서 그렇다. shell_plus를 들어가서 확인해 보자.

# shell_plus

# 설치
> pip install django-extensions

# settings.py에 app추가
    'django_extensions',
    
# shell_plus 실행
> python manage.py shell_plus

 

> u = User.objects.create(username='John', password='123')
> User.objects.all()
< <QuerySet [<User:John>]>

> u.password
< '123'

User에 John이 생성된걸 확인 할 수 있다. 그러나 프로젝트에서는 사용하면 안된다. 왜냐하면 위의 u.password처럼 비번이 노출되면 안되기 때문이다. create말고 create_user를 사용하면 자동으로 암호화 된다. 즉, 기본적인 암호화 기능을 내부적으로 도와주고 있는거다. 아래와 같이 create_user를 사용하면 암호화되어 있는 것을 알 수 있다.

> real = User.objects.create_user(username='realJohn', password='123')
> real.password
< oqiwefnonoew[ihfo[iwhifowhef

 

즉, 비번은 암호화를 해야하기 때문에 고려해야할 부분이 많다. 그렇기 때문에 직접 User, form을 만들지 않고 패스워드 로직이 포함된 ModelForm을 쓴다.

 

 

 

패스워드 변경하기

User django 검색 후 사이트 들어감 -> Usage -> working with User objects

https://docs.djangoproject.com/en/3.0/topics/auth/default/#user-objects

 

Using the Django authentication system | Django documentation | Django

The Django Software Foundation deeply values the diversity of our developers, users, and community. We are distraught by the suffering, oppression, and systemic racism the Black community faces every day. We can no longer remain silent. In silence, we are

docs.djangoproject.com

set_password 함수를 이용하면 된다.

 

 


 

Django 비밀번호 암호화 로직

어떠한 방식으로 비번을 암호화 하여 저장할까? 아래의 4가지 방법을 순차적으로 이용한다.

1. 해시

2. 솔트

3. 반복

4. 알고리즘

 

일반적으로 DB에 비밀번호를 그대로 저장 할 수 없다. 따라서 사람들이 못 알아보게 바꿔서 DB에 저장해야한다. 이렇게 바꾸는데 사용하는 것이 해시함수이다. 해시함수는 문자열을 다르게 바꿔주기 때문에 비밀보장이 된다.

 

Secure Hash Algorithm(암호화 해시 알고리즘)

SHA256 - 블록체인에서 많이쓰는 단방향 해시함수 알고리즘이다. 역산이 가능하면 바꾼 의미가 없어지기 때문에 단방향이다.

SHA256말고도 구글검색해 보면 변환하는 거 많다. 여기서의 핵심은 결과는 동일해야하고 역으로는 불가능 하다는 것이다. 그래야 로그인 시 ==면 로그인이 된다.(해쉬나 솔트 없으면 login검증이 안된다.)

 

 

같은 값이 넣으면 같은 값이 나오면 하나씩 넣어보면 비밀번호를 찾을 수 있다. 이러한 문제를 해결하기 위해서 솔트(salting)한다. 즉, DB 저장 시 암호에 다른 값을 추가해서 저장한다.

 

 

반복은 은 단순하게 값을 늘려서 해시화를 함으로 탐색 시간을 늘리는 것이다.

 

 

알고리즘으로는 pbkdf2를 쓴다. 솔트를 적용한 후 해시 함수의 반복 횟수를 임의로 선택할 수 있다.

 

 

 

 

 

 

다음은 회원가입에 대해 알아보자

han-py.tistory.com/145

 

[Django]사용자인증관리_signup(회원가입)_UserCreationForm

회원가입을 하면 기본적으로 username과 password 적는 란이 필요하다. 그러면 models.py에서 추가해서 하면 될까? 그러면 비번은 안보이게 하고, DB에서도 비번은 보이면 안된다. 즉, password를 암호화 저

han-py.tistory.com

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함