One_Blog

Django Simple JWT를 통한 Refresh / Access Token 발급 본문

웹 개발

Django Simple JWT를 통한 Refresh / Access Token 발급

0xOne 2023. 5. 3. 22:16
728x90

settings.py에 다음과 같은 설정을 추가합니다.

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Marshmallow',
    'rest_framework_simplejwt',
    'rest_framework',

]

참고로 Installed_Apps에서는 rest_framework_simplejwt와 rest_framework만 추가하면 됩니다.

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],

}

 

아래 코드는 로그인 성공 시 Refresh / Access Token을 발급하는 코드입니다.

def user_login(request):
    if request.method == 'POST':
        id = request.POST.get('id')
        password = request.POST.get('password')
        try:
            user = Marshmallow_User.objects.get(id=id)
        except Marshmallow_User.DoesNotExist:
            return JsonResponse({'success': 'fail to get user info'})

        if password == user.password:
            login(request,user)
            token = RefreshToken.for_user(user)
            refresh_token = str(token)
            access_token = str(token.access_token)
            response = JsonResponse({
                "user": user.id,
                "message": "login success",
                "access_token": access_token,
                "refresh_token": refresh_token,
            })
            response.set_cookie('access_token', access_token)
            response.set_cookie('refresh_token', refresh_token)
            return response
        else:
            return JsonResponse({'success': 'fail to login'})
    else:
        return JsonResponse({'error': 'Invalid request method'})

아래 코드는 RefreshToken을 기반으로 AccessToken을 발급해주는 코드입니다.

def getAccessToken(request):
    refresh_token = request.COOKIES.get('refresh_token')
    if refresh_token:
        token = RefreshToken(refresh_token)
        access_token = str(token.access_token)
        response = JsonResponse({'access_token': access_token})
        response.set_cookie('access_token', access_token, httponly=True)
        return response
    else:
        return JsonResponse({'error':'error'})

해야할 게 많아서 가볍게 올려봤습니다.

RefreshToken기반 AccessToken발급 코드 짤 때 좀 헷갈렸어서 저 같이 헷갈리는 분 없으라고 가볍게 올려봅니다.

코드 짜면서 느낀 점 : 보안 전공 한 게 다행이다.