Django-Rest-Framework(DRF)로 JWT 기반 Authentication 세팅하기(with simplejwt) — dj_rest_auth로 회원가입부터 로그인까지(2)

Chanjong Park
Chan’s Programming Diary
6 min readApr 12, 2021

저번 포스트에서 DRF로 JWT 인증을 위한 기본적인 세팅을 완료했다. 이제 직접 회원가입과 로그인을 진행해보자.

이번 포스트의 핵심 패키지는 dj-rest-auth다. 이 패키지는 크게 회원가입, 로그인, 소셜 로그인 기능을 제공해준다. 부가적으로 비밀번호 찾기, 리셋, 회원가입 시 이메일 인증 등 유저 관련 기능들을 거의 커버가 가능하기 때문에 장고로 개발 시에 알아두면 좋은 패키지다.

회원가입, 로그인

documentation을 들어가면 API Endpoints 메뉴에서 Registration을 볼 수 있다.

username은 비활성화 시켰으므로 빈칸 또는 지워도 된다.

회원가입을 완료하면 access token과 refresh token, 그리고 user의 pk, email을 반환해준다.(first name, last name도 반환하지만 사용하지 않으므로 공백으로 반환된다)

발급됨과 동시에 refresh token은 데이터베이스에 저장된다.

token_blacklist_outstandingtoken 테이블에서 확인 가능하다.

Edit

settings.py에 rest_framework_simplejwt.token_blacklist를 추가해 주었는데, 다음 포스트에서 설명할 Blacklist기능에서 Refresh Token을 서버에서 관리하기 위해 추가된 테이블입니다. 추가를 안하고 진행해도 문제는 없으나, 따로 DB에 저장되지는 않습니다.

access token은 클라이언트 단에서 쿠키 등으로 저장되며, API 접근 시에 헤더에 같이 넣어서 유저 식별을 할 수 있다. 후에 로그인 시에도 회원가입 할 때와 마찬가지로 access token, refresh token과 유저 정보를 반환한다.

회원가입과 똑같은 json이 반환된다.

API 접근

로그인과 회원가입을 진행해봤으니, access token이 잘 작동하는지 확인하기 위해 간단한 API를 만들어 실험해보자.

유저 정보를 볼 수 있는 API를 rest_framework에 내장되었는 Router 기능을 사용해 간단하게 만들었다.

views.py

from rest_framework import viewsets
from rest_framework import serializers
from accounts.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer

urls.py

from rest_framework import routers
from accounts.views import UserViewSet
router = routers.DefaultRouter()
router.register('user', UserViewSet)
urlpatterns = [
path('', include(router.urls)),
]

urls.py는 settings.py와 같은 루트에 있는 베이스 url 파일에 추가해줬다.

이제 포스트맨에 POST 요청을 해보자.

우리는 앞에 settings.py에서 DEFAULT_PERMISSION_CLASSES에 IsAuthenticated 메소드를 추가해줘서 기본으로 인증된 유저만이 API에 접근할 수 있도록 해놓았다. 그래서 header에 Authorization 이라는 key 값으로 인증을 진행해야 한다.

Authorization : Bearer access_tokenkey : value 의 형식이다. Bearer 과 access_token 사이에 공백 한칸이 있다.

유효한 access_token을 입력하면 API에 접근할 수 있는 권한을 가져 아까 만들었던 유저 객체들을 json으로 반환하는 것을 볼 수 있다.

만약 default로 isAuthenticated 메소드를 사용하고 싶지 않다면, viewset에 있는 permission_classes 변수를 오버라이드 해서 각 API 별로 접근 권한을 설정할 수 있다.

Access Token 재발급하기

access token이 만료되면 인증이 안되기 때문에 유효 시간에 맞춰서 refresh token을 통해 재발급을 받아야 하는데, 이는 클라이언트 단과 협의 하에 시간조절을 해야한다.

우리는 url을 accounts로 매핑했기 때문에, /accounts/token/refresh/ 로 들어가보자.

key값이 refresh 이므로 postman에서 하는 사람은 참고하자.

refresh token을 입력하게 되면 앞서 settings에 설정했던 시간의 유효기간을 가지고 있는 access token이 반환된다.

return되는 json의 key값이 access인데, 협업(통일성)을 위해서 access_token으로 커스터마이징 해주는 것을 추천한다. rest_framework_simplejwt.views.TokenRefreshView을 참고하자.

마지막으로 refresh token은 access token을 재발급하기 위해 존재하기 때문에, refresh token으로 api에 접근할 수 없다.

다음 포스트에서는 무분별한 refresh token 발급을 방지하고, 관리할 수 있는 blacklist 대해 작성하겠다.

--

--