はじめに
アプリ開発で大切な3つの原則をご存知ですか?
- 機密性(Confidentiality):大切な情報を守る
- 完全性(Integrity):データを正しく保つ
- 可用性(Availability):いつでも使えるようにする
これらは「CIAトライアド」と呼ばれる基本原則で、Appleの公式ガイドラインでも重要視されています。
今日は、この3つを誰でも分かるように解説します。
1. 機密性:大切な情報を守る
例えばこんなとき...
- ユーザーのパスワードを保存したい
- クレジットカード情報を扱いたい
- 個人情報を保存したい
よくある間違い vs 正しい方法
// ❌ 危険な方法
class UserManager {
// メモ帳(UserDefaults)に保存
func savePassword(_ password: String) {
UserDefaults.standard.set(password, forKey: "password")
print("保存したパスワード: \(password)") // ログにパスワードが出る!
}
}
// ⭕️ 安全な方法(Appleガイドライン推奨)
class SecureManager {
// 金庫(Keychain)に保存
func savePassword(_ password: String) {
let keychain = KeychainWrapper.standard
keychain.set(password, forKey: "password")
print("パスワードを安全に保存しました") // 安全なログ
}
}
なぜ重要?
- 個人情報が漏れると大問題
- アプリの信頼性が失われる
- 法律違反になることも
参考:Apple Security Guidelines - Keychain Services
2. 完全性:データを正しく保つ
例えばこんなとき...
- ユーザープロフィールを保存する
- 入力フォームのチェック
- データベースの更新
よくある間違い vs 正しい方法
// ❌ 危険な方法
struct UserProfile {
var name: String // 空でもOK?
var age: Int // マイナスでもOK?
var email: String // メール形式じゃなくてもOK?
}
// ⭕️ 安全な方法(Appleガイドライン推奨)
struct UserProfile {
let name: String
let age: Int
let email: String
init?(name: String, age: Int, email: String) {
// 名前のチェック
guard name.count >= 1 && name.count <= 50 else {
return nil
}
// 年齢のチェック(WHOの統計に基づく)
guard age >= 0 && age <= 123 else {
return nil
}
// メールアドレスのチェック
guard email.contains("@") && email.contains(".") else {
return nil
}
self.name = name
self.age = age
self.email = email
}
}
なぜ重要?
- おかしなデータがあるとアプリが壊れる
- 後から直すのが大変
- ユーザーが困る
参考:Apple Developer Documentation - Data Validation
3. 可用性:いつでも使えるように
例えばこんなとき...
- 写真をたくさん表示したい
- 通信が切れた
- メモリ不足になりそう
よくある間違い vs 正しい方法
// ❌ 危険な方法
class ImageViewer {
var images: [UIImage] = [] // メモリをどんどん使う
func addImage(_ image: UIImage) {
images.append(image) // 制限なし!
}
}
// ⭕️ 安全な方法(Appleガイドライン推奨)
class ImageViewer {
// メモリ使用量を制限
private let imageCache = NSCache<NSString, UIImage>()
init() {
// デバイスのメモリに応じて制限(Apple推奨)
imageCache.countLimit = 50
// メモリ警告時の対応
NotificationCenter.default.addObserver(
forName: UIApplication.didReceiveMemoryWarningNotification,
object: nil
) { [weak self] _ in
self?.imageCache.removeAllObjects()
}
}
func addImage(_ image: UIImage, key: String) {
imageCache.setObject(image, forKey: key as NSString)
}
}
なぜ重要?
- アプリが突然終了するのを防げる
- サクサク動作する
- バッテリーの消費も抑えられる
参考:Apple Developer Documentation - Memory Management
この3つの関係
たとえば、銀行のアプリを考えてみましょう:
-
機密性
- 残高は他人に見られない
- パスワードは安全に保存
- 通信は暗号化
-
完全性
- 送金額は正しい
- 取引履歴は改ざんされない
- 計算間違いがない
-
可用性
- いつでも送金できる
- 通信エラーでも再試行
- アプリが落ちない
実践:テストで確認しよう
QualityForwardを使って、以下をチェックします:
-
機密性のテスト
- パスワードは金庫(Keychain)に保存されている?
- 重要な情報がログに出ていない?
- 個人情報は適切に保護されている?
-
完全性のテスト
- データのチェックは適切?
- 保存したデータは正しく読める?
- エラー処理は適切?
-
可用性のテスト
- メモリ使用量は適切?
- 通信エラーに対応できている?
- バックグラウンドでも正しく動く?
まとめ:これだけは覚えよう!
-
機密性
- 重要な情報は必ず「金庫」に
- ログに気をつける
- 個人情報を大切に
-
完全性
- データは必ずチェック
- 保存時は慎重に
- エラー処理を忘れずに
-
可用性
- メモリの使用量を意識
- エラーへの対応を考える
- 性能を確認する
おわりに
この3つの原則は、Appleも公式ドキュメントで重視している基本中の基本です。
最初は難しく感じるかもしれませんが、この3つを意識するだけでもアプリの品質は大きく変わります!