ログイン資格情報の管理
ログイン資格情報の保管方法
プラットフォームに応じてセキュアな方法でログイン資格情報(OIDCのトークンやセッションIDなど)を保管してください。
- Android: KeyStoreに保存した鍵で暗号化して、SharedPreferencesに保管する
- iOS: Keychainに保管する
ログイン資格情報のライフサイクル管理における注意点
AndroidならKeyStore、iOSならKeychainを利用することを前提に、ログイン資格情報のライフサイクル管理についていくつか注意点を紹介します。
Android (KeyStore)
KeyStoreに保存した鍵は、以下のような操作で消えてしまいます。鍵が取得できない場合はユーザに再度ログイン操作を要求する必要があります。
- アプリのアンインストール
- キー使用を承認するうえでユーザー認証を要求する場合は、承認内容に応じてキーが無効化されるタイミングは異なります。以下に概要を示しますが、詳細についてリンク先のドキュメントを確認してください。
- ユーザ認証に基づいて、一定期間、キーを使用することを承認する
- セキュアロック画面が無効化された場合や強制的にリセットされた場合
- ユーザ認証によって、キーと暗号処理の組み合わせを個別に承認する(指紋認証の場合のみ利用可能)
- 新しい指紋が登録された場合やすべての指紋の登録が抹消された場合
- ユーザ認証に基づいて、一定期間、キーを使用することを承認する
iOS (Keychain)
1. アプリをアンインストールしても消えない
Keychainの情報はアプリをアンインストールしても消えないため、特に何もしない場合は再インストール後も認証状態が引き継がれることになります。
インストール後に必ず認証が必要な場合は、UserDefaultsにフラグを設けてインストールされてからのログイン実績を管理するなどの実装が必要になります。
2. iCloudで同期される
Keychainに保存した情報は、iCloud同期により同じAppleIDでログインしている別の端末に同期されます。さらに、iCloud同期のタイミングは不定期のため、いつバックアップ/同期されるか分かりません。
一台でのみ利用されることが前提の情報を安易にKeychainに保管してしまうと、複数台で同時に利用されて予期しない不整合が発生してしまう可能性があります。例えば、アクセストークンやリフレッシュトークンを一度しか利用できないように制限している場合などが該当します。