JWT 기반 인증 및 사용자 관리: Django REST Framework(SimpleJWT)를 중심으로

김재섭·2025년 1월 27일
post-thumbnail

JWT(Json Web Token)는 웹 애플리케이션에서 인증과 권한 부여를 처리하는 데 널리 사용되는 방식입니다. 본 글에서는 JWT의 기본 개념과 Django REST Framework(DRF)에서 JWT를 사용하여 인증 시스템을 구현하는 방법을 알아보겠습니다.


JWT란 무엇인가?

JWT는 세 가지 주요 요소로 구성된 문자열입니다.
1. Header: 토큰의 유형(JWT)과 서명 알고리즘을 나타냅니다.
2. Payload: 사용자 정보와 토큰의 만료 시간 등 다양한 클레임(claim)을 포함합니다.
3. Signature: Header와 Payload를 특정 비밀키로 암호화하여 생성된 서명으로, 토큰의 무결성을 보장합니다.

JWT의 동작 방식
JWT는 클라이언트와 서버 간의 신뢰를 유지하며 상태를 저장하지 않는(stateless) 인증 방식으로 작동합니다. 다음은 JWT를 사용하는 인증 과정입니다.

  1. 사용자가 서버에 로그인 요청을 보냅니다.
  2. 서버는 사용자 자격 증명을 확인한 뒤, 해당 사용자 정보를 포함한 JWT를 생성합니다.
  3. 클라이언트는 생성된 JWT를 저장하고, 이후 서버로 요청을 보낼 때 JWT를 함께 전송합니다.
  4. 서버는 수신된 JWT를 검증하여 사용자 요청을 처리합니다.

이 방식은 서버가 세션 정보를 유지할 필요가 없다는 장점이 있습니다.


Django REST Framework에서 JWT 인증 구현

Django REST Framework에서는 rest_framework_simplejwt 라이브러리를 사용하여 쉽게 JWT 기반 인증을 설정할 수 있습니다. 아래는 JWT 인증 구현 단계입니다.

1. 라이브러리 설치

먼저 simplejwt 패키지를 설치합니다.

pip install djangorestframework-simplejwt

2. Django 설정 파일 수정

settings.py에서 DRF의 기본 인증 클래스로 JWTAuthentication을 설정합니다.

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

3. JWT 발급 및 갱신 엔드포인트 생성

JWT 발급 및 갱신을 처리하기 위해 SimpleJWT가 제공하는 뷰를 URL 패턴에 추가합니다.

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'),  # 리프레시 토큰으로 새로운 액세스 토큰 발급
]
  • TokenObtainPairView: 사용자의 자격 증명을 검증하고 액세스 및 리프레시 토큰을 반환합니다.
  • TokenRefreshView: 기존 리프레시 토큰으로 새로운 액세스 토큰을 생성합니다.

4. 보호된 API 엔드포인트 생성

JWT 인증을 적용하려면, DRF의 IsAuthenticated 권한 클래스를 사용합니다. 예를 들어, 아래 코드는 인증된 사용자만 접근할 수 있는 엔드포인트를 정의합니다.

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

class ProtectedView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({"message": "인증된 사용자만 접근 가능합니다."})

이렇게 설정하면 인증되지 않은 사용자는 접근이 제한되며, 요청 시 401 Unauthorized 응답을 받게 됩니다.


JWT 사용 시 주의사항 및 추가 팁

  1. 보안 설정 강화

    • JWT를 저장할 때 HttpOnly 쿠키를 사용하면 클라이언트 측 스크립트에서 쿠키에 접근하지 못하게 할 수 있습니다.
    • HTTPS를 사용하여 데이터 전송 시 암호화를 보장해야 합니다.
  2. 토큰 만료 관리

    • JWT의 Payload에 포함된 exp(만료 시간) 클레임을 사용해 토큰 만료를 설정합니다.
    • 리프레시 토큰을 사용하여 만료된 액세스 토큰을 갱신하도록 구현합니다.
  3. JWT 검증 로직의 중요성

    • 서버는 항상 수신된 JWT의 서명을 검증해야 합니다. 서명이 일치하지 않는 경우 요청을 거부합니다.
    • SimpleJWT 라이브러리는 자동으로 이 과정을 처리하므로 별도의 검증 코드를 작성할 필요가 없습니다.
  4. Stateless한 인증의 특성

    • 서버는 클라이언트의 상태를 유지하지 않으므로 확장성이 뛰어나지만, 토큰 탈취 시 즉각적인 무효화가 어렵습니다. 따라서 토큰 만료 시간을 짧게 설정하고, 필요시 로그아웃 시 리프레시 토큰을 강제로 폐기하도록 구현해야 합니다.

결론

JWT는 인증 및 권한 부여를 간단하고 효율적으로 처리할 수 있는 도구입니다. Django REST Framework와 SimpleJWT 라이브러리를 사용하면 손쉽게 JWT 인증을 구현할 수 있으며, 이를 통해 확장성과 보안성을 모두 갖춘 애플리케이션을 개발할 수 있습니다.

profile
Upward Developer

0개의 댓글