ホームブログドキュメントチーム 無料で始める
Sprint Cycle 12

P0セキュリティ修正 — Webhook署名検証 +
Stripe Tier判定ロジック

2026-02-23 4 min read Security Sprint

概要

リリース前会議(Blog #024)で特定されたP0課題2件を修正するセキュリティスプリントです。

課題修正前修正後
Stripe Webhook tier判定 ハードコード "starter" metadata / price_id / amount で判定
Webhook署名検証 検証なし(全POSTを受理) HMAC-SHA256 署名検証

1. Stripe Tier判定ロジック修正

以前のコードでは、checkout.session.completed イベント受信時にtierが "starter" にハードコードされていました。Proプランを購入してもStarterに割り当てられるバグです。

修正アプローチ: 3段階フォールバック

// Priority順:
// 1. metadata["tier"] — checkout作成時に埋め込み
// 2. price_id マッチ — 環境変数の既知price_idと照合
// 3. amount_total — 金額ベースのフォールバック
pub fn determine_tier(session: &Value) -> &'static str

さらに、checkout session作成時に metadata[tier] を自動的に埋め込むよう create_checkout_session() も修正しました。

2. Stripe Webhook署名検証

Stripeは各webhook呼び出しに Stripe-Signature ヘッダーを付与します。このヘッダーには:

// 検証ロジック:
// 1. ヘッダーからtとv1を解析
// 2. タイムスタンプが5分以内か確認
// 3. HMAC-SHA256("${t}.${body}", webhook_secret) を計算
// 4. hex(result) == v1 なら合格

STRIPE_WEBHOOK_SECRET が未設定の場合は検証をスキップ(開発環境用)。本番では必ず設定します。

3. LINE Webhook署名検証

LINE PlatformはWebhook呼び出し時に X-Line-Signature ヘッダーを付与します。

// 検証ロジック:
// 1. HMAC-SHA256(channel_secret, body_bytes) を計算
// 2. Base64エンコード
// 3. X-Line-Signature ヘッダー値と比較

LINE_CHANNEL_SECRET 環境変数で制御。LINE webhookハンドラはJSONパース前に署名を検証するよう変更しました。

4. テスト結果

全10テストが合格。新規4テストを追加しました。

テスト名検証内容結果
stripe_signature_verification_works正当/不正署名の判定PASS
determine_tier_from_metadatametadata.tierからPro判定PASS
determine_tier_from_amountamount_totalからPro判定PASS
line_signature_verification_works正当/不正LINE署名の判定PASS
その他既存テスト (6件)ALL PASS

5. 追加クレート

クレートバージョン用途
hmac0.12HMAC計算(Stripe/LINE共通)
sha20.10SHA-256ハッシュ
hex0.4Stripe署名のhexエンコード
base640.22LINE署名のBase64エンコード

変更ファイル

P0課題2件を完了。ベータ公開に向けた最大のセキュリティリスクが解消されました。次のSprint 13ではP1課題(レート制限、入力バリデーション、GA設定、LINE紐付け)に取り組みます。

← ブログ一覧に戻る 無料で始める →