0Pricing
Swift Academy · 강의

키체인 접근 제어

생체 인증과 기기 잠금 해제 뒤에 항목을 보호합니다.

키체인 접근 제어은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

비밀을 읽을 수 있는 시점 제어하기

비밀을 저장하는 것은 작업의 절반에 불과합니다. 비밀을 언제 읽을 수 있는지도 제어해야 합니다. 키체인은 접근성 클래스와 접근 제어 플래그를 제공하여 기기 잠금 해제, 암호 또는 생체 인식을 거쳐야만 항목에 접근할 수 있도록 제한합니다. 이를 통해 기기를 분실했을 때 데이터를 보호할 수 있습니다.

import Security
// Two layers of control:
//   kSecAttrAccessible  -> when readable (lock state)
//   SecAccessControl    -> user presence / biometrics

kSecAttrAccessible 키

kSecAttrAccessible은 항목을 추가할 때 접근성 클래스를 설정합니다. 항목을 항상 사용할 수 있는지, 최초 잠금 해제 후에만 사용할 수 있는지, 기기가 잠금 해제된 동안에만 사용할 수 있는지를 결정합니다. 기능이 허용하는 범위에서 가장 엄격한 수준을 선택하십시오.

import Security
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "user",
    kSecValueData as String: Data("secret".utf8),
    kSecAttrAccessible as String:
        kSecAttrAccessibleWhenUnlocked
]
_ = query

WhenUnlocked

kSecAttrAccessibleWhenUnlocked는 기기가 잠금 해제된 동안에만 항목을 읽을 수 있도록 합니다. 기기가 잠긴 상태에서 실행되는 백그라운드 작업은 항목에 접근할 수 없습니다. 대부분의 세션 토큰에 적합한 기본값입니다.

import Security
// Readable only while unlocked; blocked when locked.
let level = kSecAttrAccessibleWhenUnlocked
_ = level

AfterFirstUnlock

kSecAttrAccessibleAfterFirstUnlock은 부팅 후 처음 잠금 해제한 시점부터 다음 재부팅 전까지 항목을 읽을 수 있도록 합니다. 이후 기기가 다시 잠겨도 읽을 수 있습니다. 푸시 처리에 필요한 토큰처럼 백그라운드 프로세스가 사용해야 하는 비밀에 사용하십시오.

import Security
// Available after the first unlock post-boot,
// including while subsequently locked.
let level = kSecAttrAccessibleAfterFirstUnlock
_ = level

ThisDeviceOnly 변형

각 접근성 클래스에는 ...ThisDeviceOnly 형식이 있습니다. 이러한 항목은 암호화된 백업에서 제외되며 새 기기로 절대 이전되지 않습니다. 이 하드웨어를 절대 벗어나서는 안 되는 키에 사용하십시오.

import Security
// Never backed up, never migrated:
let local = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
_ = local

암호가 설정된 경우

kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly는 사용자가 암호를 설정한 경우에만 항목을 저장하고, 암호를 제거하면 항목을 삭제합니다. 비밀이 항상 암호로 보호되도록 보장합니다.

import Security
let level =
    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
// Item vanishes if the user disables their passcode.
_ = level

사용자 인증을 위한 SecAccessControl

잠금 상태 외에도 SecAccessControlCreateWithFlags는 읽을 때 생체 인식 또는 암호를 통한 적극적인 사용자 인증을 요구하는 정책을 만듭니다. 이 정책은 접근성 키 대신 또는 접근성 키와 함께 kSecAttrAccessControl을 통해 연결합니다.

import Security
func makeControl() -> SecAccessControl? {
    return SecAccessControlCreateWithFlags(
        nil,
        kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
        .userPresence,
        nil)
}

접근 제어 플래그

플래그는 요구 사항을 구체화합니다. .userPresence는 생체 인식 또는 암호 대체를 허용하고, .biometryCurrentSet은 등록된 지문이나 얼굴이 변경되면 항목을 무효화하며, .devicePasscode는 암호 입력을 강제합니다. 보안 요구 사항을 표현하도록 조합하십시오.

import Security
// .userPresence        -> biometric OR passcode
// .biometryAny         -> any enrolled biometric
// .biometryCurrentSet  -> invalidate on biometric change
// .devicePasscode      -> passcode only
let flags: SecAccessControlCreateFlags = [.userPresence]
_ = flags

보호된 항목 추가하기

생체 인식으로 접근을 제한하는 비밀을 저장하려면 SecAccessControl 객체를 kSecAttrAccessControl 아래에 넣습니다. 이후 읽기에서는 데이터가 반환되기 전에 사용자에게 인증을 요청합니다.

import Security
func saveProtected(_ data: Data, account: String,
                   control: SecAccessControl) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecValueData as String: data,
        kSecAttrAccessControl as String: control]
    return SecItemAdd(query as CFDictionary, nil)
        == errSecSuccess
}

읽을 때 사용자에게 인증 요청하기

보호된 항목을 읽으면 인증 사용자 인터페이스가 자동으로 표시됩니다. kSecUseOperationPrompt를 통해 이유 문자열을 제공하면 접근이 필요한 이유를 인증 화면에 설명할 수 있습니다. 읽기 작업은 사용자가 인증하거나 취소할 때까지 대기합니다.

import Security
func readProtected(account: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecReturnData as String: true,
        kSecUseOperationPrompt as String:
            String(localized: "Unlock your saved key")]
    var out: CFTypeRef?
    return SecItemCopyMatching(query as CFDictionary,
        &out) == errSecSuccess ? out as? Data : nil
}

올바른 수준 선택하기

위험도에 맞게 정책을 선택하십시오:

  • 백그라운드에서 사용하는 세션 토큰: AfterFirstUnlock.
  • 사용자 인터페이스에서만 사용하는 토큰: WhenUnlocked.
  • 중요도가 높은 비밀: .userPresence와 ThisDeviceOnly 클래스를 사용하는 SecAccessControl.

더 엄격할수록 안전하지만 백그라운드 접근이 중단되므로 두 요소의 균형을 맞추십시오.

import Security
// High-value: biometric-gated, device-bound, no backup
let control = SecAccessControlCreateWithFlags(
    nil,
    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
    .userPresence, nil)
_ = control

빠른 확인

백그라운드에서 사용해야 하는 비밀에 적합한 접근성 클래스를 떠올려 보십시오.

복습

키체인 항목에 접근 제한을 설정하는 방법을 배웠습니다:

  • kSecAttrAccessible은 잠금 상태에 따른 사용 가능 여부를 설정합니다. WhenUnlocked, AfterFirstUnlock 및 백업을 건너뛰는 ...ThisDeviceOnly 변형이 있습니다.
  • WhenPasscodeSetThisDeviceOnly는 항목을 암호가 설정된 상태에 연결합니다.
  • .userPresence 또는 .biometryCurrentSet과 같은 플래그를 사용하는 SecAccessControl은 읽을 때 인증을 요구합니다.
  • 사용 패턴을 허용하면서도 가장 엄격한 수준을 선택하십시오.

자주 묻는 질문

“키체인 접근 제어” 강의는 무료인가요?

네 — “키체인 접근 제어” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“키체인 접근 제어”에서 뭘 배우나요?

생체 인증과 기기 잠금 해제 뒤에 항목을 보호합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“키체인 접근 제어” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 키체인에 비밀 정보 저장하기
  2. 키체인 접근 제어
  3. 생체 인증
  4. 데이터 보호 및 암호화
← Swift Academy(으)로 돌아가기