메인 콘텐츠로 건너뛰기
지갑 소유권 위젯은 고객이 특정 암호화폐 지갑 주소를 실제로 관리하고 있음을 증명하는 호스팅 페이지입니다. EU TFR에 따라 VASP는 자체 보관(비호스팅) 지갑으로 선라이즈 임계값을 초과하는 자금을 보내거나 받기 전에 해당 지갑을 통제하고 있음을 확인해야 합니다. 이 위젯은 서명 흐름을 직접 구현하지 않고도 Didit이 그 증명을 수집하는 방법입니다. 검증된 증명이 있으면 일치하는 지갑 주소록 항목에 is_ownership_verified: true로 설정되고, 이에 연결된 Travel Rule 이체는 UNCONFIRMED_OWNERSHIP 상태에서 벗어나 진행할 수 있습니다.

Didit이 위젯을 자동으로 발급하는 경우

직접 세션을 발급할 필요는 거의 없습니다. Travel Rule 설정에서 auto_wallet_verification이 켜져 있으면(기본값), 이체에 최종 사용자의 지갑 통제 증명이 필요할 때 Didit이 거래 생성 시점에 위젯 세션을 자동으로 발급합니다.
  • 이체가 UNCONFIRMED_OWNERSHIP 상태입니다. 제출 시 거래 상대방 지갑이 자체 보관 지갑으로 선언되었습니다.
  • 이체가 발신 거래이며 COUNTERPARTY_VASP_NOT_FOUND 상태입니다. 거래 상대방 VASP를 식별하지 못했으므로 소유권 증명이 거래를 완료하기 위해 남은 유일한 경로입니다.
자동 발급된 세션은 거래의 action_required 블록(type: "wallet_ownership", 열어야 할 url 포함)으로 반환되며, SDK는 클라이언트 측 제출 시 이를 자동으로 실행합니다. Didit이 대신 생성하는 수신 이체(선라이즈 등록, 수신 TRP 조회, INTERNAL 레일의 수신 구간)에는 UNCONFIRMED_OWNERSHIP 상태가 되더라도 자동 발급 세션이 생성되지 않습니다. 이체가 존재하기 전에 지갑을 미리 검증하려는 경우, auto_wallet_verification을 끈 경우, 또는 위와 같은 수신 이체의 경우에는 POST /v3/travel-rule/widget-session/으로 직접 발급하십시오.

증명 내용

이 위젯은 최대 네 가지 증명 방법을 제공합니다. 어떤 방법이 표시되는지는 세션을 발급한 방식과 Travel Rule 설정에 따라 달라집니다:

메시지 서명 검증 계약

서명을 제출하면 지갑에 대한 제어 권한을 증명할 때 200과 status: "VERIFIED"가 반환됩니다. 이 외의 경우 400이 반환되며 증명은 열린 상태로 남아 고객이 다시 서명할 수 있습니다. 이때 다음 code 값 중 하나가 포함됩니다:

Satoshi 테스트 검증 계약

Satoshi 테스트 입금의 검증은 비동기로 진행됩니다. 트랜잭션이 온체인에서 확인되고 확정되어야 하기 때문입니다. 입금의 txid를 제출하면, 입금이 온체인에서 아직 확정되지 않은 동안 200과 status: "PENDING"이 반환됩니다. 이때 txid는 폐기되지 않고 보관됩니다. 입금이 확정되면 200과 status: "VERIFIED"가 반환됩니다. 정상적이지 않은 입금의 경우 400과 status: "REJECTED"가 반환됩니다. 다른 지갑에서 보냈거나, 입금 주소로 예상 금액이 전송되지 않았거나, 챌린지보다 오래되었거나, 이미 다른 지갑의 증명에 사용된 트랜잭션인 경우입니다. 이 경우 증명은 닫히며, 세션에 시도 횟수가 남아 있으면 고객은 새 증명을 시작할 수 있습니다. 아직 인덱싱되지 않은 입금도 200과 status: "PENDING"을 반환합니다. Didit 측 조회가 실패하면 400과 DEPOSIT_LOOKUP_FAILED 코드가 반환됩니다. 두 경우 모두 증명은 열린 상태로 남고 Didit은 계속 확인합니다. 유효한 입금이 확인되기 전에 테스트 기간이 만료되면 410이 반환됩니다. txid가 제출되면 백그라운드 작업이 5분마다 대기 중인 입금을 다시 확인하고, 트랜잭션이 확정된 후 증명을 완료합니다. 따라서 고객이 txid를 다시 제출할 필요는 없습니다. satoshi_deposit_address를 전달하면, 위젯 세션의 expires_at이 최소 24시간인 Satoshi 테스트 기간까지 연장됩니다. 세션 자체가 만료되기 전에 입금이 확정될 시간을 확보하기 위해서입니다.

