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 Signature가 Signature Verified로 바뀌게 된다.
'DEV > Web 개발' 카테고리의 다른 글
Web 개발 :: Django 머신러닝 프로젝트 Code Review _ User_TIL#40 (0) | 2022.10.29 |
---|---|
Web 개발 :: Django 개발 중 소소하게 알게된 점 _ User_TIL#39 (0) | 2022.10.28 |
Web 개발 :: 파이썬 Django Rest Framework(3) _ 클래스형 뷰, 프론트엔드에 출력하기 (0) | 2022.10.27 |
Web 개발 :: Django 머신러닝 프로젝트 Code Review _ User_TIL#37 (1) | 2022.10.26 |
Web 개발 :: 파이썬 Django Rest Framework(2) _ 포스트맨, Swagger (0) | 2022.10.26 |
댓글