백엔드

Django REST Framework 기초와 JWT 인증 이해하기

지식소 채움이 2025. 8. 20. 08:44

최근 웹 개발 환경에서 RESTful API는 더 이상 선택이 아닌 필수가 되었습니다. 웹 프론트엔드와 백엔드가 분리되고, 모바일 앱, IoT 기기, 외부 서비스와의 연동이 늘어나면서 API 중심의 설계가 표준으로 자리 잡고 있습니다. Django는 강력한 웹 프레임워크지만, API 개발을 위해서는 추가적인 도구가 필요합니다. 바로 Django REST Framework(DRF) 입니다. 여기에 사용자 인증까지 안전하게 구현하려면 **JWT(Json Web Token)**를 함께 활용하는 것이 일반적입니다. 이번 글에서는 DRF의 기초 개념과 함께 JWT 인증 방식을 이해해 보겠습니다.

 

1. Django REST Framework(DRF)란?

Django REST Framework는 Django 위에서 동작하는 API 개발을 위한 라이브러리입니다. 장고의 기본 뷰와 ORM을 활용하면서도 직관적이고 간결하게 API를 구축할 수 있도록 도와줍니다. 주요 특징은 다음과 같습니다.

  • Serializer: Django의 모델을 JSON 형태로 직렬화(Serialize)하거나, 반대로 JSON 데이터를 객체로 역직렬화(Deserialize)해줍니다.
  • ViewSet & Generic View: CRUD 기능을 손쉽게 구현할 수 있는 추상화된 뷰 클래스 제공.
  • Browsable API: 웹 브라우저에서 API를 테스트할 수 있는 직관적인 UI 제공.
  • 권한 관리와 인증: 권한(permissions), 인증(authentication), 스로틀링(throttling) 같은 기능을 기본 제공.

즉, DRF를 사용하면 장고의 강력한 기능을 유지하면서 RESTful API 서버를 빠르게 만들 수 있습니다.

 

2. DRF의 기본 흐름

DRF로 API를 만든다고 했을 때, 가장 기본적인 구조는 아래와 같습니다.

  1. 모델(Model): 데이터베이스와 매핑되는 구조 정의
  2. 시리얼라이저(Serializer): 모델 데이터를 JSON으로 변환
  3. 뷰(View / ViewSet): 클라이언트 요청을 받아 로직 처리 후 응답 반환
  4. URL 라우팅(Router): API 엔드포인트 설정

예시를 간단히 보겠습니다.

# models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
# serializers.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'
# views.py
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
# urls.py
from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet)

urlpatterns = router.urls

이렇게만 작성하면 /posts/ 엔드포인트에서 게시글의 CRUD API를 바로 사용할 수 있습니다. 이것이 DRF의 강력한 추상화 능력입니다.

 

3. 인증(Authentication)의 필요성

API는 결국 외부와 데이터를 주고받는 창구이므로 보안이 핵심입니다. 인증(Authentication)과 권한(Authorization)을 구현하지 않으면 누구든 API를 호출해 민감한 정보를 가져갈 수 있습니다.

Django는 기본적으로 세션 기반 인증을 제공합니다. 하지만 API 환경에서는 모바일 앱이나 외부 클라이언트가 세션/쿠키를 관리하기 어렵기 때문에 토큰 기반 인증이 더 적합합니다.

 

4. JWT(Json Web Token)란?

**JWT(Json Web Token)**는 인증을 위해 널리 쓰이는 방식입니다. JWT는 세 부분으로 구성됩니다.

  • Header: 어떤 알고리즘으로 서명했는지 등 메타데이터 포함
  • Payload: 사용자 정보(예: id, email)와 토큰 만료 시간(exp) 등
  • Signature: Header와 Payload를 비밀키로 암호화한 서명

JWT는 header.payload.signature 형태의 문자열이며, Base64로 인코딩되어 전달됩니다.
클라이언트는 로그인 성공 시 JWT를 발급받아 이후 요청마다 Authorization: Bearer <토큰> 형태로 서버에 전달합니다. 서버는 이 토큰이 유효한지만 검사하면 되므로, 별도의 세션 저장소가 필요 없습니다. 무상태(stateless) 인증이 가능해지는 것이 큰 장점입니다.

 

5. Django + DRF에서 JWT 인증 구현하기

DRF에서 JWT 인증을 쓰려면 보통 djangorestframework-simplejwt 패키지를 활용합니다.

pip install djangorestframework-simplejwt

(1) 설정 추가

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

(2) URL 설정

# urls.py
from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),  # 로그인
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), # 갱신
]
  • /api/token/: 사용자 로그인 시 Access/Refresh 토큰 발급
  • /api/token/refresh/: Refresh 토큰으로 새로운 Access 토큰 발급

(3) 인증 사용하기

뷰에 권한을 설정하면 로그인된 사용자만 접근할 수 있습니다.

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from rest_framework.response import Response

class SecureView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({"msg": f"Hello, {request.user.username}!"})

이제 클라이언트는 로그인 후 발급받은 토큰을 Authorization 헤더에 담아야만 이 API를 호출할 수 있습니다.

 

6. JWT 인증의 장단점

장점

  • 서버가 상태를 저장하지 않아 확장성(Scalability) 좋음
  • 모바일, 웹, 외부 서비스 등 다양한 환경에서 사용 가능
  • 표준화된 포맷(JSON)이라 언어와 플랫폼에 구애받지 않음

단점

  • 토큰이 유출되면 만료될 때까지 악용될 수 있음
  • 토큰을 강제로 만료시키기 어려움(별도 블랙리스트 관리 필요)
  • Payload가 노출될 수 있으므로 민감한 정보는 담지 말아야 함

따라서 보안 강화를 위해 HTTPS 사용, 토큰 만료 시간 단축, Refresh 토큰 활용이 필수입니다.

 

7. 마무리

Django REST Framework는 API 개발을 손쉽게 해주는 강력한 도구이며, JWT 인증은 이러한 API를 안전하게 보호하는 표준 방식입니다. DRF의 모델-시리얼라이저-뷰-라우팅 구조를 이해하고, SimpleJWT 같은 패키지를 통해 인증을 구현하면 실무 프로젝트에서도 확장 가능하고 안전한 API 서버를 구축할 수 있습니다.

API는 점점 더 많은 클라이언트와 연결되는 핵심 요소가 되어가고 있습니다. DRF와 JWT를 익히는 것은 Django 개발자라면 반드시 갖춰야 할 기본 역량이라 할 수 있습니다.