JWT(Json Web Token)는 웹 애플리케이션에서 인증과 권한 부여를 처리하는 데 널리 사용되는 방식입니다. 본 글에서는 JWT의 기본 개념과 Django REST Framework(DRF)에서 JWT를 사용하여 인증 시스템을 구현하는 방법을 알아보겠습니다.
JWT는 세 가지 주요 요소로 구성된 문자열입니다.
1. Header: 토큰의 유형(JWT)과 서명 알고리즘을 나타냅니다.
2. Payload: 사용자 정보와 토큰의 만료 시간 등 다양한 클레임(claim)을 포함합니다.
3. Signature: Header와 Payload를 특정 비밀키로 암호화하여 생성된 서명으로, 토큰의 무결성을 보장합니다.
JWT의 동작 방식
JWT는 클라이언트와 서버 간의 신뢰를 유지하며 상태를 저장하지 않는(stateless) 인증 방식으로 작동합니다. 다음은 JWT를 사용하는 인증 과정입니다.
이 방식은 서버가 세션 정보를 유지할 필요가 없다는 장점이 있습니다.
Django REST Framework에서는 rest_framework_simplejwt 라이브러리를 사용하여 쉽게 JWT 기반 인증을 설정할 수 있습니다. 아래는 JWT 인증 구현 단계입니다.
먼저 simplejwt 패키지를 설치합니다.
pip install djangorestframework-simplejwt
settings.py에서 DRF의 기본 인증 클래스로 JWTAuthentication을 설정합니다.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
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'), # 리프레시 토큰으로 새로운 액세스 토큰 발급
]
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 응답을 받게 됩니다.
보안 설정 강화
토큰 만료 관리
exp(만료 시간) 클레임을 사용해 토큰 만료를 설정합니다.JWT 검증 로직의 중요성
Stateless한 인증의 특성
JWT는 인증 및 권한 부여를 간단하고 효율적으로 처리할 수 있는 도구입니다. Django REST Framework와 SimpleJWT 라이브러리를 사용하면 손쉽게 JWT 인증을 구현할 수 있으며, 이를 통해 확장성과 보안성을 모두 갖춘 애플리케이션을 개발할 수 있습니다.