시작 전 알아야 할 것들

공식문서 Permissions
공식문서 Authentication

Django REST framework에서는 BasicAuthentication, SessionAuthentication, TokenAuthentication 등의 다양한 인증방식 모듈을 제공한다. 본인은 보안성을 높일 수 있고 서버의 확장성이 용이한 토큰인증방식 (Token Authentication)을 사용할 것이다.

공식문서 - Permissions
API Reference를 참고한다.

1. JWT setup


공식문서 - django-Simple JWT

$ pip install djangorestframework-jwt
from datetime import timedelta

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES' : ('rest_framework.permissions.IsAuthenticated',),
    'DEFAULT_AUTHENTICATION_CLASSES' : ('rest_framework_simplejwt.authentication.JWTAuthentication',),
}

SIMPLE_JWT = {  # 세부 설정
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': False,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,

    'AUTH_HEADER_TYPES': ('Bearer',),
}
  • Default Permission_classe : IsAuthenticated
    • 인증이 되지 않으면 요청에 대한 응답은 거절된다.
  • Default Authentication_class : jwt 토큰 인증방식
  • ACCESS_TOKEN_LIFETIME : 설정기간이 지나면 access 토큰사용이 불가능하다.

URL 설정

# urls.py
from rest_framework_simplejwt.views import (
  TokenObtainPairView, 
  TokenRefreshView,
  TokenVerifyView,
)

urlpatterns = [
  path('token/', TokenObtainPairView.as_view()),
  path('token/verify/', TokenVerifyView.as_view()),
  path('token/refresh/',TokenRefreshView.as_view()),
]

TokenObtainPairView

로그인요청의 검증작업에 성공하면 refresh, access token을 응답

Response

{
    "refresh": "...",
    "access": "..."
}

TokenVerifyView

POST 요청으로 refresh또는 access 토큰을 전송하면 그 것이 유효한지 검증한다. 유효하면 200 OK 상태코드를, 실패하면, 에러메세지와 함께 401 Unauthorized 에러를 응답

Response (failure)

{
    "detail": "Token is invalid or expired",
    "code": "token_not_valid"
}

TokenRefreshView

POST 요청으로 refresh 토큰을 전송하면 access 토큰을 갱신한다. 토큰이 유효하지 않으면 401 Unauthorized 에러를 응답

{
    "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTU2Njc4ODU5MCwianRpIjoiMDQwNDIzOTM4MzRkNGFjZmEzYjExNGJhMDYzODEwMTQiLCJ1c2VyX2lkIjo2fQ.eeWgodljs8-5BzeQH8MzivgQi7MNXQzQmvMhaT_3awo",
    "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTY2NzAyNDkwLCJqdGkiOiI5OWM4MGVjYzQyNjU0ZjY1YjQ5YWM1ZDg1YjVkNTBkMCIsInVzZXJfaWQiOjZ9.znio3M7Amx86Jsg1lbICCStYR4zG8a5QdsHaGTrawZY"
}