Django REST framework simple JWT?? 🧩 JWT(JSON Web Token) → 웹 표준으로, 당사자 간에 안전하게 정보를 JSON 객체로 전송하는 방법 → 인증과 권한 부여에 널리 사용됨 → 서버는 JWT를 생성하여 클라이언트에게 전달하고, 클라이언트는 이후 요청 시, JWT를 포함하여 서버에 사용자 인증을 수행
🧩 djangorestframework-simplejwt → DRF 환경에서 JWT를 사용하여 인증 시스템을 구축하는 과정을 간소화해 주는 패키지
필요한 pip를 모두 설치해 주었으면,
# pip 목록 저장하기
$ pip freeze > requirements.txt
이렇게 남겨주어야 나중에 다른 분들이
# requirements.txt 목록 설치하기
$ pip install -r requirements.txt
from django.db import models
from django.contrib.auth.models import AbstractUser
# 기본 user 모델classUser(AbstractUser):# 원하는 필드 추가하기
nickname = models.CharField(max_length=30, blank=True)
# 객체의 문자열 표현 정리 : User를 view에서 쓸 때 username이 return 됨, username말고 다른 거 해도 됨def__str__(self):return self.username
classMeta:
verbose_name = "사용자"# 관리자 페이지에서 보여지는 단수 이름
verbose_name_plural = "사용자 목록"# 관리자 페이지에서 보여지는 복수 이름
기본적으로 Django에서는 AbstractUser를 제공해 줘서 쉽게 회원 가입을 구현할 수 있어요
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/v1/account/', include('accounts.urls')), # accounts의 url 불러 쓰기
]
accounts/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('signup/', views.SignUpView.as_view(), name="signup"), # 회원 가입
]
from rest_framework import serializers
from django.contrib.auth import get_user_model
# settings.py에 선언했던 AUTH_USER_MODEL 데려옴# accounts/models.py.User
User = get_user_model()
# 회원 가입 serializerclassUserSignUpSerializer(serializers.ModelSerializer):# 비밀번호 재확인# write_only=True : 필수 요소
password2 = serializers.CharField(write_only=True)
classMeta:
model = User
fields = ('username','nickname', 'password', 'password2')
extra_kwargs = {'password': {'write_only': True}}
defvalidate(self, attrs):# 첫 번째로 입력한 비번이랑 두 번째 입력한 비번이 다르면if attrs['password'] != attrs['password2']:
# 비밀번호가 일치하지 않다는 메시지가 뜨게끔 만들기raise serializers.ValidationError("비밀번호가 일치하지 않습니다.")
return attrs
defcreate(self, validated_data):# validated_data에서 'password2' 키를 제거# 'password2'는 비밀번호 확인을 위해 사용되는 필드이기 때문에 저장 안 해도 됨
validated_data.pop('password2')
# validated_data에서 'password' 키를 제거하고, 그 값을 password 변수에 저장# 'password'는 사용자가 입력한 비밀번호이며, 이 값을 사용하여 사용자 객체의 비밀번호를 해싱(암호화)해야 합니다.
password = validated_data.pop('password')
# validated_data에 남아있는 데이터를 사용하여 User 객체를 생성# User 객체는 비밀번호를 제외한 사용자 정보(예: username, email)를 포함
user = User(**validated_data)
# 사용자 객체의 비밀번호를 설정합니다.# set_password() 메서드는 비밀번호를 해싱하고, 해싱된 비밀번호를 사용자 객체에 저장
user.set_password(password)
user.save()
return user
from rest_framework import generics
from .serializers import UserSignUpSerializer
from django.contrib.auth import get_user_model
User = get_user_model()
# 회원 가입 viewclassSignUpView(generics.CreateAPIView):
queryset = User.objects.all()
serializer_class = UserSignUpSerializer