흐름

1

위젯 세션 발급

검증할 지갑으로 POST /v3/travel-rule/widget-session/을 호출합니다. 선택 사항으로, 소유권이 증명되면 이체가 자동으로 진행되도록 이체와 연결할 수 있습니다.
2

반환된 URL 열기

고객을 응답의 url로 보냅니다. 고객은 그곳에서 증명을 완료하며, Didit 계정이나 API 키는 필요하지 않습니다. URL에 포함된 토큰이 인증 역할을 합니다.
3

완료 감지

증명이 검증되면 위젯이 주소록 항목을 검증됨으로 표시하고, 세션이 이체와 연결되어 있으면 해당 이체를 진행시킵니다. travel_rule.status.updated(연결된 이체)를 확인하거나 위젯 컨텍스트를 폴링합니다.

위젯 세션 발급

이 예제는 세션을 Travel Rule 가이드의 선언된 자체 보관 이체와 연결하므로, wallet_address는 해당 이체의 목적지 지갑입니다. 이체와 연결된 세션은 해당 이체의 거래 상대방 지갑에 대한 증명만 허용합니다.
응답으로 받은 url은 항상 그대로 여십시오. 직접 URL을 만들지 마십시오.

반환된 URL 열기

이번 릴리스에서 위젯은 웹에서만 동작합니다. url은 시스템 브라우저나 커스텀 탭에서 여십시오. Didit 모바일 SDK 웹뷰 안에서는 절대 열지 마십시오.메시지 서명은 고객의 브라우저에 설치된 지갑과 함께 작동하며, 위젯은 이 지갑을 EIP-6963과 Wallet Standard 프로토콜로 찾습니다. QR 코드 등으로 별도의 모바일 지갑 앱을 연결하는 기능은 현재 제공되지 않으므로, 위젯은 다른 앱으로 넘기지 않습니다. Didit Web/Flutter/React Native/iOS/Android SDK 웹뷰처럼 앱 내 웹뷰는 고객의 브라우저 지갑에 접근할 수 없으므로, 그 안에서 열린 위젯에서는 고객이 서명할 방법이 없습니다.모바일에서는 웹뷰로 렌더링하지 말고, OS 브라우저(SFSafariViewController / Chrome Custom Tabs 또는 기본 브라우저)로 url을 여십시오. 웹에서는 일반 탭이나 팝업을 사용해도 됩니다.

완료 감지

