Django Setting

이재문·2022년 5월 31일
0

지금까지 django에서 지원하는 사용자에 대한 기능을 사용 해 본적이 없다.
(request.user 조차도) 그래서 여러가지 기능을 사용하며 프로젝트의 Settings.py에 선언된 몇 가지를 기록하려 한다.
종류는 아래와 같다.

  • DRF
  • last_login
  • simple_JWT
  • password_validator
  • password_hasher

나는 유저 관리를 JWT, User Password 등 여러가지 API를 PyJWT와 bcrypt등 라이브러리를 사용하여 직접 구현했다(직접 다 만들어야 하는 줄 알았다. Django가 어느 부분까지 지원 해 주는지 명확히 알지못했음). 나는 request.user로 User를 특정 해 줄수 있는걸 안지 오래되지 않았다. token 복호화 decorator를 직접 만들어 썼기 때문에 이게 최선인줄 알았다..

DRF

DRF로 API를 쉽게 컨트롤 할 수 있도록 세팅한 것이다.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',  # 인증된 사용자만 접근 가능
        'rest_framework.permissions.IsAdminUser',  # 관리자만 접근 가능
        'rest_framework.permissions.AllowAny',  # 누구나 접근 가능
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        # 'rest_framework_jwt.authentication.JWTAuthentication',
        # 'rest_framework.authentication.TokenAuthentication',
        # 'rest_framework.authentication.SessionAuthentication',
        # 'rest_framework.authentication.BasicAuthentication',
    ),
}

DEFAULT_PERMISSION_CLASSES: API에 권한을 부여 해 줄때 BasePermission으로 접근 가능한 permission 이다.
DEFAULT_FILTER_BACKENDS: API에 filter로 사용 할 세팅을 정의
DEFAULT_RENDERER_CLASSES: API에 기본적인 rederer 선언
DEFAULT_AUTHENTICATION_CLASSES: request.user로 토큰을 판별 할 토큰 설정 정의


Last_login

UPDATE_LAST_LOGIN = True
  • Simple_JWT를 사용 할 때, UPDATE_LAST_LOGINTrue이면, 로그인 할 때 User 컬럼 내에 last_login에 업데이트 된다.

Simple_JWT

JWT를 사용하기 위해 찾던 중 여러가지 패키지가 있지만 DRF에 최적화 되어 있고, 최근까지 업데이트 된 패키지 였기에 선택했다. API에서 request.user로 User 특정 가능(token을 복호화 해줌).이렇게 간단한 방법이 있는데 왜 나는 데코레이터를 만들어 모든 api에 적용하려 했을까?

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(hours=15),
    # access_token 유효시간
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    # refresh_token 유효시간
    'ROTATE_REFRESH_TOKENS': True,    
    # True이면 refresh api에 토큰을 이력하면 refresh_token과
    # access_token이 함께 재발급 된다
    'BLACKLIST_AFTER_ROTATION': True,
    # True이면 기존에 사용하던 refresh토큰은 사용 할 수 없도록, blacklist에 저장 
    
    'UPDATE_LAST_LOGIN': True,
    
    'ALGORITHM': ALGORITHM,
    'SIGNING_KEY': SECRET_KEY,
	# Token 만들 때, Algorithm과 Secret_key가 필요하기에 넣어 준다.
    'AUTH_HEADER_TYPES': ('Bearer',),
    # 보통의 경우에 Bearer Token을 사용하기에 Token 앞에 수식어?로 들어올 단어 set
}

Password_Validator

AUTH_PASSWORD_VALIDATORS = [
    {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', },
    # username, first_name, last_name, email 중에 70% 만큰 일치하면 오류 발생
    {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
     'OPTIONS': {'min_length': 9}
     },
    # 비밀번호 최소 길이 9
    {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
    # django내에 gzip으로 저장된 자주 쓰이는 비밀번호 20000개 중 하나면 오류 발생
    {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', },
    # only 숫자로만 된 비밀번호이면 오류 발생
]
# 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'
class UserAttributeSimilarityValidator:
    DEFAULT_USER_ATTRIBUTES = ("username", "first_name", "last_name", "email")

    def __init__(self, user_attributes=DEFAULT_USER_ATTRIBUTES, max_similarity=0.7):
        self.user_attributes = user_attributes
        if max_similarity < 0.1:
            raise ValueError("max_similarity must be at least 0.1")
        self.max_similarity = max_similarity

Password_Hasher

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.ScryptPasswordHasher',
]
  • list의 최상단에 있는 암호화 방식을 선택하여, set_password등 django 암호화 및 로그인에서 사용된다.
profile
이제부터 백엔드 개발자

0개의 댓글