署名付きOG画像URL
署名付きOG画像URLとは、パラメータがHMAC-SHA256署名で保護されたURLです。これにより、あなた(およびシークレットを保持するコード)だけが、月間クォータにカウントされるレンダリングをリクエストできます。FastOGはコンテンツに署名するため、同一のパラメータは常に同一のキャッシュ済みURLを生成します。これにより、クォータが保護されると同時に、キャッシュが決定的になります。
OG画像URLに署名する理由
認証されていないURLから任意のテキストをレンダリングするOG画像エンドポイントは、誰でも叩ける無料のレンダーファームです。サブスクリプション制のサービスでは、誰でも残高を消費できてしまいます。バックエンドだけが知る秘密鍵で各URLに署名することで、認証されていないリクエストは(キャッシュされていない)最初のフェッチで全てブロックされ、正当なキャッシュ済みURLは引き続き機能します。
コンテンツ署名の仕組み
- 正規クエリ文字列を構築します。署名を除くすべてのパラメータをソートし、RFC-3986でエンコードします。
HMAC_SHA256(secret, "GET/api/v1/og\n" + canonical)を計算します。- 署名を
sパラメータとして追加します。
メッセージにはタイムスタンプが含まれないため、URLは安定しています。同じパラメータであれば同じURLになり、同じキャッシュエントリが使用されます。
canonical = "key=sk_...&template=default&title=Hello"
signature = HMAC-SHA256(secret, "GET/api/v1/og\n" + canonical)
url = ".../api/v1/og?key=...&template=default&title=Hello&s=" + signature
人々が誤解しているトレードオフ
| 懸念 | 現実 |
|---|---|
| 「署名付きURLは期限切れになる」 | いいえ — コンテンツ署名方式で、シークレットをローテーションするまで有効です |
| 「改ざんされたURLはキャッシュを壊す」 | いいえ — 不正なsはキャッシュミス時のみ401を返し、キャッシュ済み画像はそのまま返されます |
| 「セキュリティにはタイムスタンプが必要」 | コンテンツ署名でクォータ悪用を防ぐのに十分で、時計は不要です |
ワンファイルSDK
FastOGは、言語ごとに単一のサイナーファイル(依存関係ゼロ)を提供しているため、HMACを手作業で実装する必要はありません。SDKページからダウンロードするか、CDNからcurlを直接取得できます:
curl -O https://fastog.com/sdk/node.js
FAQ
署名付きURLは期限切れになりますか?
デフォルトでは期限切れになりません。APIキーのHMACシークレットをローテーションするまで有効です。時間ベースではなく、コンテンツベースの署名です。
他の人がURLを推測して私のクォータを消費することはできますか?
できません。有効な署名を生成するにはHMACシークレットが必要です。それがない場合、未キャッシュのレンダリングは401 invalid_signatureを返します。
ブラウザ上でURLに署名しますか?
いいえ。シークレットがクライアントに送信されないよう、サーバーサイド(またはエッジ関数内)で署名してください。レンダリングされた画像URLは、公開<head>に配置しても安全です。