위젯은 토큰으로 조회하는 공개 읽기 엔드포인트를 제공합니다. 이를 폴링해 진행 상황을 확인하거나, 세션이 이체와 연결된 경우 webhook을 사용하십시오.
  • 증명이 검증되면 completed_at에 값이 설정됩니다(null이 아님).
  • proofs의 각 항목에는 해당 방식에 필요한 필드가 포함됩니다. SATOSHI_TEST 증명에는 deposit_address, expected_amount, 그리고 자체 expires_at이 추가됩니다. MESSAGE_SIGNING 증명에는 고객이 서명할 문자열인 challenge가 추가됩니다.
  • SATOSHI_TEST 증명은 입금이 온체인에서 확인되었지만 아직 확정되지 않은 동안 status: "PENDING" 상태에 머물 수 있습니다. 이때 귀사나 고객이 할 일은 없습니다. 위의 Satoshi 테스트 검증 계약을 참고하십시오.
  • 세션이 transaction_id와 함께 발급된 경우, 증명이 검증되면 연결된 이체가 진행되며, 라이브 애플리케이션에서는 travel_rule.status.updated webhook이 발생합니다. 폴링보다 webhook을 사용하는 것이 좋습니다. 수신 TRP 문의는 발신자에게 승인 결과가 전달되고, 이 승인이 전달되면 COMPLETED로 이동합니다. UNCONFIRMED_OWNERSHIP 상태의 다른 이체(또는 ON_HOLD 상태의 수신 이체)는 COMPLETED로 이동하며, 수취인 이름이 지갑 보유자와 일치하지 않으면 COUNTERPARTY_MISMATCHED_DATA로 이동합니다. 정산이 완료된 sunrise 입금이 완료되면 FINISHED로 계속 진행됩니다. 발신 이체가 COUNTERPARTY_VASP_NOT_FOUND 상태이면 COMPLETED로 이동합니다.
  • 이 맥락에서 SCREENSHOT 증명은 귀사가 소유권을 확인한 뒤에도 status: "PENDING" 상태를 유지합니다. POST .../travel-rule/ownership/로 승인하며, 이 엔드포인트는 소유권 확인을 기다리는 이체만 받습니다. 따라서 연결된 이체가 없는 세션이나 COUNTERPARTY_VASP_NOT_FOUND 상태의 발신 이체와 연결된 세션에서는 스크린샷 증명을 승인할 방법이 없습니다. 이런 세션에서 스크린샷 증명을 제공하면 안 된다면 allow_screenshot_proof를 끄십시오.
  • 증명이 거부된 후에도 남은 시도 횟수가 있으면 세션에서 새 시도를 할 수 있습니다. max_attempts, attempts_used, attempts_remaining이 시도 횟수를 나타내며, 거부된 증명에는 rejection_reason이 포함됩니다. attempts_remaining이 0이면 새 증명을 시작할 때 409가 반환되므로, 새 세션을 발급해야 합니다.
  • 컨텍스트 엔드포인트는 알 수 없는 토큰에 대해 404를, 완료되지 않은 채 세션이 만료되면 410을 반환합니다.
여기에는 일회성 의존성이 없습니다. 위젯과 귀사의 백엔드는 같은 영속 상태(검증된 주소록 항목과 이체 상태)로 수렴합니다. 따라서 webhook이 누락되거나 탭이 닫히더라도, 이체 또는 위젯 컨텍스트를 다시 읽어 언제든 복구할 수 있습니다.

현지화 및 브랜딩

위젯은 54개 언어로 렌더링되며, 링크의 언어 경로(또는 브라우저 기본값)를 따릅니다. 앱에서 화이트 라벨이 활성화되어 있으면 위젯은 인증 플로우의 브랜딩을 자동으로 상속합니다. 로고, 브랜드 색상, 버튼 및 패널 스타일, 사용자 지정 글꼴, 파비콘, 제목에 표시되는 앱의 공개 이름이 여기에 포함됩니다. 별도의 설정은 필요 없습니다. KYC 세션에 설정한 것과 같은 커스터마이징이 여기에도 적용됩니다. 이미 완료된 링크로 다시 접속한 사용자에게는 완료 화면이 다시 표시됩니다. callback_url을 전달한 경우 위젯은 사용자를 해당 URL로 되돌려 보냅니다. 만료된 링크에는 브랜드가 적용된 만료 화면이 표시되며, 사용자에게 새 링크를 요청하도록 안내합니다. 사용자를 위해 새 세션을 생성하려면 POST /v3/travel-rule/widget-session/을 사용하세요. action: "resend"로 전송을 재전송해도 세션은 생성되지 않습니다.

다음 단계

Travel Rule

전체 송금 수명 주기, 결제 경로, 설정 및 수취 플로우를 확인할 수 있습니다.

지갑 주소록

직접 관리하는 지갑을 등록하면 인바운드 전송이 이 지갑을 기준으로 확인됩니다.

Webhooks

travel_rule.status.updated를 구독하면 증명으로 전송이 진행될 때 이에 대응할 수 있습니다.

네이티브 SDK

위젯 URL은 SDK 웹뷰가 아닌 시스템 브라우저에서 여세요.
마지막 수정일 2026년 11월 7일