무료
개발, 테스트 및 초기 사용자 확보에 적합합니다.
- 매월 500건의 전체 KYC 인증
- 신분증, 라이브니스, 얼굴 매칭, 기기 및 IP 확인
- 200개 이상의 사기 신호, 차단 목록, 중복 확인
- Didit 네트워크 전반에서 KYC 재사용 가능
- 워크플로우 빌더, 케이스 관리, SDK
- AI 지원 콘솔 내 AI 에이전트, 문서, 커뮤니티.
전 세계 3,000개 이상의 기관에서 신뢰합니다.
EUDI 지갑이란
EUDI 지갑은 eIDAS 2로 알려진 규정 (EU) 2024/1183에 따라 모든 EU 회원국이 제공해야 하는 무료 앱입니다. 이름, 생년월일, 출생지, 국적 등 개인 식별 데이터(PID)와 운전면허증 또는 학위와 같은 속성 증명서를 담고 있습니다. 사용은 자율적입니다.
기업이 데이터를 요청하면, 사용자는 요청하는 주체를 확인하고 요청된 속성만 공유합니다. 이를 선택적 공개라고 합니다. 예를 들어, 웹사이트는 생년월일을 알지 못해도 사용자가 18세 이상임을 확인할 수 있습니다. 이 지갑은 eIDAS 세 가지 레벨 중 가장 강력한 '높음' 수준의 보증 레벨로 작동하며, 기업은 데이터를 신뢰하기 전에 발행자 서명을 확인합니다.
최종 검토: 2026년 10월 5일. 법적 자문이 아닙니다.
2024년 4월 30일
eIDAS 규정 (EU) No 910/2014를 개정하는 규정 (EU) 2024/1183이 EU 공식 저널에 게재됩니다. 게재 후 20일째 되는 날 발효됩니다.
2024년 12월 24일
지갑에 대한 첫 5개 이행 규정(개인 식별 데이터, 핵심 기능, 알림, 인증, 프로토콜 및 인터페이스)이 발효됩니다. 이는 아래 24개월 및 36개월 시한의 시작점이 됩니다.
2026년 7월 15일
위원회는 이행 규정 (EU) 2026/1731을 채택합니다. 이는 두 가지 자격 증명 형식(SD-JWT VC 및 ISO/IEC mdoc)을 설정하고, 2028년부터 의무적인 초상화를 도입할 예정입니다.
2026년 7월 23일
지갑 및 의존 당사자가 구축하는 기술 청사진인 아키텍처 및 참조 프레임워크(ARF)가 버전 3.0.0에 도달합니다.
2026년 12월 24일
각 회원국은 최소 하나의 EUDI 지갑을 제공해야 합니다. 의존 당사자 등록에 관한 규정 (EU) 2025/848은 같은 날부터 적용됩니다.
2027년 12월 24일
법률 또는 계약에 따라 강력한 사용자 인증을 사용해야 하는 민간 기업(초소규모 및 소규모 기업 제외)은 사용자가 지갑 사용을 요청할 경우 이를 수용해야 합니다(제5f조(2)항). 이 기한은 최초 이행법이 2024년 12월 24일에 발효된 날로부터 36개월 후, 즉 2027년 12월 24일입니다.
2028년 8월 11일
초상화가 의무적인 개인 식별 데이터의 일부가 되며, 지갑은 각 의존 당사자의 등록 증명서를 인증하고 유효성을 검사해야 합니다.
대상
공공 부문 기관
간단히 설명하자면
회원국이 공공 온라인 서비스 접근에 전자 신분증을 요구하는 경우, 해당 서비스는 EUDI 지갑도 수용해야 합니다.
조항 · 날짜
제5f조(1)항
대상
강력한 사용자 인증을 의무적으로 사용하는 민간 서비스
간단히 설명하자면
법률 또는 계약에 따라 온라인 신원 확인을 위해 강력한 사용자 인증을 사용해야 하는 경우, EUDI 지갑도 수용해야 합니다. 이는 귀하의 업종이 아닌 해당 요구사항에 따라 결정됩니다.
조항 · 날짜
제5f조(2)항 · 2027년 12월 24일
대상
조항에 명시된 분야
간단히 설명하자면
운송, 에너지, 은행, 금융 서비스, 사회 보장, 보건, 식수, 우편 서비스, 디지털 인프라, 교육 및 통신. 이 조항은 “포함”이라고 명시하고 있으므로, 목록은 예시이며 한정적이지 않습니다.
조항 · 날짜
제5f조(2)항
대상
초소규모 및 소규모 기업
간단히 설명하자면
위원회 권고 2003/361/EC에 정의된 바와 같이 민간 부문 의무에서 면제됩니다. 원할 경우 Wallet을 계속 수용할 수 있습니다.
조항 · 날짜
제5f조(2)항
대상
사용자 요청 시에만
간단히 설명하자면
사용자가 Wallet 사용을 요청할 때 수용해야 합니다. Wallet 사용은 개인에게 자발적이며, 서비스는 다른 신원 확인 및 인증 수단에도 개방되어야 합니다.
조항 · 날짜
제5f조(2)항, 제5a조(15)항
대상
초대형 온라인 플랫폼
간단히 설명하자면
디지털 서비스법에 따라 지정된 플랫폼 중 사용자 인증을 요구하는 경우, 서비스에 필요한 최소한의 데이터에 대해 사용자 요청 시 Wallet을 수용해야 합니다. 이 의무에 대한 별도의 날짜는 명시되어 있지 않습니다.
조항 · 날짜
제5f조(3)항
의존 당사자는 설립된 회원국에 등록해야 하며, 등록된 데이터만 요청할 수 있습니다 (제5b조). 최종 검토: 2026년 10월 5일. 법률 자문이 아닙니다.
귀하의 세부 정보와 요청하려는 데이터를 가지고 설립된 회원국에 등록하십시오. Wallet에 귀하를 인증하는 접근 인증서와, 회원국에서 발급하는 경우, 등록된 속성을 나열하는 등록 인증서를 받게 됩니다.
EUDI 지갑 수용이 시작되면 (출시 예정) Didit이 이 단계를 대신 처리해 드립니다.
실사 필요 사항
모든 이름 및 성
AMLR Art. 22(1)(a)
EUDI Wallet PID에 포함된 내용
성 및 이름 (필수)
Didit이 오늘날 다루는 방법
실시간 국가 eID는 전체 이름을 반환합니다. 문서 경로는 14,000개 이상의 문서 유형에서 이름을 읽어옵니다.
실사 필요 사항
출생지 및 전체 생년월일
AMLR Art. 22(1)(a)
EUDI Wallet PID에 포함된 내용
생년월일 및 출생지 (필수)
Didit이 오늘날 다루는 방법
실시간 국가 eID는 생년월일을 반환합니다. 문서 경로는 문서에 인쇄된 출생지를 읽어옵니다.
실사 필요 사항
국적
AMLR Art. 22(1)(a)
EUDI Wallet PID에 포함된 내용
국적 (필수, 하나 이상의 국가)
Didit이 오늘날 다루는 방법
문서 경로는 신분증 또는 칩에서 국적을 읽어옵니다.
실사 필요 사항
해당하는 경우, 국가 식별 번호
AMLR Art. 22(1)(a)
EUDI Wallet PID에 포함된 내용
개인 행정 번호 (선택 사항). 각 회원국이 발급 여부를 결정합니다.
Didit이 오늘날 다루는 방법
실시간 국가 eID는 제도 식별자를 반환합니다: 스웨덴의 personnummer, 핀란드의 개인 식별 코드 또는 발트 3국의 개인 코드. MitID는 CPR 번호가 아닌 가명 처리된 식별자를 반환합니다.
실사 필요 사항
일반 거주지
AMLR Art. 22(1)(a)
EUDI Wallet PID에 포함된 내용
주소 필드는 선택 사항이며 종종 누락됩니다. AMLA의 최종 초안 표준은 누락된 속성을 다른 수단을 통해 얻어야 한다고 명시합니다.
Didit이 오늘날 다루는 방법
실시간 국가 eID는 주소를 반환하지 않습니다. 주소 증명은 공과금 청구서, 은행 명세서 또는 정부 서신을 확인합니다.
실사 필요 사항
사용 가능한 경우, 세금 식별 번호
AMLR Art. 22(1)(a)
EUDI Wallet PID에 포함된 내용
PID에 포함되지 않습니다.
Didit이 오늘날 다루는 방법
동일한 워크플로우에서 설문조사 단계를 통해 수집합니다.
실사 필요 사항
본인 확인
ARF · 사용자 바인딩
EUDI Wallet PID에 포함된 내용
초상화는 2028년 8월 11일 의무화될 때까지 선택 사항입니다.
Didit이 오늘날 다루는 방법
문서 사진 또는 칩 초상화와 1:1 얼굴 매칭을 통한 수동 라이브니스 확인을 $0.33의 전체 KYC 검사 내에서 제공합니다.
실사 필요 사항
회사의 실소유주
AMLR Art. 20(1)(b)
EUDI Wallet PID에 포함된 내용
PID에 포함되지 않습니다. 지갑은 개인을 식별하며, 회사 소유주를 식별하지 않습니다.
Didit이 오늘날 다루는 방법
비즈니스 검증은 등록 기관에 등록된 경우 등록 데이터와 소유주를 가져오며, 각 소유주에 대한 신원 확인을 포함합니다.
실사 필요 사항
제재 대상 및 정치적 주요인물(PEP)
AMLR Art. 20(1)(d), (g)
EUDI Wallet PID에 포함된 내용
PID에 포함되지 않습니다.
Didit이 오늘날 다루는 방법
1,300개 이상의 제재, PEP 및 감시 목록에 대한 AML 스크리닝을 건당 $0.20에 제공합니다.
실사 필요 사항
관계의 목적 및 지속적인 모니터링
AMLR Arts. 25, 26
EUDI Wallet PID에 포함된 내용
PID에 포함되지 않습니다.
Didit이 오늘날 다루는 방법
설문조사를 통해 관계의 목적을 기록합니다. 지속적인 모니터링은 고객을 매일 재스크리닝하며, 연간 1인당 $0.07입니다.
고객 실사(CDD)는 여전히 귀사의 의무입니다. Didit은 검증 및 증빙 자료를 제공하며, 규정 준수를 보장하지 않습니다. AMLR은 2027년 7월 10일부터 적용되며, AMLA의 기술 표준은 2026년 9월 30일자 최종 초안이며 법률이 아닙니다.
2026년 10월 5일 기준 현황
국가
이탈리아
전자지갑 또는 앱
IT-Wallet (app IO)
상태
라이브 앱날짜
2026년 2월 17일
알려진 내용
IO 앱에서 라이브 중이며, 2026년 2월 17일까지 1,010만 건 활성화, 1,730만 건의 문서가 로드되었습니다. 성인에게는 무료이며 선택 사항이며, CIE 또는 SPID로 로그인합니다.
국가
덴마크
전자지갑 또는 앱
AltID
상태
라이브 앱날짜
2026년 8월 4일
알려진 내용
AltID는 디지털 신분증과 연령 증명 기능을 제공하며 운영 중이고, 2026년 8월 4일까지 281,390명이 생성했습니다. 디지털 정부청은 전자지갑을 단계적으로 구현하고 있습니다.
출처: digst.dk
국가
프랑스
전자지갑 또는 앱
France Identité
상태
라이브 앱날짜
공식 날짜 없음
국가
체코
전자지갑 또는 앱
eDoklady
상태
라이브 앱날짜
공식 날짜 없음
국가
독일
전자지갑 또는 앱
EUDI-Wallet (BMDS)
상태
샌드박스날짜
2027년 1월
알려진 내용
2025년 12월부터 공개 샌드박스를 운영 중입니다. 앱은 2027년 초에 ID 기능부터 시작하여 출시될 예정입니다. 시행 법안은 2026년 9월 23일 독일 연방의회에서 첫 심의를 거쳤습니다.
국가
스페인
전자지갑 또는 앱
Cartera Digital (Beta)
상태
파일럿날짜
2026년
국가
그리스
전자지갑 또는 앱
Gov.gr Wallet
상태
파일럿날짜
2026년
국가
아일랜드
전자지갑 또는 앱
Government Digital Wallet
상태
파일럿날짜
2026년
국가
키프로스
전자지갑 또는 앱
National wallet
상태
파일럿날짜
2026년
국가
슬로바키아
전자지갑 또는 앱
National EUDI Wallet
상태
파일럿날짜
공식 날짜 없음
국가
네덜란드
전자지갑 또는 앱
NL Wallet
상태
계획됨날짜
공식 날짜 없음
국가
폴란드
전자지갑 또는 앱
mObywatel
상태
계획됨날짜
공식 날짜 없음
국가
핀란드
전자지갑 또는 앱
National EUDI Wallet (DVV)
상태
계획됨날짜
공식 날짜 없음
국가
크로아티아
전자지갑 또는 앱
Certilia
상태
계획됨날짜
공식 날짜 없음
국가
루마니아
전자지갑 또는 앱
National EUDI Wallet
상태
계획됨날짜
공식 날짜 없음
국가
스웨덴
전자지갑 또는 앱
Digital identitetsplånbok (DIGG)
상태
계획됨날짜
공식 날짜 없음
목록에 없는 국가: 오스트리아, 벨기에, 에스토니아, 헝가리, 라트비아, 리투아니아, 룩셈부르크, 몰타, 포르투갈, 슬로베니아. 해당 날짜 기준으로 공개된 현황을 찾을 수 없었습니다. 국가 앱이 출시됨에 따라 이 표를 업데이트합니다.
지갑 카탈로그에서
Didit이 분류한 수준입니다. 주소나 초상화는 반환되지 않습니다.
워크플로우에서 국가별로 설정
EEA 국가 목록
지갑 자격 증명 형식
EUDI 지갑 연동에 대한 날짜나 가격은 아직 정해지지 않았습니다.
서비스가 QR 코드를 표시하면 사용자는 지갑 앱으로 스캔합니다.
지갑은 누가 요청하는지, 어떤 속성을 요청하는지 보여줍니다.
사용자가 승인하면 요청된 속성만 휴대폰을 떠납니다.
서비스는 발급자 서명을 확인하고 계속 진행합니다. 다른 정보는 공유되지 않았습니다.
표준 흐름의 예시입니다. Didit의 EUDI 지갑 지원은 곧 제공될 예정입니다.
$ curl -X POST https://verification.didit.me/v3/session/ \
-H "x-api-key: $DIDIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"workflow_id": "YOUR_EID_WORKFLOW_UUID",
"vendor_data": "customer_8412"
}'{ "url": "https://verify.didit.me/session/…" }{
"id_verifications": [{
"status": "Approved",
"verification_method": "wallet",
"assurance": "cryptographic",
"wallet_provider": "mitid",
"wallet_verification": {
"issuing_country": "DNK",
"level_of_assurance": "substantial",
"signature_valid": true,
"attributes": {
"full_name": "Freja Nielsen",
"date_of_birth": "1988-03-02"
},
"portrait": null
}
}]
}verification_method: "wallet"# Didit: get ready for the EUDI Wallet with the ID Verification step you run today
You are adding electronic identification to my_stack so the product is ready
for the EU Digital Identity (EUDI) Wallet. Every URL, header and enum value
below is canonical. Do not paraphrase or "improve" them.
## 0. What exists today, and what does not
- EUDI Wallet acceptance on Didit is coming soon. There is NO EUDI-specific
endpoint, wallet id, field or flag to integrate yet. Do not invent one, do
not send any EUDI identifier in a workflow, and do not build an OpenID4VP
verifier yourself as part of this task.
- What is live: national digital ID wallets inside the ID Verification step,
with document capture (chip reading, liveness, face match) as the fallback.
EUDI Wallet acceptance is planned for the same ID Verification step, so the
workflow, session call and webhook you build now are the ones you keep.
- The live wallets, as listed by the methods catalog:
- MitID: wallet id mitid, country keys DNK (Denmark)
- BankID: wallet id bankid_se, country keys SWE (Sweden)
- Finnish Trust Network: wallet id ftn, country keys FIN (Finland)
- Smart-ID: wallet id smart_id, country keys EST (Estonia), LVA (Latvia), LTU (Lithuania), BEL (Belgium)
- Mobile-ID: wallet id mobile_id, country keys EST (Estonia), LTU (Lithuania)
Check the catalog for your environment before you go live. Never
hard-code dates.
## 1. Provision an account
- Sign up: https://business.didit.me (no credit card required).
- Copy the API key of your application from the console.
## 2. Read the methods catalog
Availability is server-driven per country. Only wallets marked available can
be enabled on a live application.
- Business Console: your application -> Workflows -> the ID Verification
step -> Countries -> "Wallets accepted". Coming-soon wallets are listed
but cannot be switched on. https://docs.didit.me/console/id-verification-methods
- Didit MCP server (https://mcp.didit.me/mcp), tool
didit_workflow_get_id_verification_methods_catalog; pass country as ISO
3166-1 alpha-3 to narrow it. The MCP server signs in with "Log in with
Didit" (OAuth). It does not accept the x-api-key.
https://docs.didit.me/integration/mcp/tools
- Public coverage table (no sign-in, read-only):
https://docs.didit.me/core-technology/id-verification/digital-id-wallets#supported-wallets
If your code holds only an API key, it cannot read the catalog itself: use the
wallet ids listed in this prompt, and treat the answer of the workflow save as
the check. A live application answers 400 for a wallet that is not available
in that country ("<wallet> is not offered in <ISO3>", "unknown wallet").
## 3. Create the workflow (ID Verification = feature OCR)
POST https://verification.didit.me/v3/workflows/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
{
"workflow_label": "eID onboarding",
"features": [
{
"feature": "OCR",
"config": {
"methods": {
"DNK": {
"document": { "enabled": true },
"wallet": {
"enabled": true,
"providers": ["mitid"],
"on_failure": "fallback_to_document"
}
},
"EST": {
"document": { "enabled": true },
"wallet": {
"enabled": true,
"providers": ["smart_id", "mobile_id"],
"on_failure": "fallback_to_document"
}
}
}
}
}
]
}
Response: 201. The workflow id is uuid (workflow_id carries the same value);
the workflow is published straight away. Create it once and keep the id:
every call to this endpoint makes a new workflow.
is_desktop_allowed defaults to false: on a desktop browser the hosted flow
then shows a QR code to continue on a phone. Add "is_desktop_allowed": true
next to workflow_label to let people finish on desktop.
Rules the API enforces:
- OCR is UPPERCASE; ID_VERIFICATION is rejected in this body (the decision
later lists the step as ID_VERIFICATION in its features)
- country keys are ISO 3166-1 alpha-3; method keys are document, id_lookup, wallet
- providers is an accept-list, not a ranking; the end user picks
- on_failure is fallback_to_document or decline
- a wallet the catalog does not mark available rejects the whole save (400)
- every other country keeps document capture, so people without an eID
can still verify
- this body runs document capture only. Chip reading, liveness and face
match are their own features: add { "feature": "NFC" },
{ "feature": "LIVENESS" } and { "feature": "FACE_MATCH" } to features
when your policy needs them
## 4. Create a session
POST https://verification.didit.me/v3/session/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
-d '{ "workflow_id": "<id from step 3>", "vendor_data": "<your user id>" }'
Response: 201 with session_id, session_token, url and status "Not Started".
Redirect the user to url (hosted flow) or open it in the Web, iOS, Android,
React Native or Flutter SDK. The field is named url on this response.
One unfinished session exists per workflow_id and vendor_data pair: calling
create again with the same pair answers 201 again with that same session.
## 5. Webhook
Register a destination in the console (API & Webhooks), or over the API:
POST https://verification.didit.me/v3/webhook/destinations/
-H "x-api-key: <your-api-key>"
-H "Content-Type: application/json"
-d '{
"label": "Verification webhooks",
"url": "https://<your-public-host>/webhooks/didit",
"webhook_version": "v3",
"subscribed_events": ["status.updated", "data.updated"]
}'
label, url and subscribed_events are required. url must be a public HTTPS
address: Didit does not deliver to localhost or private addresses. Response:
201 with uuid and secret_shared_key. Store secret_shared_key as the webhook
secret (DIDIT_WEBHOOK_SECRET); it is unique to this destination. Remove a
destination with DELETE /v3/webhook/destinations/{uuid}/ (204).
What arrives:
- webhook_type is "status.updated" (the session changed status) or
"data.updated" (verification data was corrected after the fact)
- a destination receives the events of every session of the application,
so filter on workflow_id or vendor_data when several flows share it
- creating a session already sends status.updated with status
"Not Started". The decision key is present only when status is Approved,
Declined, In Review or Abandoned.
Verify every delivery:
Header: X-Signature-V2 (not X-Signature, not X-Signature-Simple)
Algorithm: HMAC-SHA256, hex digest, over the canonical JSON of the payload
(Python json.dumps(sort_keys=True, separators=(",", ":"),
ensure_ascii=False) after whole-valued floats become ints).
Never hash the raw request bytes under this header.
Freshness: the signed body field timestamp is the dispatch time (Unix
seconds). Reject when abs(now - timestamp) > 300 seconds, and
reject when the X-Timestamp header does not equal it.
Idempotency: event_id is the same on every retry of one event, so store it
and skip a delivery you already processed. One session can
still send the same status under two event ids, and the
console's Try Webhook test deliveries carry no event_id, so
also make the handler safe to run twice for one
(session_id, status, webhook_type).
Compare: constant-time (crypto.timingSafeEqual)
Reference handler (Express). Keep the verification lines as written.
The handler is a fragment. Put this above it and app.listen(process.env.PORT)
below it. It needs Express and Node 21 or newer (an older Node rejects
every delivery). It expects a JSON body: answer 400 yourself if you accept
anything else on this route, and refuse to start without the secret.
const express = require("express");
const app = express();
const SECRET = process.env.DIDIT_WEBHOOK_SECRET; // secret_shared_key of the destination
// Your endpoint receives a signed payload
const crypto = require("node:crypto"); // ESM: import crypto from "node:crypto"
// X-Signature-V2 = HMAC over the canonical JSON, never the raw bytes. Match the sender byte for
// byte: keys sorted by code point, integers digit for digit, floats in Python's repr.
class Num { constructor(src) { this.src = src; } } // a number as written on the wire, not a double
const num = (s) => { if (/^-?\d+$/.test(s)) return BigInt(s).toString(); const n = +s; // ints stay exact
if (Number.isInteger(n)) return BigInt(n).toString(); const [m, e] = n.toExponential().split("e"); // 27.0 -> 27
return +e >= -4 ? String(n) : `${m}e-${String(-e).padStart(2, "0")}`; }; // 1e-05, not 0.00001
const byCodePoint = (a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)); // UTF-8 order = Python's
const canon = (v) => Array.isArray(v) ? `[${v.map(canon)}]` : v instanceof Num ? num(v.src)
: v && typeof v === "object" ? `{${Object.keys(v).sort(byCodePoint).map((k) => `${JSON.stringify(k)}:${canon(v[k])}`)}}`
: JSON.stringify(v);
// Read the body as text: express.json() would round 1000000000000000129 to a double first.
// Register this route ABOVE any global app.use(express.json()): the first parser to run
// consumes the stream, and a body it already parsed has lost the digits the signature covers.
app.post("/webhooks/didit", express.text({ type: "application/json" }), (req, res) => {
const exact = JSON.parse(req.body, (k, v, c) => typeof v === "number" ? new Num(c.source) : v); // Node 21+
const body = JSON.parse(req.body);
const mac = crypto.createHmac("sha256", SECRET).update(canon(exact), "utf8").digest("hex");
const sig = Buffer.from(String(req.headers["x-signature-v2"] ?? ""));
// Freshness comes from the signed body timestamp; the header alone is unsigned and replayable.
const ts = body.timestamp, fresh = String(ts) === req.headers["x-timestamp"]
&& Math.abs(Date.now() / 1000 - ts) <= 300;
if (!fresh || sig.length !== mac.length
|| !crypto.timingSafeEqual(sig, Buffer.from(mac))) return res.sendStatus(401);
const { status, decision } = body;
// One entry per ID Verification node; pick yours by node_id when you run several.
const [idv] = decision?.id_verifications ?? [];
// idv.verification_method: "document" | "id_lookup" | "wallet"
res.sendStatus(200);
});
Status values (exact strings): Not Started, In Progress, Approved, Declined,
In Review, Resubmitted, Expired, Abandoned, Kyc Expired. Awaiting User only
appears on business verification sessions.
## 6. Read the result
The same V3 decision reaches you two ways:
- webhook body: body.decision.id_verifications[]
- GET https://verification.didit.me/v3/session/{session_id}/decision/
-H "x-api-key: <your-api-key>"
This response IS the decision object. Read id_verifications at the top
level: there is no decision wrapper here.
Until the user finishes the ID step, status is "Not Started" or "In Progress"
and id_verifications is null, not an empty array. Guard for it.
id_verifications[] has one entry per ID Verification node; with a single step
take index 0. A wallet sign-in sets:
verification_method "wallet"
assurance "cryptographic"
wallet_provider the catalog wallet id the user picked
wallet_verification provider, provider_name, issuing_authority,
issuing_country, credential_type, level_of_assurance,
verified_at, signature_valid, attributes, portrait
(null for the live wallets), face_match_score
fallback_from { method, reason, action } when the wallet sign-in failed
and on_failure declined the session; otherwise
null. After a document fallback that succeeds the
entry reads verification_method "document" with
fallback_from null
full_name, the normalised identity fields, on the entry itself
date_of_birth
On a live application, check wallet_verification.signature_valid before you
trust attributes. The
live wallets return name, date of birth and a scheme identifier (for example
the Swedish personnummer; MitID returns a pseudonymised identifier), never an
address or a portrait: collect those through other steps if your policy
needs them.
Reference: https://docs.didit.me/core-technology/id-verification/digital-id-wallets
## 7. Billing
Only completed wallet sign-ins are billed; cancelled, timed-out and failed
ones are free. Prices per wallet: https://didit.me/pricing
## 8. Verify your integration
Sandbox (an application in sandbox mode: nothing is billed and no real eID is
called). https://docs.didit.me/integration/sandbox-testing
- a sandbox application can enable every wallet in the catalog, the
coming-soon ones included. A workflow that saves in sandbox can still be
refused on a live application, so only use wallets marked available.
- open the session url, pick the wallet and confirm: the default approve
scenario simulates the sign-in. The entry then has verification_method
"wallet", assurance "cryptographic" and wallet_provider set, and the
normalised full_name and date_of_birth are filled. But
wallet_verification.signature_valid and level_of_assurance are null and
attributes is { "sandbox": true }: no real credential was checked.
Assert signature_valid === true and the level of assurance only against
a live application.
- to exercise on_failure, create the session with
"sandbox_scenario": "wallet_cancelled" (also wallet_timeout and
wallet_provider_error). The wallet sign-in then fails and the flow moves
to document capture or declines, as on_failure says. A fallback that
ends in an approved document reads verification_method "document".
- POST /v3/session/{session_id}/simulate/ forces a final status but writes
no id_verifications entry, so it cannot stand in for a sign-in.
Checks:
- create the workflow, create a session, and read its decision: expect 201,
201 with url, and 200 with status "Not Started"
- run one sandbox session per accepted wallet through the hosted flow and
assert verification_method is "wallet" and wallet_provider is the wallet
you picked
- run one session with sandbox_scenario "wallet_cancelled" and assert the
flow offers document capture
- assert the webhook accepts a correctly signed payload and rejects a wrong
X-Signature-V2, a changed body, and a payload whose signed timestamp is
older than 300 seconds, even when X-Timestamp is refreshed
- on a live application, assert wallet_verification.signature_valid is true
Docs: https://docs.didit.me/core-technology/id-verification/digital-id-wallets
개발, 테스트 및 초기 사용자 확보에 적합합니다.
25개 이상의 모듈, 투명한 가격 정책. 자동 볼륨 할인.
대규모 볼륨 및 규제 프로그램에 적합합니다.
사용량이 증가하면 볼륨 할인이 자동으로 적용됩니다. 협상이나 영업팀과의 통화가 필요 없습니다.
Didit은 신원 및 사기 방지 인프라입니다. 저희가 직접 제품을 개발하면서 필요하다고 느꼈던 플랫폼을 만들었습니다. 개방적이고 유연하며 개발자 친화적이어서, 단순히 연동하는 블랙박스가 아니라 스택의 핵심적인 부분으로 작동합니다.
하나의 API로 개인 확인(KYC, 고객 알기), 기업 확인(KYB, 사업체 알기), 암호화폐 지갑 심사(KYT, 거래 알기), 실시간 거래 모니터링을 모두 처리할 수 있습니다. Didit의 스택은 다음과 같은 특징을 가집니다:
내부적으로는 48개 이상의 언어로 된 14,000개 이상의 문서 유형, 1,000개 이상의 데이터 소스, 그리고 모든 세션에서 200개 이상의 사기 신호를 처리합니다. Didit 인프라는 모든 세션에서 동적으로 학습하며 매일 발전합니다.
EU 디지털 신원(EUDI) 지갑은 eIDAS 규정(EU) No 910/2014를 개정한 eIDAS 2로 알려진 규정(EU) 2024/1183에 따라 모든 EU 회원국이 제공해야 하는 앱입니다. 이 법은 EUDI 지갑을 개인이 개인 식별 데이터(PID) 및 전자 속성 증명서를 저장, 관리 및 검증하고, 이를 의존 당사자와 공유하며, 적격 전자 서명으로 서명할 수 있도록 하는 전자 신원 확인 수단으로 정의합니다.
기업에 중요한 세 가지 특징은 다음과 같습니다:
국가 eID 앱이 자동으로 EUDI 지갑이 되는 것은 아닙니다. 지갑은 EUDI 규칙을 충족하고 제5c조에 따라 인증을 받아야 EUDI 지갑으로 간주됩니다.
각 회원국은 최초 이행법이 발효된 2024년 12월 24일로부터 24개월 이내에 최소 1개의 EUDI 지갑을 제공해야 합니다. 따라서 마감일은 2026년 12월 24일입니다.
2026년 10월 5일 현재 상황:
이 날짜는 eIDAS 2 자체의 발표일이 아닌, 이행법의 발효일로부터 계산됩니다. 여러 국가 앱이 다른 날짜에 출시될 예정이므로, 이 페이지의 준비 현황 표에는 각 국가별 날짜와 출처가 표시되어 있습니다.
법률 또는 계약에 따라 귀사의 비즈니스가 온라인 식별을 위해 강력한 사용자 인증을 사용해야 하는 경우, 그렇습니다. 제5f조(2)항에 따라, 해당 위치에 있는 민간 의존 당사자는 사용자가 EUDI 지갑 사용을 요청할 경우, 첫 번째 시행법 발효 후 36개월 이내인 2027년 12월 24일까지 EUDI 지갑을 수락해야 합니다.
해당 조항은 운송, 에너지, 은행, 금융 서비스, 사회 보장, 건강, 식수, 우편 서비스, 디지털 인프라, 교육 및 통신 분야를 예시로 들고 있습니다. 이 목록은 폐쇄적이지 않으며, 인증 요구 사항이 기준이지 특정 분야가 기준은 아닙니다.
전자 식별이 필요한 공공 부문 서비스도 Wallet을 수락해야 합니다(제5f조(1)항). 사용자 인증이 필요한 초대형 온라인 플랫폼은 사용자의 요청에 따라 최소한의 데이터에 대해 Wallet을 수락해야 합니다(제5f조(3)항). 이 의무에 대한 별도의 날짜는 명시되어 있지 않습니다.
이 내용은 요약이며 법률 자문이 아닙니다.
네, 그렇습니다. 제5f조(2)항은 위원회 권고 2003/361/EC 부록 제2조에 정의된 소기업 및 영세기업을 제외합니다. 해당 권고에 따라 귀사의 규모를 확인하십시오.
이 면제는 수락 의무에 대한 것이지, 수락 옵션에 대한 것은 아닙니다. 소규모 사업체도 더 빠른 가입이나 생년월일을 공유하지 않는 연령 확인을 제공하기 위해 Wallet을 수락할 수 있습니다.
규모와 관계없이 두 가지는 변하지 않습니다.
이 내용은 요약이며 법률 자문이 아닙니다.
의존 당사자는 EUDI 지갑에 의존하여 사용자를 식별하거나 속성을 확인하는 모든 기업 또는 공공 기관을 말합니다. 제5b조(1)항에 따라 의존 당사자는 설립된 회원국에 등록해야 합니다. 등록 시 귀사의 신원, 연락처 정보 및 의도된 사용 목적(요청할 데이터 포함)을 명시해야 하며, 그 외의 다른 데이터는 요청할 수 없습니다(제5b조(3)항).
등록에 관한 규정인 시행 규정 (EU) 2025/848은 2026년 12월 24일부터 적용됩니다. 등록 후에는 다음을 받게 됩니다.
의존 당사자를 대신하여 활동하는 중개자는 의존 당사자로 취급되며, 거래 내용에 대한 데이터를 저장할 수 없습니다(제5b조(10)항). 예를 들어 독일은 조직 및 사용 사례당 하나의 액세스 및 등록 인증서를 설명합니다.
등록한 속성만 요청할 수 있으며, 사용자가 공유할지 여부를 결정합니다. PID에는 필수 속성으로 성, 이름, 생년월일, 출생지, 국적, 그리고 만료일, 발급 기관, 발급 국가가 포함됩니다. 선택적 속성으로는 초상화, 성별, 주소 필드 및 개인 행정 번호가 있으며, 각 회원국이 어떤 것을 발급할지 결정합니다.
PID 외에도 Wallet은 운전면허증, 학위 또는 연령 증명과 같은 전자 속성 증명서를 보유합니다. 회원국은 또한 주소, 연령, 국적 및 전문 자격증을 포함하여 최소한의 속성 목록을 신뢰할 수 있는 출처에 대해 검증 가능하도록 해야 합니다(부록 VI).
선택적 공개를 통해 사용자가 승인한 내용만 발급자가 서명하고 유효성 확인에 필요한 메타데이터와 함께 받게 됩니다. 적게 요청할수록 보호해야 할 개인 데이터가 줄어듭니다.
신원 확인의 경우 가능할 수 있습니다. AMLR 제22조(6)(b)항은 실질적 또는 높은 보증 수준의 전자 식별 수단을 통한 확인을 허용하며, EUDI 지갑은 높은 수준에서 작동합니다. AMLA의 고객 실사 최종 초안 표준(2026년 9월 30일, 위원회에 제출된 최종 초안이며 법률은 아님)은 가능한 한 eID 수단을 사용해야 한다고 명시하며, EUDI 지갑도 포함합니다.
하지만 이것이 실사 전체를 의미하지는 않습니다.
Didit은 현재 이러한 부분을 다루고 있습니다: 주소 증명, 설문지, 사업체 확인, AML 심사(건당 $0.20), 지속적인 모니터링(인당 연간 $0.07).
세 가지 계층으로 구성됩니다.
2026년 7월 23일에 발표된 Architecture and Reference Framework(ARF) v3.0.0은 전체 스택을 설명합니다.
네, 그렇습니다. 선택적 공개를 통해 Wallet은 해당 인물이 18세 이상이라는 사실만 공유할 수 있습니다. 네덜란드 정부는 이를 다음과 같이 설명합니다. 18세 이상인지 여부만 공유하고 생년월일을 제공할 필요가 없습니다.
EU는 또한 2025년 7월에 발표되고 2025년 10월에 업데이트된 연령 확인 청사진을 가지고 있습니다. 이는 독립형 앱 또는 Wallet 기능입니다. 이 연령 증명서에는 신원 데이터가 포함되어 있지 않으며, 증명서는 일회성 사용을 위해 일괄 발급되고, 발급자는 증명서가 어디에서 사용되었는지 알 수 없습니다. 2026년 4월, 위원회는 회원국에 연말까지 앱을 사용할 수 있도록 촉구했으며, 덴마크, 프랑스, 그리스, 이탈리아, 스페인이 가장 먼저 이를 채택했습니다.
디지털 서비스법의 적용을 받는 플랫폼의 경우, 미성년자에 대한 위원회 지침(2025년 7월)은 18세 이상 콘텐츠에 대한 연령 확인을 선호하며, 안면 연령 추정을 일시적인 대안으로 간주합니다.
2028년 8월 11일 이전에는 신뢰할 수 없습니다. 시행 규정 (EU) 2026/1731에 따라, 초상화는 해당 날짜부터 필수 PID의 일부가 됩니다. 그 전까지는 선택 사항이며, 각 회원국이 포함 여부를 결정합니다. 초상화 공유 또한 선택적 공개, 사용자 경고 및 로깅이 필요합니다.
ARF는 자격 증명을 제시하는 사람이 정당한 소유자인지 확인하는 것을 사용자 바인딩이라고 부릅니다. 일부 흐름에서는 의존 당사자가 이를 수행하고, 다른 흐름에서는 Wallet 자체의 확인에 의존합니다.
따라서 현재로서는 얼굴 매칭이 필요한 정책의 경우 셀카 단계를 계획하십시오. 즉, 수동 라이브니스와 문서 사진 또는 NFC로 읽은 칩 초상화에 대한 1:1 얼굴 매칭입니다. Didit에서는 이것이 전체 KYC 확인의 일부이며 $0.33입니다. 현재 운영 중인 5개의 국가 eID 중 어느 것도 초상화를 반환하지 않습니다.
2026년 10월 5일 현재, 여러 국가 앱이 출시되었거나 테스트 중입니다.
이 페이지의 준비 상태 표에는 공개 상태를 확인할 수 있는 모든 국가와 각 행의 날짜 및 출처가 나열되어 있습니다.
아직은 아닙니다. Didit에서 EUDI 지갑 수락이 곧 제공될 예정입니다. 저희 Wallet 카탈로그에는 30개 EEA 국가에 대한 정보가 있으며, 현재 구성하는 동일한 ID 확인 단계에 포함될 예정입니다. 출시 전에는 날짜나 가격을 공개하지 않습니다.
현재 작동하는 기능은 다음과 같습니다.
현재 이러한 기능을 기반으로 구축된 워크플로는 EUDI 지갑 수락이 도입되어도 계속 작동합니다. Wallet이 출시 계획에 중요하다면 저희에게 문의하십시오.
개인에게 Wallet은 무료입니다. 발급, 사용 및 취소에 비용이 들지 않습니다(제5a조(13)항). 기업의 경우 상황이 다릅니다.
Didit은 EUDI 지갑 수락 기능이 출시되면 가격 페이지에 가격을 게시할 예정입니다. 현재 가격 페이지에는 전체 KYC 확인($0.33) 및 AML 심사($0.20)와 같이 모든 운영 중인 확인에 대한 게시된 가격이 표시되어 있습니다.
Wallet이 출시되기 전에 효과적인 다섯 가지 단계입니다.
최종 검토: 2026년 10월 5일. 법률 자문이 아닙니다.