[swift] Swift에서 키체인을 사용하여 로그인 재시도 제한하기

앱의 보안을 강화하기 위해 로그인 실패에 대한 제한을 설정하는 것은 중요합니다. 이때 키체인을 사용하면 안전한 방식으로 로그인 재시도 제한 기능을 구현할 수 있습니다.

키체인에 계정 정보 저장하기

로그인 시도에 대한 제한을 설정하기 위해서는 먼저 사용자의 계정 정보를 키체인에 저장해야 합니다. 이를 위해 Keychain 서비스를 사용할 수 있습니다.

import Security

func saveAccountToKeychain(username: String, password: String) {
    let query: [CFString: Any] = [
        kSecClass: kSecClassGenericPassword,
        kSecAttrAccount: username,
        kSecValueData: password.data(using: .utf8)!,
        kSecAttrAccessible: kSecAttrAccessibleWhenUnlocked
    ]
    
    let status = SecItemAdd(query as CFDictionary, nil)
    if status != errSecSuccess {
        print("Failed to save account to keychain")
    }
}

위의 예제 코드는 saveAccountToKeychain 함수를 정의합니다. 이 함수는 사용자의 계정 정보를 키체인에 저장합니다. kSecClassGenericPassword 클래스를 사용하고, 계정의 유저네임과 패스워드를 저장하며, kSecAttrAccessibleWhenUnlocked 옵션을 사용하여 잠금 상태가 아닐 때에만 접근할 수 있도록 설정합니다.

로그인 실패 횟수 체크

로그인 시도에 대한 제한을 설정하기 위해서는 사용자가 잘못된 패스워드로 로그인을 시도한 횟수를 체크해야 합니다. 이를 위해서는 앱 내에 로그인 실패 카운트를 저장하고, 키체인에 저장된 계정 정보를 기반으로 체크해야 합니다.

func checkLoginFailedCount(username: String) -> Int {
    var query: [CFString: Any] = [
        kSecClass: kSecClassGenericPassword,
        kSecAttrAccount: username,
        kSecReturnData: kCFBooleanTrue!,
        kSecMatchLimit: kSecMatchLimitOne
    ]

    var result: AnyObject?
    
    let status = SecItemCopyMatching(query as CFDictionary, &result)
    if status == errSecSuccess {
        if let passwordData = result as? Data, let password = String(data: passwordData, encoding: .utf8) {
            // 로그인 실패 횟수 체크 로직 추가
        }
    }
    
    return 0
}

위의 예제 코드는 checkLoginFailedCount 함수를 정의합니다. 이 함수는 특정 유저네임에 대한 로그인 실패 횟수를 체크합니다. 키체인에서 계정 정보를 가져온 후, 계정 정보에 저장된 패스워드를 이용하여 로그인 실패 횟수를 체크할 수 있습니다.

로그인 실패 횟수 제한

로그인 실패 횟수를 체크한 후에는 제한을 설정해야 합니다. 제한은 앱의 정책에 따라 다를 수 있습니다. 예를 들어, 특정 횟수 이상으로 로그인에 실패하면 지정된 시간 동안 로그인을 제한할 수 있습니다.

func isLoginLimited(username: String) -> Bool {
    let failedCount = checkLoginFailedCount(username: username)
    
    if failedCount >= 5 {
        // 로그인 제한 로직 추가
        return true
    } else {
        return false
    }
}

위의 예제 코드는 isLoginLimited 함수를 정의합니다. 이 함수는 특정 유저네임의 로그인 제한 상태를 체크합니다. 로그인 실패 횟수가 5회 이상인 경우 로그인을 제한하는 로직을 추가하면 됩니다.

결론

Swift에서 키체인을 사용하여 로그인 재시도 제한 기능을 구현하는 방법에 대해 알아보았습니다. 키체인을 사용하면 보안성이 높은 방식으로 사용자의 계정 정보를 저장하고, 로그인 제한을 설정할 수 있습니다.