본문 바로가기

개발/JWT

[JWT] Django Rest Framework에서 JWT 사용하기(2)

실제로 DRF에서 JWT를 이용하여 코드를 작성해 보기로 했다.

 

코드 예시로는 '미니 채용 관리 시스템'인 타임어택 테스트 코드를 이용하여 연습을 해보기로 하였다.

 

미니 채용 관리 시스템

 

1. 프로젝트에 jwt 인증을 사용해서 access token을 발급하도록 simple jwt 설정
 - ACCESS_TOKEN_LIFETIME은 50분, REFRESH_TOKEN_LIFETIME은 1일로 설정

 

우선 JWT를 사용하기 위해 해당 모듈을 import 해주는 것으로 시작해야 한다.

 

$ pip install djangorestframework-simplejwt

 

JWT 토큰 인증 방식을 사용하기 위해 Django 프로젝트에 있는 setiings.py 안에 다음 코드들을 추가해주어야 한다.

 

# settings.py

INSTALLED_APPS = [
    ...
    'rest_framework_simplejwt',
]

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

 

access_token의 만료 시간을 50분으로 정하고, refresh_token의 만료 시간을 1일로 설정해주어야 하기 때문에 settings.py 안에 SIMPLE_JWT 설정을 해주기로 하였다.

 

# settings.py

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=50),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}

 

2. 지원자가 언제, 어떤 채용공고에 지원했는지 저장할 수 있도록 모델을 추가해보세요.

 

지원자가 언제, 어떤 채용공고에 지원했는지의 정보를 담는 모델을 만들어주면 된다.

 

지원자는 'user', 언제 지원했는지는 지원할 때의 기준으로 현재 시간을 담는 'created_at', 채용공고는 'jobpost'로 지정해주었다.

 

# post/models.py

class Apply(models.Model):
    user = models.ForeignKey(User, verbose_name="지원자", on_delete=models.CASCADE)
    jobpost = models.ForeignKey(JobPost, verbose_name="채용공고", on_delete=models.CASCADE)
    created_at = models.DateTimeField("지원날짜", auto_now_add=True)

    class Meta:
        db_table = 'applies'

 

유저와 채용공고는 다른 모델 테이블과 ForeignKey 관계로 설정해주었고, 지원 날짜는 현재 시간을 담을 수 있도록 DateTimeField를 사용하여 auto_now_add=True로 현재 시간을 저장하도록 설정해주었다.

 

3. 2번에서 만든 모델의 객체를 직렬화 하기 위한 Serializer 구현

 

만들어준 Apply 모델을 가지고 Serializer를 만들어주면 된다.

 

# post/serializers.py

from .models import Apply

class ApplySerializer(serializers.ModelSerializer):
    class Meta:
        model = Apply
        fields = '__all__'

 

4. 채용공고에 지원하는 API 구현 (이력서는 이미 있어서 지원하면 저장돼있는 이력서로 자동으로 지원된다고 가정)
 - 지원하는 유저 정보는 별도로 받지 않고 발급받은 access token으로 인증할 것

 

우선 채용공고에 지원하는 API를 구현하기 위해 views.py에서 코드를 만들어주도록 하였다.

 

# post/views.py

from rest_framework_simplejwt.authentication import JWTAuthentication
from .models import Apply
from .serializers import ApplySerializer

class ApplyView(APIView):
    authentication_classes = [JWTAuthentication]

    def post(self, request):
        request.data["user"] = request.user.id

        apply_serializer = ApplySerializer(data=request.data)

        if apply_serializer.is_valid():
            apply_serializer.save()
            return Response(apply_serializer.data, status=status.HTTP_200_OK)

        return Response(apply_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

토큰 인증 방식을 JWT로 사용할 것이기 때문에 'authentication_classes = [JWTAuthentication]'으로 인증 방식을 지정해주었다.

 

해당 채용 공고가 저장될 때 access_token으로 받은 유저 정보의 id를 request.data["user"]에 넣어주었고, 해당 request 데이터들을 ApplySerializer에 넣어주어 직렬화를 해주었다.

 

해당 serializer가 검증이 된다면 저장을 해준 뒤 해당 데이터를 확인할 수 있도록 해주었고, 에러가 발생한다면 어느 부분에서 에러가 발생했는지 확인을 해주었다.

 

이제 Postman을 통해서 확인을 해보도록 하자.

 

JWT 토큰 생성

 

우선 로그인한 유저 정보를 담고 있는 JWT 토큰을 받아주었다.

발급받은 access_token을 사용하여 채용공고에 지원을 해보도록 했다.

 

해당 access_token을 넣어주는 방법으로는 다음 2가지 중 선택하여 사용해주면 된다.

 

Authorization : Bearer Token으로 넣어주기
Headers : Key=Authorization, value=Bearer access_token으로 넣어주기

 

access_token을 넣어준 뒤 채용공고 등록을 해보았다.

 

채용공고 등록

 

해당 유저의 정보(access_token)와 채용공고의 id값을 넣어주고 등록을 하니 정상적으로 동작을 하는 것을 볼 수 있었다.

이제 DB에도 저장되어 있는지 확인을 해주었다.

 

DB에 들어간 채용공고

 

DB에도 정상적으로 들어간 것을 볼 수 있었다.

'개발 > JWT' 카테고리의 다른 글

[JWT] Django Rest Framework에서 JWT 사용하기(1)  (0) 2022.08.05