
JWT(JSON Web Token)
- 당사자 간에 정보를 JSON 객체로 안전하게 전송하기 위한 개방형 표준(RFC 7519)
- 이 정보는 디지털 서명이 되어 있으므로 신뢰할 수 있으며 주로 인증(Authentication)과 정보 교환에 사용
특징
- 자가 수용적(Self-Contained)
- 토큰 자체가 사용자 정보와 권한을 담고 있어, 서버가 별도의 세션 저장소를 조회할 필요가 없음
- 무상태성(Stateless)
- 서버는 클라이언트의 상태를 보관하지 않으며, 전달받은 토큰의 유효성만 검증함
JWT의 구조 (Structure)
- JWT는
점(.) 으로 구분된 세 부분으로 구성됩니다
- 토큰의 타입(JWT)과 사용 중인 서명 알고리즘(예: HMAC SHA256 또는 RSA)을 정의
{
"alg": "HS256",
"typ": "JWT"
}
Payload
- 사용자 ID, 토큰 만료 시간 등 클레임(Claims)이라 불리는 정보를 담고 있음
- Reserved claims: 서비스에 필요한 표준 정보 (sub, exp, iat 등)
- Public/Private claims: 사용자 정의 데이터 (예: user_id, email)
Signature
- 헤더와 페이로드를 인코딩한 값에 서버만 알고 있는 Secret Key를 더해 생성
- 메시지가 도중에 변조되지 않았음을 증명하는 핵심 부분
Simple JWT(Django)
- Django REST Framework(DRF) 환경에서 가장 표준적으로 사용되는
djangorestframework-simplejwt 라이브러리
settings
- REST_FRAMEWORK 설정에 JWTAuthentication을 추가하여 Django가 들어오는 요청의 토큰을 검사 하도록 함
INSTALLED_APPS = [
'rest_framework',
'rest_framework_simplejwt',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'ALGORITHM': 'HS256',
'SIGNING_KEY': 'YOUR_SECRET_KEY',
'AUTH_HEADER_TYPES': ('Bearer',),
}
urls
- 로그인 시 토크을 발급받고, 만료 시 갱신하는 엔드포인트를 제공함
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'),
]
Workflow
Django에서 JWT 로그인이 작동하는 방식
- 로그인 요청
- 클라이언트가 POST /api/token/으로 사용자 정보(Username/Password)를 전송
- 토큰 발행
- 서버는 정보를 검증한 후, Access Token과 Refresh Token을 생성하여 응답
- 자원 요청
- 클라이언트는 이후 보호된 API에 접근할 때 HTTP 헤더에 토큰을 포함
Authorization: Bearer <Your_Access_Token>
- 검증
- Django의
JWTAuthentication 클래스가 헤더의 서명을 검증하고
- 유효하다면
request.user에 해당 사용자 객체를 할당