Contents
Django REST framework 認証 方法の選定と実装ガイド
Django REST Framework(DRF)でAPI認証を構築する際、セキュリティと柔軟性を両立させるには、認証方式の選び方が重要です。トークン認証・セッション認証・OAuth2.0・JWTなど、目的に応じた最適な方法を選択することで、アプリケーションの信頼性を高められます。本記事では現行バージョン(DRF 3.14以降)に基づき、実務で使える具体的なコード例と比較分析を解説します。
DRF認証の概要と選定基準
セキュリティ設計においては、認証方式の特性とユースケースに応じた選択が不可欠です。DRFではリクエストヘッダやクライアント側のトークン管理により認証が行われるため、用途ごとに最適な選択肢を検討する必要があります。以下に代表的な方式の特徴と比較を行います。
認証方式の特性比較
| 認証方式 | 概要 | 安全性 | 有効期限管理 | 推奨用途 |
|---|---|---|---|---|
| トークン認証 | ユーザーごとに発行される文字列をヘッダーに含める方式 | 中程度 | 可能 | シンプルなREST API |
| セッション認証 | Djangoのセッションメカニズムを利用する | 高 | 不可能 | ブラウザベースのアプリ |
| OAuth2.0 | 第三者アカウント連携を想定したプロトコル | 最高 | 可能 | SaaSや外部サービス連携 |
| JWT(JSON Web Token) | 署名付きトークンで認証情報を含む方式 | 高 | 可能 | 低レイテンシーが必要なAPI |
セキュリティ設計では「最小権限の原則」と「タイムアウト設定」を意識し、アクセスログや異常検知機能の併設が推奨されます。
トークン認証の実装手順
トークン認証はDRF標準で利用可能な簡単な方式ですが、セキュリティ対策として有効期限付きトークン管理が必要です。以下に実装ステップを紹介します。
モデルの作成と有効期限管理
- トークンモデルを作成し、
TokenAuthenticationクラスで利用可能にする。 Tokenモデルにexpires_atフィールドを追加し、有効期限付きで認証処理を実装する。
|
1 2 3 4 5 6 7 8 9 10 |
from django.db import models class Token(models.Model): user = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE ) token = models.CharField(max_length=100) expires_at = models.DateTimeField() |
認証クラスのカスタマイズ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from rest_framework.authentication import TokenAuthentication class CustomTokenAuthentication(TokenAuthentication): keyword = 'Bearer' def authenticate(self, request): auth_header = self.get_authorization_header(request) if not auth_header: return None try: token = Token.objects.filter(token=auth_header.decode(), expires_at__gt=timezone.now()).first() return (token.user, token) except Token.DoesNotExist: return None |
セッション認証の設定方法
セッション認証はDjangoの既存機能と連携することで、ブラウザベースのアプリケーションで利用可能です。以下に設定手順を説明します。
CSRF保護とSameSite属性の設定
|
1 2 3 4 5 6 7 8 9 |
MIDDLEWARE = [ 'django.middleware.csrf.CsrfViewMiddleware', ... ] SESSION_COOKIE_SECURE = True SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_SAMESITE = 'Lax' # ブラウザが異なるドメイン間でCookieを送信しないように制限 |
SameSite属性の解説
-Strict:同一サイトでのみCookieが送信される(セキュリティが高い)
-Lax:フォームサブミットやGETリクエスト時のみ送信(ユーザーエクスペリエンスと安全性を両立)
OAuth2.0との連携方法
OAuth2.0は外部サービスやSaaSと連携する際によく使われる認証方式です。以下にDRF-OAuth2ライブラリを使用した設定手順を解説します。
認可サーバーの設定(drf-oauth2-provider)
|
1 2 |
pip install drf-oauth2-provider |
|
1 2 |
INSTALLED_APPS += ['oauth2_provider', 'rest_framework'] |
アクセス・リフレッシュトークン処理
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from oauth2_provider.models import AccessToken, RefreshToken def generate_tokens(user): access_token = AccessToken.objects.create( user=user, token='random_string', expires_in=3600 # 1時間有効 ) refresh_token = RefreshToken.objects.create( user=user, token='longer_random_string' ) |
実装例:認証ビュー
|
1 2 3 4 5 6 |
from oauth2_provider.views import TokenView urlpatterns = [ path('o/token/', TokenView.as_view(), name='token'), # アクセストークンの取得エンドポイント ] |
JWT認証の導入ガイド
JWT(JSON Web Token)は軽量なトークン形式で、API間での通信に適しています。以下にdjangorestframework-simplejwtを使用して導入する方法を解説します。
暗号鍵管理とRS256の設定
- 公開鍵/秘密鍵ペアを作成(例:OpenSSLで
openssl genrsa -out private_key.pem 2048) JWT_SIGNING_KEYに秘密鍵を指定し、ALGORITHMはRS256を使用
|
1 2 3 4 5 6 7 8 |
from rest_framework_simplejwt.algorithms import RS256 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), } |
トークン発行とローテーション
- リフレッシュトークンの有効期限:1日以内に設定し、セキュリティとユーザーエクスペリエンスをバランス
- トークンローテーションは
refresh_token経由で実施(例:/token/refreshエンドポイント使用)
カスタム認証クラスの作成例
独自のヘッダーやクエリパラメータを用いた認証ロジックが必要な場合、カスタム認証クラスを作成します。以下は実装例です。
ミドルウェアとの連携例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed class APIKeyAuthentication(BaseAuthentication): def authenticate(self, request): api_key = request.META.get('HTTP_X_API_KEY') if not api_key: raise AuthenticationFailed('APIキーが指定されていません') try: user = User.objects.get(api_key=api_key) except User.DoesNotExist: raise AuthenticationFailed('無効なAPIキーです') return (user, None) |
認証方式の選定ガイド
- トークン認証:シンプルなREST APIに適した選択肢
- セッション認証:ブラウザベースのアプリケーションで利用可能(SameSite属性を厳密に設定)
- OAuth2.0:SaaSと連携する際に便利(drf-oauth2-providerで実装例を追加)
- JWT:軽量かつセキュアな通信に最適(RS256アルゴリズムを使用し、鍵管理を厳格化)
- カスタム認証クラス:独自の要件に応じて柔軟に対応
DRFでの認証実装は、目的に応じた選択と適切な設定が成功の鍵です。セキュリティを最優先しながら、柔軟性を持った設計を目指してください。