Django DRF에서 JWT로 인증하기

cloud_park·2023년 9월 30일
0

DRF를 배우자

목록 보기
6/6

DRF의 Token

  1. 각 User와 1:1 매칭이고 유효기간이 없다 -> Token이 탈취되면 안된다.
  2. Database에 Token을 가진 유저를 매칭해야한다.

JWT (JSON Web Token)

데이터베이스를 조회하지 않아도, 로직만으로 인증이 가능하다.

Format :헤더.내용.서명
서버에서 토큰 발급시에 비밀키(settings.py에 있는 비밀키 혹은 원하는 비밀키)로 서명을 하고, 발급시간을 저장.
서명은 암호화가 아니다.

Claim : 담는 정보의 한 조각. "Key/Value"의 형식.

비밀키 : settings.SECRET_KEY를 활용하거나, JWT_SECRET_KEY 설정을 합니다.
갱신 : Token 유효기간 내에 갱신하거나, username/password를 통해 재인증해야함.
이미 발급된 token을 폐기하는것은 불가능함.

djangorestframework-simplejwt를 사용하자.

원래 있던 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"
profile
Now in progress of untitled advance

0개의 댓글