Software Engineering

파이썬/Django 사용자 생성, JWT 토큰 발급/검증 예시

iseop 2025. 2. 11. 21:32

목표: Django의 기본 User 모델을 활용해서 Django 사용자를 생성하는 REST API 만들기

 

1. venv 활성화

source bin/activate

 

2. 필요 패키지 설치, 설정

pip install djangorestframework djangorestframework-simplejwt

파일: 프로젝트명/settings.py

...

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_simplejwt',
]

...

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

from datetime import timedelta
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
}

 

3. 프로젝트 URL 설정

파일: 프로젝트명/urls.py

urlpatterns = [
    ...
    path('um/', include('user_manager.urls')),
]

 

4. 앱 생성

python manage.py startapp user_manager

 

5. 앱 URL 설정

파일: 앱/urls.py

from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
    TokenVerifyView
)
from .views import UserAddView

urlpatterns = [
    path('useradd/', UserAddView.as_view(), name='useradd'),
    path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),
]

 

6. DRF 시리얼라이저 작성

from django.contrib.auth.models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)
    # write_only=True로 설정하면 해당 필드가 요청에서만 허용되고, 응답에서는 제외됨.
    # 패스워드 필드가 JSON 응답에 포함되지 않도록 사전에 방지하기 위함.

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'password']

    def useradd(self, validated_data):
        user = User.objects.create_user(
            username = validated_data['username'],
            email = validated_data['email'],
            password = validated_data['password']
        )
        return user

 

7. 뷰 작성

from django.contrib.auth.models import User
from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.permissions import AllowAny
from .serializers import UserSerializer

class UserAddView(generics.CreateAPIView):
# generics.CreateAPIView는 POST 요청으로부터 객체를 생성하는 DRF 제네릭 뷰임.
# 제네릭 뷰는 CRUD 구현을 쉽게 하기 위한 클래스 기반 뷰(CBV)임.
# generics.CreateAPIView 대신 APIView로 직접 구현 시 post() 또한 직접 구현해야 함.

    serializer_class = UserSerializer
    # CreateAPIView의 필수 필드임. 시리얼라이저를 지정해야 함.
    permission_classes = [AllowAny]
    # 선택적 필드임. 기본값은 [IsAuthenticated]

    def useradd(self):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        # DB에 객체를 저장하고, 응답 JSON을 반환함.

 

8. 테스트