🐱

アプリ課金·サブスクリプション文脈でのエンタイトルメントとアクセスの違いと扱い方を整理する

に公開

はじめに

最近仕事でアプリ課金·サブスクリプションシステムとの連携を扱っています。

アプリ課金やサブスクリプションの文脈でよく出てくる概念が「エンタイトルメント(Entitlement)」と「アクセス(Access)」です。私はこれらの用語にあまり馴染みがなく当初は戸惑ったのですが、自分なりに両者の違いと役割を感じられるようになってきました。

本記事では、「Gold」「Platinum」「Bonus」という複数のプラン・権利がある例を使って、エンタイトルメントとアクセスの違いや、それらの扱い方について自分の理解を整理してみたいと思います。

注意:本記事は概念説明のため、セキュリティや信頼性、エラーハンドリングへの考慮などを簡略化しています。


1. エンタイトルメントとは?

エンタイトルメントは、ユーザーが持つ「利用権」や「権利」を表すものと考えられます。
具体的には「Goldプランに加入している」「Platinumプランに加入している」「キャンペーンのBonus権利がある」など、契約や条件にもとづく状態を示します。

例:ユーザーとエンタイトルメント

user_id entitlement
1 gold
2 platinum
3 bonus
4 free
  • gold:Goldプラン加入ユーザー
  • platinum:Goldより上位のPlatinumプラン加入ユーザー
  • bonus:キャンペーンなどでGoldと同等の機能が使える一時的権利

2. アクセスとは?

アクセスは「実際にどの機能が利用可能か」という状態を表します。
エンタイトルメントをもとに、サービス側がどの機能を解放するかを決めた結果と言えるでしょう。

考慮すべきポイント

  • PlatinumユーザーはGoldの機能を含む全機能を使える(包含関係
  • BonusユーザーはGoldと同等の機能が使える
  • Freeユーザーは基本機能のみ

PlatinumがGoldを包含する上位プランの場合、アクセス管理では包含関係を考慮すると良いかもしれません。


3. エンタイトルメントの同期について

エンタイトルメントは課金・サブスクリプション管理システムで管理されています。これらの情報をアプリケーション側で利用するには同期処理が必要になります。

ウェブフックによるリアルタイム同期

一般的なアプローチとして、ウェブフックを使ったリアルタイム同期があります:

課金システム → [ウェブフック] → アプリケーション → データベース更新
  1. ユーザーがプラン変更や購入を行う
  2. 課金システムがウェブフックでアプリケーションに通知
  3. アプリケーションがuser_entitlementsテーブルを更新
  4. 更新されたデータをもとにアクセス制御を実行

同期処理の例

# ウェブフックエンドポイント
def handle_entitlement_webhook
  user_id = params[:user_id]
  new_entitlement = params[:entitlement]
  
  # データベースのエンタイトルメント情報を更新
  UserEntitlement.find_or_create_by(user_id: user_id)
                 .update(entitlement_name: new_entitlement)
end

このようにして、課金システム側のエンタイトルメント変更がアプリケーション側のデータベースに反映され、ビューでの管理が可能になります。

4. ビューでの管理例

包含関係を反映したビュー設計の一例です。

-- Gold機能が使えるユーザーを含める(gold, platinum, bonus)
CREATE VIEW gold_access_users AS
SELECT user_id FROM user_entitlements
WHERE entitlement_name IN ('gold', 'platinum', 'bonus');

-- Platinum機能が使えるユーザーのみ
CREATE VIEW platinum_access_users AS
SELECT user_id FROM user_entitlements
WHERE entitlement_name = 'platinum';

5. アプリケーションでの利用例

if gold_access_users.include?(current_user.id)
  enable_gold_features
end

if platinum_access_users.include?(current_user.id)
  enable_platinum_features
end

このように、ビューにアクセス権の構造を反映させることで、アプリ側の判定がシンプルになる可能性があります。


6. まとめ

項目 エンタイトルメント アクセス
意味 ユーザーが持つ権利(契約・権限) 実際に使える機能の集合
管理場所 課金・サブスクリプション管理システム アプリケーション・サービス側
gold, platinum, bonusなど gold_access_usersビュー, platinum_access_usersビューなど
関係性 上位プランは下位プランを包含することが多い ビューなどで包含関係を表現できる
利点 権利管理のベースになる 実装のシンプル化、保守性向上

おわりに

エンタイトルメントはユーザーの持つ「資格」を表し、アクセスはそれを踏まえてサービス側が作る「使える機能の構造」と考えることができそうです。
「Gold」「Platinum」「Bonus」のように複数権利がある場合でも、ビューやロールで包含関係を表現すると実装や管理がしやすくなるかもしれません。

YAMAP テックブログ

Discussion