iOS UserDefaults로 구현하는 로그인/회원가입

호씨·2024년 12월 17일
0

iOS UserDefaults로 구현하는 로그인/회원가입 🔐

UserDefaults란?

UserDefaults는 iOS 앱에서 간단한 데이터를 영구적으로 저장할 수 있는 인터페이스로 값 쌍으로 데이터를 저장하며, 앱이 종료되어도 데이터가 유지한다.

⚠️ 주의: 실제 앱에서는 보안을 위해 민감한 정보(비밀번호 등)의 저장에 Keychain을 사용해야 한다.

1. UserDefaultsManager 구현

UserDefaults를 관리할 매니저 클래스를 생성한다:

import Foundation

class UserDefaultsManager {
    // 싱글톤 인스턴스
    static let shared = UserDefaultsManager()
    private let defaults = UserDefaults.standard
    
    // Keys
    private enum Keys {
        static let isLoggedIn = "isLoggedIn"
        static let userEmail = "userEmail"
        static let userPassword = "userPassword" // 실제 앱에서는 암호를 UserDefaults에 저장하면 안됨
    }
    
    // 로그인 상태 저장
    var isLoggedIn: Bool {
        get {
            return defaults.bool(forKey: Keys.isLoggedIn)
        }
        set {
            defaults.set(newValue, forKey: Keys.isLoggedIn)
        }
    }
    
    // 사용자 정보 저장
    func saveUserCredentials(email: String, password: String) {
        defaults.set(email, forKey: Keys.userEmail)
        defaults.set(password, forKey: Keys.userPassword)
        isLoggedIn = true
    }
    
    // 로그아웃
    func logout() {
        isLoggedIn = false
        defaults.removeObject(forKey: Keys.userEmail)
        defaults.removeObject(forKey: Keys.userPassword)
    }
}

2. 회원가입 구현 (SignUpView)

회원가입 화면에서 사용자 정보를 입력받고 저장하는 기능을 구현한다:

class SignUpView: UIViewController {
    private let userDefaults = UserDefaultsManager.shared
    
    @objc private func createAccountButtonTapped() {
        guard let fullName = fullNameTextField.text, !fullName.isEmpty,
              let email = emailTextField.text, !email.isEmpty,
              let password = passwordTextField.text, !password.isEmpty else {
            let alert = UIAlertController(
                title: "에러",
                message: "모든 필드를 입력해주세요.",
                preferredStyle: .alert
            )
            alert.addAction(UIAlertAction(title: "확인", style: .default))
            present(alert, animated: true)
            return
        }
        
        // UserDefaults에 저장
        userDefaults.saveUserCredentials(email: email, password: password)
        
        // 성공 알림 후 로그인 화면으로 이동
        let alert = UIAlertController(
            title: "성공",
            message: "회원가입이 완료되었습니다.",
            preferredStyle: .alert
        )
        alert.addAction(UIAlertAction(title: "확인", style: .default) { _ in
            self.navigationController?.popViewController(animated: true)
        })
        present(alert, animated: true)
    }
}

3. 로그인 구현 (LoginView)

저장된 사용자 정보를 확인하여 로그인을 처리한다:

class LoginView: UIViewController {
    private let userDefaults = UserDefaultsManager.shared
    
    @objc private func loginButtonTapped() {
        guard let email = emailTextField.text, !email.isEmpty,
              let password = passwordTextField.text, !password.isEmpty else {
            let alert = UIAlertController(
                title: "에러",
                message: "이메일과 비밀번호를 입력해주세요.",
                preferredStyle: .alert
            )
            alert.addAction(UIAlertAction(title: "확인", style: .default))
            present(alert, animated: true)
            return
        }
        
        let savedEmail = UserDefaults.standard.string(forKey: "userEmail")
        let savedPassword = UserDefaults.standard.string(forKey: "userPassword")
        
        if email == savedEmail && password == savedPassword {
            userDefaults.saveUserCredentials(email: email, password: password)
            // 로그인 성공 시 메인 화면으로 이동
            let mainVC = ViewController()
            navigationController?.setViewControllers([mainVC], animated: true)
        } else {
            let alert = UIAlertController(
                title: "로그인 실패",
                message: "이메일 또는 비밀번호가 일치하지 않습니다.",
                preferredStyle: .alert
            )
            alert.addAction(UIAlertAction(title: "확인", style: .default))
            present(alert, animated: true)
        }
    }
}

4. 자동 로그인 구현 (SceneDelegate)

앱 실행 시 로그인 상태를 확인하여 적절한 화면으로 이동한다:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession...) {
    guard let windowScene = (scene as? UIWindowScene) else { return }
    let window = UIWindow(windowScene: windowScene)
    
    // 로그인 상태 확인
    if UserDefaultsManager.shared.isLoggedIn {
        // 이미 로그인된 상태면 메인 화면으로
        let mainVC = ViewController()
        window.rootViewController = UINavigationController(rootViewController: mainVC)
    } else {
        // 로그인이 필요한 상태면 로그인 화면으로
        let loginVC = LoginView()
        window.rootViewController = UINavigationController(rootViewController: loginVC)
    }
    
    self.window = window
    window.makeKeyAndVisible()
}

⚠️ 주의사항

  1. UserDefaults는 민감한 정보(비밀번호 등) 저장에 부적합
  2. 실제 앱에서는 Keychain 사용 권장
  3. 로그인 인증은 서버 통신을 통해 처리해야 함

정리

  • UserDefaults는 간단한 데이터 저장에 적합
  • 실제 앱 개발 시 보안을 고려한 적절한 인증 방식 선택 필요
  • 자동 로그인, 사용자 설정 등의 기능 구현에 활용 가능
profile
이것저것 많이 해보고싶은 사람

0개의 댓글