장고 rest frame work
사용한 라이브러리
JWT 기반 인증 구현.
많은 API가 인증을 필요로 하며, SimpleJWT는 접근과 갱신을 위한 JWT를 간편하게 관리할 수 있습니다. 사용 예시와 유지보수 상태가 좋기 때문에 DRF와 함께 자주 사용됩니다.
개요: Django REST Framework SimpleJWT는 Django REST Framework와 함께 사용하는 JWT 인증을 위한 라이브러리로, 더 많은 기능과 커스터마이징 옵션을 제공합니다.
유지보수: 활발하게 유지보수되고 있으며, 최신 Django 및 DRF와의 호환성이 보장됩니다.
기능:
Access Token과 Refresh Token의 분리: Access Token을 만료시키고 Refresh Token으로 새로운 Access Token을 발급받을 수 있는 기능을 제공합니다.
다양한 옵션 제공: 토큰의 유효 기간, 서명 알고리즘, 유효성 검사를 위한 커스터마이징이 가능합니다.
Django Admin에서 관리: 토큰을 관리할 수 있는 추가적인 옵션이 있습니다.
설치
pip install djangorestframework-simplejwt
settings.py에 추가합니다.
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
# 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'),
]
주요 차이점 요약
유지보수 및 업데이트:
Django REST Framework JWT: 현재 유지보수가 잘 이루어지지 않음.
Django REST Framework SimpleJWT: 활발하게 유지보수되고 있으며, 최신 기능이 지속적으로 추가됨.
기능:
Django REST Framework JWT: 기본적인 JWT 기능만 제공.
Django REST Framework SimpleJWT: Access Token과 Refresh Token을 분리하여 관리할 수 있고, 커스터마이징 옵션이 많음.
설정 및 사용의 용이성:
두 라이브러리 모두 설정이 간단하지만, SimpleJWT는 더 많은 옵션을 제공하므로 더 유연하게 구성할 수 있습니다.
교차 출처 리소스 공유Cross-Origin Resource Sharing(CORS)로 쉽게 설정할 수 있도록 해주는 라이브러리로, API를 다른 도메인에서 호출할 수 있게 해줍니다.
프론트엔드 애플리케이션이 다른 도메인에서 호스팅되는 Django 백엔드 API에 접근할 수 있도록 허용
클라이언트가 다른 도메인에서 API에 요청할 때 CORS 오류가 발생하지 않도록 도와줍니다. 예를 들어, 프론트엔드와 백엔드가 다른 도메인에 있을 때 유용합니다.
설치
pip install django-cors-headers
settings.py에 추가합니다.
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ALLOWED_ORIGINS = [
"https://example.com",
]
비동기 웹 애플리케이션 기능을 제공하여 실시간 웹소켓 통신과 비동기 작업 처리를 가능하게 합니다.
Django는 기본적으로 동기 요청-응답 모델이기 때문에 Channels가 필요한 상황이 많습니다.
Channels를 통해 실시간 채팅, 알림, 실시간 데이터 스트리밍(업데이트) 등의 작업을 Django에서 쉽게 구현할 수 있습니다.
-기존 Django의 동기 처리만으로는 실시간 기능이 어렵기 때문에 Channels로 이를 해결
설치
Channels와 메시지 브로커로 사용할 Redis를 설치합니다. Redis는 비동기 통신과 메시지 큐 역할을 하며, Channels의 기본 백엔드로 자주 사용됩니다.
pip install channels channels-redis
예시
Django Channels를 설정하고 간단한 실시간 WebSocket Consumer를 만들어보겠습니다.
settings.py에 Channels와 Redis 설정을 추가합니다.
INSTALLED_APPS = [
...,
'channels', # Channels 설치
]
# Channels의 ASGI 설정
ASGI_APPLICATION = "myproject.asgi.application"
# Redis를 Channels의 메시지 백엔드로 사용
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("127.0.0.1", 6379)], # 로컬 Redis 서버 주소와 포트
},
},
}
ASGI 설정
Channels는 ASGI를 통해 비동기 서버와 통신하므로, asgi.py 파일을 설정합니다.
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from myapp.routing import websocket_urlpatterns
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
websocket_urlpatterns
)
),
})
URL 라우팅 설정
WebSocket 요청을 처리하기 위해 URL 라우팅을 설정합니다. myapp/routing.py에 WebSocket URL을 정의합니다.
from django.urls import path
from . import consumers
websocket_urlpatterns = [
path("ws/chat/", consumers.ChatConsumer.as_asgi()),
]
WebSocket Consumer 작성
Channels에서 Consumer는 Django의 뷰와 유사한 역할을 합니다. myapp/consumers.py에 실시간 채팅 WebSocket Consumer를 작성합니다.
import json
from channels.generic.websocket import AsyncWebsocketConsumer
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.accept() # 클라이언트 연결 승인
async def disconnect(self, close_code):
pass # 연결 해제 처리
async def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json["message"]
# 클라이언트로 메시지 전송
await self.send(text_data=json.dumps({
"message": message
}))