📘 DRF - 로그인, 로그아웃
- 로그인
- 로그아웃

API 명세서를 기준으로 로그인, 로그아웃을 구현해 봅시다!
구현 과정은 얼마든지 바뀔 수 있어요!
# 저의 DRF 구현 순서
urls.py -> serializers.py -> views.py
오늘 쓴 핵심 code
⚙️ 로그인
🌵 0. main/settings.py
더보기


추가했어요 ↓
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated', # 인증된 사용자만 접근 가능
],
from datetime import timedelta
# JWT 토큰 관련 설정
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), # access token 유효 기간
'REFRESH_TOKEN_LIFETIME': timedelta(days=1), # refresh token 유효 기간
}
🌵 1. accounts/urls.py
더보기


path('login/', views.LogInView.as_view(), name="login"), # 로그인
🌵 2. accounts/serializers.py
더보기


# 로그인 serializer
class UserLogInSerializer(serializers.Serializer):
username = serializers.CharField(required=True)
password = serializers.CharField(required=True, write_only=True)
def validate(self, data):
user = authenticate(username=data['username'], password=data['password']) # authenticate()로 사용자 인증 수행
if user is None: # 만약 user가 None이라면
raise serializers.ValidationError("아이디 또는 비밀번호가 일치하지 않습니다.") # Error 메시지 보여주기
data['user'] = user # user 정보를 validated_data에 저장
return data
🌵 3. accounts/views.py
더보기


# 로그인 view
class LogInView(generics.GenericAPIView):
serializer_class = UserLogInSerializer
# ⬇️ main/settings.py에 REST_FRAMEWORK 부문에 정의해둠
permission_classes = [permissions.AllowAny] # AllowAny : 인증되지 않은 사용자도 접근 가능
def post(self, request):
# get_serializer : generics에 있어서 굳이 import 안 해도 사용 가능
seriarlizer = self.serializer_class(data=request.data) # serializer_class 직접 사용
seriarlizer.is_valid(raise_exception=True) # raise_exception=True : 유효성 검사 실패 시, 예외 발생
user = seriarlizer.validated_data['user']
refresh = RefreshToken.for_user(user) # JWT 토큰 생성
return Response({
'refresh': str(refresh),
'access': str(refresh.access_token),
}, status=status.HTTP_200_OK)
🔝


끝나지 않았어요 🙄

입력창이 사라지는 오류가 발생했어요

그래서 접근 가능하도록
permission_classes = [permissions.AllowAny] # 모든 사용자가 접근 가능하도록 설정
코드를 추가하여서 문제를 해결했어요

⚙️ 로그아웃
🌵 1. accounts/urls.py
더보기


path('logout/', views.LogOutView.as_view(), name="logout"), # 로그아웃
🌵 2. accounts/views.py
더보기


# 로그아웃 view
class LogOutView(generics.GenericAPIView):
permission_classes = [permissions.IsAuthenticated] # 로그인된 사람만 접근 가능
def post(self, request):
try:
Refresh_token = request.data['refresh_token']
token = RefreshToken(Refresh_token)
token.blacklist() # 토큰을 블랙 리스트에 추가하여 해당 토큰이 더 이상 유효하지 않도록 함
return Response({"message" : "로그아웃되었습니다."}, status=status.HTTP_205_RESET_CONTENT)
except Exception as e:
return Response({"error" : str(e)}, status=status.HTTP_400_BAD_REQUEST)
🔝



로그아웃 구현을 해야 하는데 안 나오더라고요 🤔
프런트앤드가 없으면 토큰을 사용하는 로그아웃은 작동이 잘 되는지 알 수가 없어요
그래서 postman으로 해보았습니다.

먼저 로그인을 진행하여 refresh와 access token을 받아주세요

그 뒤, logout에서 Headers에 Key로 Authorization을 추가하고 value에 Bearer access token을 입력한 후,

Body에 refresh token을 기입하고 Send를 눌러주시면?
"message" : "로그아웃되었습니다."
가 반환되는 걸 확인할 수 있었어요!


'👥 중간 팀 프로젝트(250212~0225) > 구현 과정' 카테고리의 다른 글
[👤LLM] Parser, Runnable Component 써보기 (0) | 2025.02.19 |
---|---|
[👤LLM] LangChain, PromptTemplate 써보기 (0) | 2025.02.18 |
[👤기능구현] 회원 가입 구현하기 (0) | 2025.02.15 |
[👤Github] Github repository 생성 및 Pull requests (0) | 2025.02.15 |
[👤FlowChart] 플로우차트 2차 (0) | 2025.02.13 |