Simple JWT는 Django REST Framework에 대한 JSON 웹 토큰 인증 백엔드를 제공한다.
사용하는 라이브러리는 아래와 같다.
pip install djangorestframework-simplejwt
# 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토큰을 재발급 받는 용도로 유효기간이 더 길다.