この記事について
ポイント残高は個人情報であり、適切な認証なしにアクセスされてはいけません。複数の認証方式に対応し、セキュリティを確保する仕組みを解説します。
なぜ認証が重要なのか
認証なしの場合のリスク
守るべきセキュリティ原則
- 認証(Authentication): リクエストが誰からのものか確認
- 認可(Authorization): その人がアクセスする権限があるか確認
- 監査(Audit): 全てのアクセスを記録
認証の仕組み
認証チェックの流れ
リクエスト受信
クライアントからポイント取得リクエストを受信
認証情報確認
リクエストヘッダーから認証トークンを取得
トークン検証
トークンの有効性(署名、有効期限)を検証
顧客ID取得
トークンから認証された顧客のIDを取得
所有権検証
リクエスト対象の顧客IDと認証された顧客IDが一致するか確認
アクセス許可/拒否
全て合格なら処理続行、不合格ならエラーを返却
フロー図
認証フローの詳細
クライアント
GET /api/points(Authorization: Bearer xxx)
サーバー
トークン抽出 → 署名検証 → 有効期限チェック → 顧客ID取得 → 所有権検証
対応している認証方式
セッショントークン認証
セッショントークン方式 - ログイン時
メールOTPでログイン
顧客がワンタイムパスワードで認証
トークン発行
サーバーがセッショントークンを発行
Cookie保存
トークンをHttpOnly Cookieに保存
Shopify Customer Account API連携
Shopify OAuth方式 - ログイン時
Shopifyアカウントでログイン
顧客がShopifyの認証画面で認証
OAuthトークン発行
ShopifyがOAuthトークンを発行
顧客情報取得可能
トークンで顧客情報にアクセス可能に
所有権検証の重要性
なぜ所有権を確認するのか
重要: 認証されていても、他人のデータにはアクセスさせない
検証ロジック
所有権検証の流れ
入力情報の取得
認証トークンから顧客ID(A)、リクエストパラメータから対象顧客ID(X)を取得
ID一致チェック
A === X か確認
結果
一致 → ポイント残高を返却 / 不一致 → 403エラー、不正アクセスとしてログ記録
セキュリティ対策
実装している対策
エラーレスポンスの設計
運用者向け: 詳細は管理画面で確認可能
ログと監視
記録すべき情報
監視アラート
この設計がもたらす効果
セキュリティ面
- 他人のポイントが見られない安全な設計
- 不正アクセスの検知と追跡が可能
- 攻撃に対する耐性の確保
運用面
- 問題発生時の原因特定が容易
- セキュリティ監査に対応可能
- 継続的な改善のためのデータ収集