데이터베이스를 조회하지 않아도, 로직만으로 인증이 가능하다.
Format :헤더
.내용
.서명
서버에서 토큰 발급시에 비밀키(settings.py에 있는 비밀키 혹은 원하는 비밀키)로 서명을 하고, 발급시간을 저장.
서명은 암호화가 아니다.
Claim : 담는 정보의 한 조각. "Key/Value"의 형식.
비밀키 : settings.SECRET_KEY를 활용하거나, JWT_SECRET_KEY 설정을 합니다.
갱신 : Token 유효기간 내에 갱신하거나, username/password를 통해 재인증해야함.
이미 발급된 token을 폐기하는것은 불가능함.
원래 있던 djangorestframework-jwt는 프로젝트가 종료되어 해당 지원이 종료되었다.
이를 이어받아 계속 maintaining하고있는 simplejwt를 사용하자.
pip install djangorestframwork-simplejwt
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
# 'rest_framework.authentication.TokenAuthentication', #Token인증을 사용하지 않을시 빼버리는게 낫다. 성능에 영향을 주기때문.
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
],
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
TokenVerifyView,
)
urlpatterns += [
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
path('token/verify/', TokenVerifyView.as_view(), name='token_verify'),
]
셋업 자체는 어렵지 않았는데, 토큰 자체는 유효한데, 자꾸 시도를 하니 오류가 났다.
이유는... Http 헤더에 따옴표를 붙인것.. 나만... 해맸던거야?..
{
"detail": "이 토큰은 모든 타입의 토큰에 대해 유효하지 않습니다",
"code": "token_not_valid",
"messages": [
{
"token_class": "AccessToken",
"token_type": "access",
"message": "유효하지 않거나 만료된 토큰"
}
]
}
GET http://localhost:8000/[주소]
Accept: application/json
#성공
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjk2MDU2NzQ3LCJpYXQiOjE2OTYwNTQ5NDcsImp0aSI6IjM5Y2IyNTgwYjMxYTQ1MjdhOGU5YzI3YTc3MDFjNjQyIiwidXNlcl9pZCI6MX0.Ek-tHvxJdxDnvgxJdxZRHN4Y9fyY4OBvEQwmTRgmDTM
#실패
Authorization: Bearer "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjk2MDU2NzQ3LCJpYXQiOjE2OTYwNTQ5NDcsImp0aSI6IjM5Y2IyNTgwYjMxYTQ1MjdhOGU5YzI3YTc3MDFjNjQyIiwidXNlcl9pZCI6MX0.Ek-tHvxJdxDnvgxJdxZRHN4Y9fyY4OBvEQwmTRgmDTM"