署名付きURLとembedトークン
AVCaptionの全動画はURLにembedトークンを持ちます: https://avcaption.com/watch/{embed_token}。トークンはアクセス資格情報 — 有効なトークンを持つ人は再生でき、持たない人は拒否されます。
無料または公開コンテンツでは動画ごとに1つのトークンを生成し、ずっと有効です。有料またはゲーテッドコンテンツでは、認証セッションごとにREST API経由で新しいトークンを生成します。
トークンの仕組み
トークンは短い不透明な文字列(既定で32文字16進)です。サーバー側で以下にマッピングされます:
- 動画ID
- 任意の視聴者識別子(分析と動的ウォーターマーク用)
- 失効タイムスタンプ
- 許可オリジンのリスト(あなたのドメインホワイトリスト)
- レート制限メタデータ
プレーヤーがストリーム鍵を要求すると、サーバーはトークンを検証し、有効期限を確認し、要求元オリジンを確認し、その後初めて次のバッチ用のAES-128鍵を発行します。
REST API経由のセッション単位トークン
有料コンテンツでの推奨パターン:
- ユーザーがあなたのアプリにログイン。
- アプリがDBに対してユーザーを認証。
- アプリがAVCaptionのREST APIを呼び出し:
POST /api/v1/embed-tokenに{video_id, viewer_id, expires_in: 3600}。 - AVCaptionが1時間有効なワンタイムembedトークンを返却。
- そのトークンでiframeをレンダリング。
- トークンが失効; ユーザーがリフレッシュするとアプリが新しいトークンを生成。
つまりiframe URLをコピーして共有したユーザーが渡すのは1時間以内に失効するトークン — 再配布には使えません。
トークン単位のドメインホワイトリスト
トークンは特定のオリジンに紐付けられます。app.example.com 用に発行されたトークンは pirate-site.com で埋め込んでも動きません。ブラウザはマスタープレイリスト要求時にRefererヘッダーを送り、AVCaptionがホワイトリストに照らして検証し、鍵発行を拒否します。
署名付きURLアプローチとの比較
一部のプラットフォームは署名付きURL(各セグメントにHMAC署名のクエリ文字列)を使います。AVCaptionは不透明なトークンを使い、サーバー側でアクセスメタデータにマッピングします。トレードオフ:
- 署名付きURL — 完全にステートレスで、エッジで簡単に検証可能。ただし一度署名されたURLは有効期限まで失効できません。
- 不透明トークン(AVCaption) — ストリームセッションごとにサーバー側ルックアップが必要ですが、リアルタイム失効、トークン単位の分析、より豊富なアクセスメタデータが可能になります。
失効が重要な有料コンテンツでは不透明トークンが勝ります。より深い比較は embedトークン vs 署名付きURL のglossaryを参照してください。
トークンローテーション
非常に高価値のコンテンツでは、API経由でスケジュールに沿ってトークンをローテーションします:
POST /api/v1/embed-token/rotate
{ "video_id": "abc123" }
これでその動画の既存トークンをすべて無効化し、新しいトークンを発行します。漏洩疑いやチャージバック後に有用です。
TTLの使い分け
| TTL | ユースケース |
|---|---|
| 5分 | ダウンロード形式の単発配信(有料デジタルプロダクト、単回レビューリンク) |
| 1時間 | 標準的な認証セッション(メンバーポータル、コースプレイヤー) |
| 24時間 | 無料の公開コンテンツ、マーケティング動画 |
| 30日 | 期間限定レンタル、月次ボーナスコンテンツ |
短いTTLはセキュリティを上げ、長いTTLはトークン発行APIコールを減らします。多くの有料コンテンツでは1時間が適切なデフォルトです。
はじめる
embedトークンはアップロード時に全プランで自動発行されます。セッション単位のトークン生成REST APIはEnterprise機能です——認可チェックに組み込めば、セッションが切れたときに自動失効するトークンを発行できます。フリーアカウントを作成し、動画を1本アップロードして、デフォルトの24時間トークンが期待通りに失効することを確認してみてください。よくあるパターン:オンラインコースやメンバーシップサイト動画でのセッション単位トークン。