[Django]Simple-Jwt 로그인

Hyeo_Ni__·2024년 2월 13일
0

Django

목록 보기
11/12
post-thumbnail

📝 Simple-Jwt

Simple JWT는 Django REST Framework에 대한 JSON 웹 토큰 인증 백엔드를 제공한다.

사용하는 라이브러리는 아래와 같다.

✍ 코드

pip install djangorestframework-simplejwt



📚 simple_jwt 세팅

✍ 코드

# settings.py

from datetime import timedelta

INSTALLED_APPS = [# simple-jwt 추가해주기 
    'rest_framework_simplejwt',
]

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': True,
}

simple_jwt기본 설정을 해준다.
Access ToKen과 Refresh Token의 생명주기를 60분으로 설정한다.
Rotate Token 회전시킬지 여부를 지정하는데, 보안상 권장하는 편이다.




📚 로그인

✍ 코드

# views.py

from django.contrib.auth.hashers import check_password
from rest_framework_simplejwt.tokens import RefreshToken

@api_view(['POST'])
def user_login(request):
    if request.method == 'POST':
        username = request.data.get('username')
        password = request.data.get('password')
        
        user = AuthUser.objects.filter(username=username).first()
        if user and check_password(password, user.password):
            # 인증 성공시 바로 로그인
            login(request, user)
            refresh = RefreshToken.for_user(user)
            access_token = str(refresh.access_token)
            refresh_token = str(refresh)

            # Users에서 nickname 가져오기
            try:
                user_info = UserProfile.objects.get(username=user.username)
                nickname = user_info.nickname
            except UserProfile.DoesNotExist:
                nickname = None

            return Response(
                {
                    'status': 'success',
                    'username': user.username,
                    'nickname': nickname,
                    'access_token': access_token,
                    'refresh_token': refresh_token,
                    'message': '로그인이 완료되었습니다.'
                },
                status=status.HTTP_200_OK
            )
        else:
            # 인증 실패
            logger = logging.getLogger(__name__)
            logger.error(f'Failed login attempt for username: {username}')
            return Response(
                {
                    'status': 'fail',
                    'message': '로그인에 실패했습니다.'
                },
                status=status.HTTP_401_UNAUTHORIZED
            )

check_password는 두 password를 비교하여 boolean값을 리턴한다.
이후 패스워드 및 username이 일치할 경우 자동으로 로그인이 되며, access토큰과 refresh토큰을 발급해준다.

  • Access Token
    : 로그인시 발급되며, 사용자 인증 정보를 담고 있음
  • Refresh Token
    : Access토큰을 재발급 받는 용도로 유효기간이 더 길다.
profile
개발자로 성장 중 입니다.

0개의 댓글