JWT는 JSON Web Token의 약자로, 웹 애플리케이션에서 사용자 인증 및 권한 부여를 위한 토큰 기반 인증 방법 중 하나입니다. JWT는 클라이언트와 서버 간의 신뢰할 수 있는 정보 교환을 위해 사용되며, 특히 RESTful API와 같은 stateless(상태 비저장) 애플리케이션에서 널리 사용됩니다.
JWT는 세 부분으로 구성된 문자열이며, 각각의 부분은 마침표(.)로 구분됩니다. 이 세 부분은 Header, Payload, Signature입니다.
Header (헤더)
{
"alg": "HS256",
"typ": "JWT"
}alg는 해싱 알고리즘(예: HMAC SHA256)을 나타내고, typ는 토큰 유형이 JWT임을 나타냅니다.Payload (페이로드)
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622
}sub은 토큰의 주체(사용자)를 나타내고, iat는 토큰이 발급된 시간, exp는 만료 시간을 나타냅니다.Signature (서명)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)클라이언트 인증 요청: 클라이언트가 로그인을 시도하면, 서버는 클라이언트의 자격 증명(예: 사용자 이름과 비밀번호)을 확인합니다.
JWT 발급: 자격 증명이 확인되면, 서버는 클라이언트에게 JWT를 발급합니다. 이 JWT는 클라이언트의 세션을 유지하는 데 사용되며, 클라이언트는 이후의 요청마다 이 토큰을 서버에 전달합니다.
JWT 전송: 클라이언트는 JWT를 HTTP 요청 헤더의 Authorization 필드에 포함시켜 서버에 보냅니다. 일반적으로 다음과 같은 형식으로 전달됩니다:
Authorization: Bearer <jwt_token>
서버에서 JWT 검증: 서버는 요청을 받을 때 JWT의 서명을 검증하여, 토큰이 유효한지 확인합니다. 토큰이 유효하다면, 페이로드에 담긴 정보를 사용해 요청을 처리합니다.
응답 처리: 토큰이 유효하면 서버는 요청된 리소스를 제공하거나 요청을 처리합니다. 그렇지 않으면 인증 오류(예: 401 Unauthorized)를 반환합니다.
Django에서 JWT 인증을 구현하기 위해, 주로 djangorestframework-simplejwt와 같은 라이브러리를 사용합니다. 이 라이브러리는 JWT 기반 인증을 쉽게 설정할 수 있도록 도와줍니다.
pip install djangorestframework-simplejwt
# settings.py
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_simplejwt',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
# JWT 설정 (필요 시 추가 설정 가능)
from datetime import timedelta
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}
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/ 엔드포인트로 로그인 요청을 보내 JWT를 받을 수 있으며, 이후 모든 요청에 이 토큰을 포함하여 인증할 수 있습니다.
djangorestframework-simplejwt 라이브러리를 사용하여 손쉽게 설정할 수 있습니다.