Django: 認証付き API(JWT 認証とセッション認証)

Django 4 の実践(アプリ開発編)

日付:2025年2月18日

Django REST Framework(DRF)を使って、JWT 認証とセッション認証を組み合わせた API のセキュリティ強化方法を解説します。

目 次

はじめに

Django REST Framework(DRF)で API を作成すると、ユーザー認証 をどのように行うかが重要になります。
API には JWT 認証セッション認証 など複数の認証方法があります。

本記事では、DRF を使って JWT 認証セッション認証 を実装する方法を解説します。

1. Django REST Framework(DRF)の認証設定

Django で API 認証を実装するには、settings.pyREST_FRAMEWORK に認証方式を指定します。

PYTHON
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', # セッション認証 'rest_framework_simplejwt.authentication.JWTAuthentication', # JWT 認証 ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', # 認証必須 ), }

ポイント

  • SessionAuthentication → Django の セッションベースの認証 を利用。
  • JWTAuthenticationJSON Web Token(JWT)を使った認証 を追加。
  • IsAuthenticated認証されたユーザーのみ API を利用可能 に設定。

2. JWT 認証の導入

JWT 認証を利用するには djangorestframework-simplejwt をインストールします。

BASH
pip install djangorestframework-simplejwt

そして、urls.py に JWT トークンの取得用エンドポイントを追加します。

PYTHON
from 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/リフレッシュトークン を使って新しいアクセストークンを取得

(1) トークンの取得

curl でログインし、JWT を取得します。

BASH
curl -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" }

3. セッション認証の実装

Django の セッション認証 を使うと、ブラウザベースのクライアント(フロントエンド)と API を連携しやすくなります。

urls.py にログイン・ログアウト用のエンドポイントを追加します。

PYTHON
from 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 → ログアウトしてセッションを無効化。
  • フロントエンドとセッションを共有する場合に便利。

(1) ログインの実行

BASH
curl -X POST http://127.0.0.1:8000/api/login/ \ -H "Content-Type: application/json" \ -d '{"email": "test@example.com", "password": "password123"}'

成功すると セッション ID がセットされ、認証済みのリクエストが可能 になります。

4. 認証が必要な API の作成

views.py認証必須の API を作成します。

PYTHON
from 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 にルートを追加。

PYTHON
urlpatterns += [ path('api/secure-data/', SecureDataView.as_view(), name='secure_data'), ]

5. API の動作確認

(1) 認証なしでアクセス

BASH
curl -X GET http://127.0.0.1:8000/api/secure-data/

レスポンス:

JSON
{ "detail": "認証情報が提供されていません。" }

(2) JWT 認証を使用してアクセス

BASH
curl -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 を使用する場合は、ログイン後のセッションでアクセス可能。

6. まとめ

  • SessionAuthenticationブラウザ向けの認証 に適している。
  • JWTAuthenticationモバイルアプリや SPA(シングルページアプリ)に適した認証
  • IsAuthenticated を使うと、API を 認証ユーザー限定 にできる。
  • Django REST Framework(DRF)と simplejwt を組み合わせると、API のセキュリティを強化できる。