# 오늘 배운 것 (TIL): Django DRF 로그아웃 기능 구현

1. 개요

오늘은 Django REST Framework(DRF)에서 로그아웃 기능을 구현하는 방법을 학습했다. Django의 기본 logout() 함수를 사용할 수도 있지만, DRF에서는 JWT(JSON Web Token) 또는 Session 기반 로그아웃을 활용할 수 있다.

2. 로그아웃 구현 방법

1) JWT 기반 로그아웃 구현

JWT 로그아웃은 클라이언트에서 저장된 토큰을 삭제하는 방식으로 동작한다. 서버에서는 해당 토큰을 무효화할 수 없기 때문에, 보안성을 높이려면 블랙리스트 설정이 필요하다.

(1) views.py에서 로그아웃 뷰 작성

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework_simplejwt.tokens import RefreshToken

class LogoutView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        try:
            refresh_token = request.data["refresh"]
            token = RefreshToken(refresh_token)
            token.blacklist()  # 해당 토큰을 블랙리스트 처리
            return Response({"message": "로그아웃 성공"}, status=status.HTTP_205_RESET_CONTENT)
        except Exception as e:
            return Response({"error": "잘못된 요청입니다."}, status=status.HTTP_400_BAD_REQUEST)

(2) urls.py에 로그아웃 엔드포인트 추가

from django.urls import path
from .views import LogoutView

urlpatterns = [
    path('api/logout/', LogoutView.as_view(), name='logout'),
]

(3) 클라이언트에서 로그아웃 요청 예시

POST /api/logout/
Content-Type: application/json
Authorization: Bearer <access_token>

{
    "refresh": "<refresh_token>"
}

2) Session 기반 로그아웃 구현

Session 로그아웃은 Django의 logout() 함수를 이용해 서버에서 세션을 삭제하는 방식으로 동작한다.

(1) views.py에서 로그아웃 API 작성

from django.contrib.auth import logout
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class SessionLogoutView(APIView):
    def post(self, request):
        logout(request)  # 세션 로그아웃 실행
        return Response({"message": "세션 로그아웃 성공"}, status=status.HTTP_200_OK)

(2) urls.py에 로그아웃 엔드포인트 추가

urlpatterns += [
    path('api/session-logout/', SessionLogoutView.as_view(), name='session-logout'),
]

(3) 클라이언트에서 로그아웃 요청 예시

POST /api/session-logout/
Content-Type: application/json

3. 정리

  • JWT 로그아웃: Refresh Token을 블랙리스트에 등록하여 무효화하는 방식.
  • Session 로그아웃: Django의 logout() 함수를 사용하여 세션을 삭제하는 방식.
  • DRF를 사용할 경우, 보안성을 위해 JWT 블랙리스트 기능을 활성화하는 것이 중요하다.

+ Recent posts