この記事について
ポイント残高は個人情報であり、適切な認証なしにアクセスされてはいけません。複数の認証方式に対応し、セキュリティを確保する仕組みを解説します。
なぜ認証が重要なのか
認証なしの場合のリスク
| リスク | 具体的な被害 |
|---|---|
| 他人のポイント閲覧 | プライバシー侵害、個人情報漏洩 |
| ポイントの不正利用 | 他人のポイントでクーポン発行 |
| 顧客リストの流出 | 顧客IDを総当たりで取得される |
| システムへの攻撃 | 大量リクエストによるサービス停止 |
他人のポイント閲覧
具体的な被害プライバシー侵害、個人情報漏洩
ポイントの不正利用
具体的な被害他人のポイントでクーポン発行
顧客リストの流出
具体的な被害顧客IDを総当たりで取得される
システムへの攻撃
具体的な被害大量リクエストによるサービス停止
守るべきセキュリティ原則
- 認証(Authentication): リクエストが誰からのものか確認
- 認可(Authorization): その人がアクセスする権限があるか確認
- 監査(Audit): 全てのアクセスを記録
認証の仕組み
認証チェックの流れ
リクエスト受信
クライアントからポイント取得リクエストを受信
認証情報確認
リクエストヘッダーから認証トークンを取得
トークン検証
トークンの有効性(署名、有効期限)を検証
顧客ID取得
トークンから認証された顧客のIDを取得
所有権検証
リクエスト対象の顧客IDと認証された顧客IDが一致するか確認
アクセス許可/拒否
全て合格なら処理続行、不合格ならエラーを返却
フロー図
認証フローの詳細
クライアント
GET /api/points(Authorization: Bearer xxx)
サーバー
トークン抽出 → 署名検証 → 有効期限チェック → 顧客ID取得 → 所有権検証
| 検証結果 | レスポンス |
|---|---|
| 認証成功 | 200 OK + ポイントデータ |
| 認証失敗 | 401/403エラーレスポンス |
認証成功
レスポンス200 OK + ポイントデータ
認証失敗
レスポンス401/403エラーレスポンス
対応している認証方式
セッショントークン認証
セッショントークン方式 - ログイン時
メールOTPでログイン
顧客がワンタイムパスワードで認証
トークン発行
サーバーがセッショントークンを発行
Cookie保存
トークンをHttpOnly Cookieに保存
| 特徴 | 詳細 |
|---|---|
| XSS攻撃耐性 | HttpOnlyで保護 |
| CSRF対策 | 別途対策が必要 |
| 自動ログアウト | Cookieの有効期限で実現 |
XSS攻撃耐性
詳細HttpOnlyで保護
CSRF対策
詳細別途対策が必要
自動ログアウト
詳細Cookieの有効期限で実現
Shopify Customer Account API連携
Shopify OAuth方式 - ログイン時
Shopifyアカウントでログイン
顧客がShopifyの認証画面で認証
OAuthトークン発行
ShopifyがOAuthトークンを発行
顧客情報取得可能
トークンで顧客情報にアクセス可能に
| 特徴 | 詳細 |
|---|---|
| 認証基盤 | Shopifyの認証基盤を活用 |
| パスワード管理 | Shopifyに委託 |
| SSO | 複数店舗でのSSO可能 |
認証基盤
詳細Shopifyの認証基盤を活用
パスワード管理
詳細Shopifyに委託
SSO
詳細複数店舗でのSSO可能
所有権検証の重要性
なぜ所有権を確認するのか
| ケース | 認証トークン | リクエスト対象 | 結果 |
|---|---|---|---|
| 正常 | 顧客Aのもの | 顧客Aのポイント | OK、ポイント返却 |
| 不正 | 顧客Aのもの | 顧客Bのポイント(不正) | 403 Forbidden |
正常
認証トークン顧客Aのもの
リクエスト対象顧客Aのポイント
結果OK、ポイント返却
不正
認証トークン顧客Aのもの
リクエスト対象顧客Bのポイント(不正)
結果403 Forbidden
重要: 認証されていても、他人のデータにはアクセスさせない
検証ロジック
所有権検証の流れ
入力情報の取得
認証トークンから顧客ID(A)、リクエストパラメータから対象顧客ID(X)を取得
ID一致チェック
A === X か確認
結果
一致 → ポイント残高を返却 / 不一致 → 403エラー、不正アクセスとしてログ記録
セキュリティ対策
実装している対策
| 対策 | 目的 | 実装内容 |
|---|---|---|
| レート制限 | DoS攻撃防止 | 同一IPから1分間に60回まで |
| トークン有効期限 | 漏洩時の被害軽減 | 7日間で失効 |
| ログ記録 | 不正検知・追跡 | 全アクセスをタイムスタンプ付きで記録 |
| エラーメッセージ制限 | 情報漏洩防止 | 詳細なエラー理由を返さない |
| HTTPS強制 | 通信傍受防止 | HTTP接続を拒否 |
レート制限
目的DoS攻撃防止
実装内容同一IPから1分間に60回まで
トークン有効期限
目的漏洩時の被害軽減
実装内容7日間で失効
ログ記録
目的不正検知・追跡
実装内容全アクセスをタイムスタンプ付きで記録
エラーメッセージ制限
目的情報漏洩防止
実装内容詳細なエラー理由を返さない
HTTPS強制
目的通信傍受防止
実装内容HTTP接続を拒否
エラーレスポンスの設計
運用者向け: 詳細は管理画面で確認可能
ログと監視
記録すべき情報
| 項目 | 記録内容 | 用途 |
|---|---|---|
| タイムスタンプ | リクエスト日時 | 時系列分析 |
| 顧客ID | 認証された顧客 | アクセス追跡 |
| IPアドレス | リクエスト元 | 不正検知 |
| 結果 | 成功/失敗 | 失敗率監視 |
| エラー種別 | 認証/認可/その他 | 原因分析 |
タイムスタンプ
記録内容リクエスト日時
用途時系列分析
顧客ID
記録内容認証された顧客
用途アクセス追跡
IPアドレス
記録内容リクエスト元
用途不正検知
結果
記録内容成功/失敗
用途失敗率監視
エラー種別
記録内容認証/認可/その他
用途原因分析
監視アラート
| 通知タイプ | 条件 |
|---|---|
| 即時通知 | 同一IPから短時間に大量のリクエスト |
| 即時通知 | 認証失敗が連続で発生 |
| 即時通知 | 他人のデータへのアクセス試行 |
| 日次レポート | 総アクセス数と失敗率 |
| 日次レポート | 認証方式ごとの利用状況 |
| 日次レポート | 異常なパターンの検出結果 |
即時通知
条件同一IPから短時間に大量のリクエスト
即時通知
条件認証失敗が連続で発生
即時通知
条件他人のデータへのアクセス試行
日次レポート
条件総アクセス数と失敗率
日次レポート
条件認証方式ごとの利用状況
日次レポート
条件異常なパターンの検出結果
この設計がもたらす効果
セキュリティ面
- 他人のポイントが見られない安全な設計
- 不正アクセスの検知と追跡が可能
- 攻撃に対する耐性の確保
運用面
- 問題発生時の原因特定が容易
- セキュリティ監査に対応可能
- 継続的な改善のためのデータ収集