UserDefaults、Keychain

Swiftにおけるデータの永続化(Persistence)にはさまざまな手法がありますが、代表的なものとして UserDefaultsKeychain があり、それぞれ用途と特徴が異なります。以下に詳細を解説します。


1. UserDefaults

概要

UserDefaults は、小規模なデータ(ユーザ設定やフラグなど)を簡単に永続化するためのクラスです。主にアプリの設定値や状態の保存に使用されます。

特徴

  • アプリのサンドボックス内にデータを保存

  • データはキーと値のペアで管理される(辞書型のような構造)

  • 永続的に保存されるが、セキュリティ保護はされない

  • 保存可能なデータ型:

    • String

    • Int

    • Float

    • Double

    • Bool

    • URL

    • ArrayDictionary(ただし、要素も保存可能な型である必要あり)

使用例

swift
// 保存 UserDefaults.standard.set(true, forKey: "hasLaunchedBefore") UserDefaults.standard.set("John", forKey: "username") // 読み込み let hasLaunched = UserDefaults.standard.bool(forKey: "hasLaunchedBefore") let username = UserDefaults.standard.string(forKey: "username")

注意点

  • 大量のデータや頻繁な書き換えには向いていない

  • 機密情報(パスワードなど)を保存してはいけない


2. Keychain

概要

Keychain は、パスワードやトークンなどの機密情報を安全に保存するための仕組みです。Appleが提供する暗号化されたデータ保存領域で、セキュリティが非常に高いのが特徴です。

特徴

  • データは自動的に暗号化され、セキュリティ的に保護される

  • Touch ID や Face ID と連携可能(Keychain Access Control)

  • ユーザーの明示的な操作なしにアプリ間共有も可能(App Groups)

  • 保存可能なデータは基本的に String または Data

使用にはライブラリの利用が一般的

Appleの公式APIは低レベルで扱いが難しいため、次のようなラッパーライブラリの使用が推奨されます:

  • KeychainAccess(Kishikawa Katsumi氏のSwiftラッパー)

  • Valet(Square社が提供)

使用例(KeychainAccessライブラリ)

swift
import KeychainAccess let keychain = Keychain(service: "com.example.MyApp") // 保存 try? keychain.set("secret_password", key: "password") // 読み込み let password = try? keychain.get("password")

注意点

  • 初期設定や導入にやや手間がかかる

  • 保存サイズに制限あり(1アイテムあたり約4KB程度)


適材適所の使い分け

用途 UserDefaults Keychain
ユーザ設定(ダークモードなど) ◎ 簡単に保存可能 × 過剰なセキュリティ
ログイン状態のフラグ × 一般情報には不要
パスワードやアクセストークン × セキュリティ不十分 ◎ セキュアに保存可能
デバイス認証と連携 × ◎ Face ID連携可能

まとめ

  • UserDefaults は、非機密情報の簡易保存に向いたAPI

  • Keychain は、セキュアな情報の保存に特化したAPI

  • 両者を使い分けることで、安全かつ効率的なデータ永続化が可能になります

生成日:2025/05/04