웹 개발
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발급 코드 짤 때 좀 헷갈렸어서 저 같이 헷갈리는 분 없으라고 가볍게 올려봅니다.
코드 짜면서 느낀 점 : 보안 전공 한 게 다행이다.