본문 바로가기
DEV/Web 개발

Web 개발 :: 파이썬 Django Rest Framework(4) _로그인 방식 및 jwt 토큰

by 올커 2022. 10. 28.

DRF(Django Rest Framework)(4) _ 로그인 방식 및 jwt 토큰 

01. 로그인 방식 차이(세션 방식, 토큰 방식)

 - 이전 Django 프로젝트들에서 사용되었던 authenticate는 user signup을 완료했을 경우 db에 session(key, data, expire date)을 생성한다. 그리고 클라이언트에 돌려주는 Response에서는 쿠키에 세션키를 저장하여 돌려보내준다.

 - 쿠키방식의 경우 단점으로는 연결이 stateless하지 않다. 즉, 연결이 지속적이지 않고 db에 세션들이 계속 쌓이게 되고 매번 조회를 해야 하기 때문에 트래픽이 많아질 경우 부하가 많이 걸린다.

 - 토큰방식은 사용자의 정보가 담겨져있는 토큰을 전달하여 브라우저에서는 local storage에 토큰을 저장하여 사용한다.

 

02. 쿠키와 로컬 스토리지의 차이

(※ 참고 링크)

 - 쿠키는 name, value, domain, path, expires 등의 정보가 구분되어 담겨져 있지만, local storage는 key와 value로 구분한다.

 - 서버에서 직접 data에 접근해야 하는 경우에는 client의 local storage에 접근하지 못하기 때문에 쿠키를 사용해야 한다.

 - 쿠키는 최대 4096bytes, local storage는 5MB의 저장공간을 갖고 있으며, local storage는 만료(expires)가 없다.

 - 브라우저에 설정을 지정하는 것이 local storage가 편리하다.

 

03. drf에서 jwt 토큰 사용하기

(※ 참고 링크)

 - 새로운 장고 프로젝트를 생성하고 django, djangorestframework 및 위의 링크를 참고하여 라이브러리르 설치해준다.

pip install djangorestframework-simplejwt

 - INSTALLED_APPS에 'rest_framework'와 'rest_framework_simplejwt'를 함께 추가해준다.

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_simplejwt',
    ...
]

 

 - jwt를 사용하기 위해서는 settings.py 내에 아래 코드를 삽입해야 한다. 

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
}

 - users라는 장고 앱을 생성 및 세팅해주고 아래를 참고하여 JWT의 'TokenObtainPairView'와 'TokenRefreshView'를 ㅕusers/urls.py에 추가해준다. 여기서 입력된 view는 이미 자체적으로 만들어서 임포트해서 사용할 수 있도록 한 클래스뷰로 우리가 별도로 views.py에서 정의해주지 않아도 아래와 같이 import 하여 사용할 수 있다.

# users/urls.py

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'),
    ...
]

 - 현 상태에서 포스트맨을 열어 아래와 같이 확인해보면 아직 생성한 계정이 없기 때문에 아래와 같이 확인할 수 있다.

 - 임시로 admin계정을 생성하고, 포스트맨에서 Body → raw → JSON을 선택 후 아래와 같이 'username'과 'password'를 정확히 입력하여 Send하면 Response로 "refresh'와 'access'토큰을 받을 수 있다.

 - access 토큰은 보안상 이류로 인해 일정기간 사용 후 만료가 되면서 소멸되게 되어있다. 다시 사용을 위해 접근했을 때 만료된 계정을 재발급 받을 수 있게 해주는 것이 refresh 토큰이라고 볼 수 있다.

 - 만료기간은 아래와 같이 settings.py에서 지정해줄 수 있다.(※ 참고 링크)

# Django project settings.py

from datetime import timedelta
...

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    ...

 

 - Response로 받아온 이 토큰을 복사하여 jwt 공식 페이지에 접속하면 어떤 코드인지 확인할 수 있다.(※ 참고 링크)

   아래처럼 Encoded 부분에 복사한 토큰을 붙여넣어주면 Decoded에서 확인이 가능하다.

 - HEADER에서는 어떤 알고리즘으로 해싱되었는지, 타입이 무엇인지 나타내준다.

 - PAYLOAD에서는 실제 토큰의 내용이 들어간다. (토큰에 따라 표기하는 내용이 바뀔 수 있다. 토큰 타입, 만료일, unique id, user id 등)

 - VERIFY SIGNATURE는 인증정보를 나타낸다. (settings.py의 secret key를 아래 그림에서 붉은 색 박스 안에 넣으면 왼쪽 하단의 Invalid SignatureSignature Verified로 바뀌게 된다.

 

반응형

댓글