Login

김기훈·2026년 2월 15일

이론

목록 보기
6/10


JWT(JSON Web Token)

  • 당사자 간에 정보를 JSON 객체로 안전하게 전송하기 위한 개방형 표준(RFC 7519)
    • 이 정보는 디지털 서명이 되어 있으므로 신뢰할 수 있으며 주로 인증(Authentication)과 정보 교환에 사용
  • 특징

    • 자가 수용적(Self-Contained)
      • 토큰 자체가 사용자 정보와 권한을 담고 있어, 서버가 별도의 세션 저장소를 조회할 필요가 없음
    • 무상태성(Stateless)
      • 서버는 클라이언트의 상태를 보관하지 않으며, 전달받은 토큰의 유효성만 검증함

JWT의 구조 (Structure)

  • JWT는 점(.) 으로 구분된 세 부분으로 구성됩니다
    • Header.Payload.Signature


  • 토큰의 타입(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가 들어오는 요청의 토큰을 검사 하도록 함
# settings.py

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'rest_framework_simplejwt', # Simple JWT 앱 등록
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 요청이 들어올 때 JWT 토큰을 확인하도록 설정
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

from datetime import timedelta

# JWT 상세 설정 (공식 문서 권장 사항 포함)
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),  # Access 토큰 유효 기간
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),     # Refresh 토큰 유효 기간
    'ROTATE_REFRESH_TOKENS': False,                 # Refresh 사용 시 새 토큰 발급 여부
    'ALGORITHM': 'HS256',                           # 암호화 알고리즘
    'SIGNING_KEY': 'YOUR_SECRET_KEY',               # 서명용 비밀키
    'AUTH_HEADER_TYPES': ('Bearer',),               # Authorization 헤더의 접두사
}

urls

  • 로그인 시 토크을 발급받고, 만료 시 갱신하는 엔드포인트를 제공함
# urls.py
from django.urls import path
from rest_framework_simplejwt.views import (
    TokenObtainPairView,
    TokenRefreshView,
)

urlpatterns = [
    # 1. 로그인 (아이디/암호 전송 시 Access/Refresh 토큰 발급)
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    
    # 2. 토큰 갱신 (Refresh 토큰으로 새로운 Access 토큰 발급)
    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에 해당 사용자 객체를 할당

profile
안녕하세요.

0개의 댓글