Django REST Framework(DRF)を使って、JWT 認証とセッション認証を組み合わせた API のセキュリティ強化方法を解説します。
Django REST Framework(DRF)で API を作成すると、ユーザー認証 をどのように行うかが重要になります。
API には JWT 認証 や セッション認証 など複数の認証方法があります。
本記事では、DRF を使って JWT 認証 と セッション認証 を実装する方法を解説します。
Django で API 認証を実装するには、settings.py
の REST_FRAMEWORK
に認証方式を指定します。
PYTHONREST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', # セッション認証 'rest_framework_simplejwt.authentication.JWTAuthentication', # JWT 認証 ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', # 認証必須 ), }
✅ ポイント
SessionAuthentication
→ Django の セッションベースの認証 を利用。JWTAuthentication
→ JSON Web Token(JWT)を使った認証 を追加。IsAuthenticated
→ 認証されたユーザーのみ API を利用可能 に設定。JWT 認証を利用するには djangorestframework-simplejwt
をインストールします。
BASHpip install djangorestframework-simplejwt
そして、urls.py
に JWT トークンの取得用エンドポイントを追加します。
PYTHONfrom django.urls import path 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'), ]
✅ エンドポイントの動作
/api/token/
→ ユーザー認証して アクセストークン & リフレッシュトークン を取得/api/token/refresh/
→ リフレッシュトークン を使って新しいアクセストークンを取得curl
でログインし、JWT を取得します。
BASHcurl -X POST http://127.0.0.1:8000/api/token/ \ -H "Content-Type: application/json" \ -d '{"email": "test@example.com", "password": "password123"}'
レスポンス:
JSON{ "refresh": "your_refresh_token", "access": "your_access_token" }
Django の セッション認証 を使うと、ブラウザベースのクライアント(フロントエンド)と API を連携しやすくなります。
urls.py
にログイン・ログアウト用のエンドポイントを追加します。
PYTHONfrom django.contrib.auth.views import LoginView, LogoutView urlpatterns += [ path('api/login/', LoginView.as_view(), name='api_login'), path('api/logout/', LogoutView.as_view(), name='api_logout'), ]
✅ ポイント
LoginView
→ Django の認証機能を使ってログイン。LogoutView
→ ログアウトしてセッションを無効化。BASHcurl -X POST http://127.0.0.1:8000/api/login/ \ -H "Content-Type: application/json" \ -d '{"email": "test@example.com", "password": "password123"}'
成功すると セッション ID がセットされ、認証済みのリクエストが可能 になります。
views.py
に 認証必須の API を作成します。
PYTHONfrom rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated class SecureDataView(APIView): permission_classes = [IsAuthenticated] # 認証必須 def get(self, request): return Response({"message": "認証成功!このデータは保護されています。"})
urls.py
にルートを追加。
PYTHONurlpatterns += [ path('api/secure-data/', SecureDataView.as_view(), name='secure_data'), ]
BASHcurl -X GET http://127.0.0.1:8000/api/secure-data/
レスポンス:
JSON{ "detail": "認証情報が提供されていません。" }
BASHcurl -X GET http://127.0.0.1:8000/api/secure-data/ \ -H "Authorization: Bearer your_access_token"
成功すると、以下のレスポンスが返ります。
JSON{ "message": "認証成功!このデータは保護されています。" }
✅ ポイント
Authorization: Bearer your_access_token
をヘッダーに追加することで、JWT 認証が有効になる。SessionAuthentication
を使用する場合は、ログイン後のセッションでアクセス可能。SessionAuthentication
は ブラウザ向けの認証 に適している。JWTAuthentication
は モバイルアプリや SPA(シングルページアプリ)に適した認証。IsAuthenticated
を使うと、API を 認証ユーザー限定 にできる。simplejwt
を組み合わせると、API のセキュリティを強化できる。回 | タイトル | リンク |
---|---|---|
第 1 回 | Django: 認証システムとログイン機能 | 詳 細 |
第 2 回 | Django: カスタムユーザーモデルの作成 | 詳 細 |
第 3 回 | Django: メール認証とパスワードリセット | 詳 細 |
第 4 回 | Django: ソーシャルログイン(Google・LINE 認証) | 詳 細 |
第 5 回 | Django: API の作成と Django REST Framework の導入 | 詳 細 |
第 6 回 | Django: 認証付き API(JWT 認証とセッション認証) | この記事 |
第 7 回 | Django: CORS 設定とフロントエンドとの連携 | 詳 細 |
第 8 回 | Django: ルーティングのテストとデバッグ | 詳 細 |
第 9 回 | Django: カスタムミドルウェアの作成 | 詳 細 |
第 10 回 | Django: 非同期処理と async/await の活用 | 詳 細 |
第 11 回 | Django: カスタムコマンドの作成 | 詳 細 |
当サイトの情報は、一般的な参考情報として提供しております。
正確な情報の掲載に努めておりますが、その内容の正確性・完全性・最新性を保証するものではありません。
記事の内容をご利用の際は、ご自身の責任において判断し、必要に応じて専門家にご相談ください。
当サイトの情報の利用により生じたいかなる損害についても、一切の責任を負いかねますのでご了承ください。
※ 本ページでは、著作権法に基づき、適正な引用の範囲内でコンテンツを紹介しています。
オリジナルの情報は発信元をご確認ください。
もし問題がありましたら、こちら からお問い合わせください。