GitHub 저장소
GitHub에서 소스 코드와 예제를 확인하세요
pub.dev 패키지
didit_sdk
네이티브 SDK: Flutter 앱에 권장되는 방식입니다. SDK는 플랫폼 채널을 통해 네이티브 iOS 및 Android SDK를 감싸며, 최상의 사용자 경험, 최적화된 카메라 처리, NFC를 완전히 지원합니다.
요구 사항
플랫폼 요구 사항
생체 인식 동의에는 네이티브 4.10.0 이상이 필요합니다. 일리노이주, 텍사스주 또는 콜로라도주 법률이 적용되는 사용자의 경우, Didit은 첫 얼굴 촬영 전에 명시적인 생체 인식 동의를 요청할 수 있습니다. iOS 및 Android 네이티브 SDK 4.10.0 이상을 고정하는 Flutter SDK 릴리스에서는 이 단계가 표시됩니다. 이전 버전에서는 이 단계를 표시할 수 없습니다. 해당 세션은 이전과 같이 실행되며, 결정 결과에는 동의가 수집되지 않은 것으로 보고됩니다(
biometric_consent.reason: "BIOMETRIC_CONSENT_UNSUPPORTED_SDK"). 해당 주에서 사용자를 인증하는 경우 업그레이드하십시오.설치
pubspec.yaml에 직접 추가할 수도 있습니다:
네이티브 SDK 변형
didit_sdk에는 전체 네이티브 SDK가 포함되어 있습니다.
바이너리 크기를 줄이려면 대신 변형 패키지에 의존하십시오. 변형 패키지도 동일한 Dart API를 제공하며, 두 플랫폼 모두에서 일치하는 네이티브 SDK 버전을 고정합니다:
package:didit_sdk_core/sdk_flutter.dart처럼 작성합니다.
iOS 설정
이 플러그인은 Flutter의 두 가지 iOS 종속성 관리자인 Swift Package Manager와 CocoaPods를 모두 지원합니다.Swift Package Manager
Flutter 버전에서 Swift Package Manager 지원이 활성화되어 있으면(Flutter 3.24+에서flutter config --enable-swift-package-manager로 옵트인), 플러그인은 자동으로 Swift 패키지로 사용됩니다.
Podfile 설정은 필요하지 않습니다. 네이티브 DiditSDK 종속성은 GitHub에서 자체적으로 해결됩니다.
Xcode에서 앱의 iOS 배포 대상(Runner 타깃 및 프로젝트)을 선택한 패키지의 최소 버전으로 설정하십시오. didit_sdk와 didit_sdk_nfc는 15.0, didit_sdk_core와 didit_sdk_autodetection은 13.0입니다.
CocoaPods
didit_sdk를 사용하면 플러그인은 앱의 ios/Podfile에서 설정하는 Ruby 전역 변수 $DiditSdkIosVariant로 네이티브 iOS SDK 변형을 선택합니다. DiditSDK pod는 CocoaPods trunk에 등록되어 있지 않습니다:
didit_sdk_core, didit_sdk_autodetection, didit_sdk_nfc)를 사용하는 경우, 해당 패키지는 네이티브 서브스펙을 직접 고정하고 $DiditSdkIosVariant는 무시합니다. Podfile의 pod 줄과 배포 대상은 해당 변형에 맞게 유지하십시오. 예를 들어 platform :ios, '13.0'과 함께 pod 'DiditSDK/Core', :podspec => ...를 사용합니다.
all 및 nfc 변형은 배포 대상이 iOS 15.0+여야 하며, core 및 autodetection은 iOS 13.0을 대상으로 할 수 있습니다. 변형을 전환할 때는 이전 SDK 변형이 재사용되지 않도록 먼저 CocoaPods를 정리하십시오(rm -rf Pods Podfile.lock).Android 설정
기본적으로 이 플러그인은 NFC를 포함한 전체 Android SDK에 의존합니다. NFC 없이 빌드하려면android/gradle.properties에 다음을 추가하십시오:
me.didit:didit-sdk에서 me.didit:didit-sdk-core로 바뀌며, NFC 리더 모듈과 JMRTD/SCUBA/BouncyCastle 종속성이 제거됩니다.
NFC가 활성화된 경우(기본값), BouncyCastle에서 발생하는 중복 메타데이터 파일을 해결하려면 android/app/build.gradle.kts에 다음 패키징 규칙을 추가하십시오:
mergeDebugJavaResource 오류와 함께 실패합니다. diditSdkAndroidNfcEnabled=false인 경우에는 이 규칙이 필요하지 않습니다.
Android 네이티브 SDK는 원격 GitHub Maven 저장소에서 해결됩니다(플러그인 3.4.0부터). 앱에서 별도의 Maven 설정은 필요하지 않습니다.
Permissions
iOS
앱의Info.plist에 다음 키를 추가하십시오:
NFC 설정
칩이 있는 여권 및 신분증의 NFC 읽기를 활성화하려면 다음을 수행하십시오:-
Xcode에서 NFC 기능을 추가합니다:
- 대상을 선택한 후 Signing & Capabilities > + Capability > Near Field Communication Tag Reading을 선택합니다.
-
Info.plist에 ISO7816 식별자를 추가합니다:
D392F000260100000001을 설정하면 SDK가 JPKI를 통해 일본 마이넘버 카드를 읽을 수 있습니다. 이 식별자가 없으면 iOS가 해당 카드를 SDK에 전달하지 않습니다. 마이넘버 카드 읽기 기능은 아직 프로덕션에서 활성화되어 있지 않으며, 이 식별자는 다른 문서에는 영향을 주지 않으므로 지금 추가해도 됩니다.
- NFC 태그 읽기가 활성화된 entitlement 파일을 추가합니다:
com.apple.developer.nfc.readersession.formats 권한이 없다는 이유로 서명에 실패합니다.
이 NFC 설정은 core 또는 autodetection 변형($DiditSdkIosVariant)이나 didit_sdk_core / didit_sdk_autodetection 패키지에는 필요하지 않습니다. 이들은 모두 칩을 읽지 않기 때문입니다.
Android
다음 권한은 SDK의AndroidManifest.xml에 선언되어 있으며 자동으로 병합됩니다:
카메라 및 NFC 하드웨어 기능은 선택 사항(
android:required="false")으로 선언되어 있으므로, 이러한 기능이 없는 기기에도 앱을 설치할 수 있습니다. diditSdkAndroidNfcEnabled=false로 설정하면 SDK는 Android NFC 권한과 기능을 추가하지 않습니다.
런타임 권한
SDK는 Android 런타임 권한 요청을 자동으로 처리합니다. 사용자가 카메라 액세스가 필요한 단계에 도달하면 다음과 같이 동작합니다:- 카메라 권한이 아직 부여되지 않은 경우 SDK가 권한을 요청합니다.
- 사용자가 권한을 거부하면 다시 시도 버튼이 있는 오류 메시지가 표시됩니다.
- 사용자가 권한을 허용하면 인증 흐름이 계속 진행됩니다.
startVerification()을 호출하기 전에 앱 코드에서 카메라 권한을 따로 요청할 필요가 없습니다. SDK가 이를 내부적으로 관리합니다.
빠른 시작
통합 방식
SDK는 두 가지 통합 방식을 지원합니다:방법 1: 세션 토큰(프로덕션 권장)
백엔드에서 인증 세션 생성 API를 사용해 세션을 생성한 다음, 토큰을 SDK에 전달합니다:- 세션을 사용자와 연결(
vendor_data) - 사용자 지정 메타데이터 설정
- 세션별 콜백 구성
방법 2: 워크플로 ID(간편한 통합)
간단한 통합의 경우 SDK가 워크플로 ID를 사용해 세션을 직접 생성할 수 있으며, 이때 백엔드가 필요하지 않습니다:고급 세션 파라미터(
contact_details, expected_details, metadata)는 세션 토큰 방식에서만 지원됩니다. 이 방식에서는 백엔드가 세션 생성 API를 모든 파라미터와 함께 호출합니다. 반환된 session_token을 DiditSdk.startVerification()에 전달하십시오.구성
DiditConfig 객체를 전달하여 SDK 동작을 맞춤 설정합니다:
startVerificationWithWorkflow의 경우 config를 명명된 파라미터로 전달합니다:
구성 옵션
카메라 옵션
카메라 옵션은 웹 SDK 카메라 옵션과 일치합니다. 각 렌즈는CameraLens.front 또는 CameraLens.back입니다.
기기에 요청한 렌즈가 없으면 SDK는 기기가 가진 첫 번째 카메라를 사용합니다.
카메라 전환 버튼은 카메라가 하나뿐인 기기에서도 숨겨집니다.
전환 버튼 옵션을 false로 설정하면 해당 단계의 기본 렌즈로 사용자를 고정합니다.
테마 및 색상: 색상, 배경, 인트로 화면 설정은 SDK 구성이 아니라 Didit Console의 화이트 라벨 설정에서 구성합니다. 이렇게 하면 모든 플랫폼에서 브랜딩이 일관되게 유지됩니다.
언어 지원
SDK는 54개 언어를 지원합니다. 언어를 지정하지 않으면 SDK는 기기 로캘을 사용하고, 대체 언어로 영어를 사용합니다.고급 세션 파라미터
contact_details, expected_details, metadata 같은 파라미터는 세션 토큰 방식에서만 지원됩니다. 백엔드에서 모든 파라미터를 지원하는 POST /v3/session/을 호출한 다음, 반환된 session_token을 SDK에 전달합니다.
Dart의
startVerificationWithWorkflow 메서드는 workflowId, vendorData, config만 허용합니다. 3.4.0 이전 버전에서는 contactDetails, expectedDetails, metadata 파라미터를 제공했지만, Unilink endpoint가 이 값들을 지원하지 않기 때문에 제거되었습니다.결과 처리
startVerification과 startVerificationWithWorkflow는 모두 Future<VerificationResult>를 반환합니다. 결과는 sealed 클래스이며, 패턴 매칭을 사용하여 결과를 판단합니다.
결과 케이스
SessionData 속성
오류 유형
VerificationErrorType 열거형은 다음 케이스를 제공합니다:
연결 끊김
인증 도중 기기의 연결이 끊어지면, SDK는 단계가 계속 로딩 상태로 남지 않도록 “인터넷 연결이 없습니다” 화면을 표시합니다. SDK는 백그라운드에서 계속 확인하고, Didit에 다시 연결할 수 있게 되면 화면을 스스로 닫습니다. 사용자는 중단되었던 단계에서 이어서 진행합니다. 이 화면에는 다시 시도 버튼이 있으며, 닫기 버튼을 끄지 않았다면 인증 종료 버튼도 표시됩니다. 종료하면 오류 유형이networkError인 VerificationFailed 결과로 인증이 끝나므로, 앱은 사용자가 연결 문제로 떠났음을 알 수 있습니다.
전체 결과 처리 예제
엔드 투 엔드 예제 (백엔드 세션 → Flutter SDK → webhook)
프로덕션에 적용할 수 있는 연동 방식입니다. 백엔드가 세션을 생성하고, Flutter 앱이session_token을 받아 SDK로 흐름을 실행합니다. 최종 결정은 webhook을 통해 백엔드로 전달됩니다. 클라이언트 측 결과만으로는 절대 신뢰하지 마세요.