메인 콘텐츠로 건너뛰기

완전한 ID check 온보딩 가이드

이 종합 가이드는 ARGOS ID check를 이용해 처음 시작부터 운영 환경까지 나아가는 전 과정을 안내합니다. 신원 확인(Identity Verification)에 처음인 개발자든, 다른 솔루션에서 마이그레이션 중이든, 이 문서만으로 필요한 모든 내용을 파악할 수 있습니다.
완료 예상 시간: 기본 통합 30–45분, 고급 기능 포함 2–3시간사전 준비물:
  • ARGOS Identity 계정 (여기에서 가입)
  • REST API에 대한 기본 지식
  • 인터넷에 연결된 개발 환경

목차

파트 1: 기초

ID check 이해, 계정 설정, 핵심 개념

파트 2: 통합

Liveform 및 API 연동 방법

파트 3: 운영

보안, 테스트, 라이브 전환

파트 1: 기초

ARGOS ID check란?

ARGOS ID check는 AI 기반 문서 검증사기 탐지컴플라이언스 기능을 결합한 종합 신원 인증 플랫폼입니다. 핵심 기능:

문서 검증

여권, 운전면허증, 국가 신분증, 거주 허가 등 전 세계 200+개 국가의 20+ 문서 유형을 검증

데이터 추출

신분증에서 정보를 자동 추출·구조화 (정확도 98%+)

사기 탐지

위조, 사진 대체, 문서 변조를 AI로 감지

컴플라이언스

KYC/AML 준수 내장, 검증 규칙 커스터마이즈 및 감사 추적(Audit Trail) 제공
동작 방식:
1

사용자 문서 제출

사용자는 Liveform URL 또는 커스텀 UI를 통해 신분증 사진을 업로드합니다.
2

AI 분석

ARGOS AI 엔진이 문서 진위 여부를 분석하고, 데이터 필드를 추출하며, 생체 검증(활동성) 체크를 수행합니다.
3

검증 결정

설정한 규칙에 따라 자동 승인/거절되거나, 수동 심사 대상으로 플래그됩니다.
4

결과 전달

구조화된 검증 결과가 웹훅과 API로 전달되며 전체 감사 추적이 포함됩니다.

계정 생성 및 대시보드 둘러보기

이제 계정을 만들고 대시보드에 익숙해져 봅시다.
1

계정 만들기

  1. idcheck.argosidentity.com 방문
  2. Sign Up 클릭 후 가입 완료
  3. 이메일 주소 인증
  4. 로그인하여 대시보드 접속
Dashboard
2

대시보드 탐색

주요 메뉴:
  • Submissions: 모든 검증 제출 내역 조회 및 관리
  • Settings: 프로젝트 설정, 웹훅, 보안 구성
  • Access Management: API 키, Liveform URL, IP 화이트리스트
  • Analytics: 검증 지표와 성공률 추적
  • Project Settings: 검증 규칙, 문서 유형, 정책
3

API 자격 증명 확인

Settings → Access Management 로 이동:
  1. API Key: API 요청 인증에 사용하는 키(철저히 보관)
  2. Project ID (PID): 프로젝트 고유 식별자
  3. Liveform URL: 호스팅되는 검증 페이지 URL
API Key: argos_live_abc123xyz...
Project ID: pid_abc123
Liveform URL: https://form.argosidentity.com?pid=pid_abc123
보안 주의: API 키는 비밀번호처럼 취급하세요. 버전 관리에 커밋하거나, 클라이언트 코드에 노출하지 마세요.

반드시 알아둘 핵심 개념

통합에 앞서 아래 핵심 개념을 이해하세요.
Submission은 단일 신원 인증 시도를 의미합니다. 포함 내용:
  • Submission ID: 고유 식별자(sub_abc123)
  • KYC 상태: approved, rejected, pending
  • 사용자 데이터: 추출된 정보(이름, 생년, 국적 등)
  • 이미지: 문서 사진과 셀피
  • 메타데이터: 타임스탬프, IP, 디바이스 정보
Submission 라이프사이클:
Created → Processing → Approved/Rejected/Pending → Archived
Liveform 통합(가장 빠름):
  • ARGOS가 호스팅하는 검증 페이지 사용
  • URL 파라미터로 커스터마이즈
  • UI 개발 불필요
  • 적합: 빠른 도입, 모바일 앱
API 통합(가장 유연):
  • 커스텀 검증 UI 구축
  • 전 과정 프로그램적 제어
  • 기존 워크플로우에 통합 용이
  • 적합: 맞춤 UX, 복잡한 흐름
둘 다 병행 가능! 다수의 고객이 표준 흐름엔 Liveform, 특수 케이스엔 API를 함께 사용합니다.
웹훅(Webhook) 은 이벤트 발생 시 서버로 실시간 HTTP 콜백을 보내는 기능입니다.
  • Submission 상태 변경 시 트리거
  • 엔드포인트로 POST 전송
  • 전체 Submission 데이터 포함
  • 재시도 메커니즘 지원
이벤트 유형:
  • approved - 검증 승인
  • rejected - 검증 거절
  • pending - 수동 심사 필요
  • updated - 데이터 갱신
  • deleted - Submission 삭제
웹훅 페이로드 예시:
{
  "webhook_trigger": "approved",
  "submissionId": "sub_abc123",
  "kycStatus": "approved",
  "email": "user@example.com",
  "fullName": "John Doe",
  "birthDate": "1990-01-01"
}
쿼리 파라미터로 Liveform 동작을 커스터마이즈:
  • 사용자 데이터 선기입(email, userid)
  • 국가/문서 유형 제한
  • 검증 정책 오버라이드
  • 폼 필드 제어
토큰으로 프라이빗 모드 사용:
  • 1회용 URL
  • URL 공유 방지
  • 최초 사용 또는 3분 경과 시 만료
  • 프로젝트당 최대 100,000개 토큰
더 알아보기: Query String Guide
ID check는 여러 계층의 암호화를 지원합니다.1. 쿼리 스트링 암호화 (AES-256-ECB)
  • 민감한 URL 파라미터 암호화
  • 전송 중 사용자 데이터 보호
2. 보안 데이터 전송 (AES-256-ECB/CBC)
  • API 요청/응답 본문 암호화
  • 웹훅 페이로드 암호화
3. 커스텀 시크릿 키
  • 전용 암호화 키 생성
  • API 키와 분리하여 관리
더 알아보기: Encryption Guide

파트 2: 통합

이제 여러분의 애플리케이션에 ID check를 통합해봅시다. 통합 방법을 선택하세요:
  • Liveform 통합
  • API 통합

Liveform 통합 (초보자 추천)

가장 빠르게 신원 인증 기능을 앱에 추가할 수 있는 방법입니다.

1단계: 기본 Liveform 설정

1

Liveform URL 가져오기

  1. Dashboard에 로그인
  2. Settings → Access Management로 이동
  3. Liveform URL 복사:
https://form.argosidentity.com?pid={your_project_id}
2

기본 플로우 테스트

브라우저에서 URL을 열어 기본 검증 플로우를 확인하세요:
  • 데스크톱: 모바일 스캔용 QR 코드 표시
  • 모바일: 직접 검증 인터페이스 표시
Liveform Interface
3

앱에 통합하기

웹앱용:
<a href="https://form.argosidentity.com?pid={your_pid}" target="_blank">
  신원 인증하기
</a>
모바일 앱용:
// React Native 예시
import { Linking } from 'react-native';

const verifyIdentity = () => {
  Linking.openURL('https://form.argosidentity.com?pid={your_pid}');
};
백엔드 리디렉션용:
// Node.js Express 예시
app.get('/verify', (req, res) => {
  res.redirect('https://form.argosidentity.com?pid={your_pid}');
});

2단계: 쿼리 파라미터로 커스터마이징

사용자 경험을 향상시키기 위해 데이터를 미리 입력하고 동작을 커스터마이징하세요.
사용자 데이터를 전달하여 데이터 입력을 건너뛰세요:
const email = "user@example.com";
const userid = "user_12345";
const cf1 = "campaign_summer2024";

const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&email=${encodeURIComponent(email)}&userid=${userid}&cf1=${cf1}`;
사용 가능한 파라미터:
파라미터타입설명예시
emailstring사용자 이메일user@example.com
useridstring내부 사용자 IDuser_12345
cf1, cf2, cf3string메타데이터용 커스텀 필드campaign_id
sidstring제출 ID (업데이트용)sub_abc123
커스텀 필드(cf1, cf2, cf3)를 사용하여 캠페인 ID, 사용자 세그먼트 또는 분석에 필요한 메타데이터를 추적하세요.
특정 사용자에 대해 대시보드 설정을 오버라이드하세요:
const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&blacklistCountries=false&ageLimit=false&rejectDuplicateUser=true`;
정책 오버라이드:
파라미터타입설명
blacklistCountriesboolean블랙리스트 국가 허용하려면 false로 설정
ageLimitboolean연령 제한을 비활성화하려면 false로 설정
approvePeriodboolean승인된 사용자의 중복 검사를 비활성화하려면 false로 설정
rejectPeriodboolean거절된 사용자의 중복 검사를 비활성화하려면 false로 설정
rejectDuplicateUserboolean중복 방지를 활성화하려면 true로 설정
특별한 비즈니스 요구사항이 있을 때만 정책 오버라이드를 사용하세요. 대부분의 앱은 대시보드 설정에 의존해야 합니다.
사용자가 선택할 수 있는 국가와 ID 유형을 제어하세요:1단계: 설정 준비
const config = {
  allowedCountries: "USA,KOR,JPN",  // ISO Alpha-3 코드
  allowedIdTypes: "passport,drivers_license,government_id"
};
2단계: 설정 암호화
const CryptoJS = require('crypto-js');

function encryptQueryParams(data, apiKey) {
  const hashedKey = CryptoJS.SHA256(apiKey);
  const encrypted = CryptoJS.AES.encrypt(
    JSON.stringify(data),
    hashedKey,
    { mode: CryptoJS.mode.ECB }
  );
  return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}

const encryptedConfig = encryptQueryParams(config, YOUR_API_KEY);
3단계: URL 구성
const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&encrypted=${encodeURIComponent(encryptedConfig)}`;
사용 가능한 ID 유형:
  • passport
  • drivers_license
  • government_id
  • residence_permit
  • pancard
  • aadhaar
  • identification_card
국가 코드: 지원 국가 참조
allowedCountries, allowedIdTypes 및 기타 민감한 파라미터는 반드시 암호화해야 합니다. 암호화 가이드를 참조하세요.
더 빠른 플로우를 위해 선택 화면을 건너뛰세요:
const config = {
  selectedIssuingCountry: "USA",
  selectedIdType: "drivers_license"
};

const encryptedConfig = encryptQueryParams(config, YOUR_API_KEY);
const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&encrypted=${encodeURIComponent(encryptedConfig)}`;
  • selectedIdType반드시 selectedIssuingCountry와 함께 사용해야 합니다
  • allowedCountries 또는 allowedIdTypes와 동시에 사용할 수 없습니다
SMS를 통한 전화번호 수집 및 인증:
const config = {
  auxidField: "phoneNumber"
};

const encryptedConfig = encryptQueryParams(config, YOUR_API_KEY);
const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&encrypted=${encodeURIComponent(encryptedConfig)}`;
중요사항:
  • 전화번호 인증은 SMS OTP를 사용합니다
  • 현재 91개 국가는 SMS 인증을 지원하지 않습니다 (목록)
  • selectedIssuingCountryselectedIdType과 함께 사용할 수 없습니다 (향후 업데이트에서 수정 예정)
전화번호 인증은 사용자가 전화번호에 대한 접근 권한을 가지고 있음을 확인하여 보안을 한층 강화합니다.

3단계: 프라이빗 모드 구현 (선택사항)

프라이빗 모드는 토큰을 사용하여 일회용 검증 URL을 생성합니다.사용 사례:
  • 사용자 간 URL 공유 방지
  • 각 검증이 고유하도록 보장
  • 검증 링크에 만료 시간 추가
  • 특정 사용자 세션 추적
1

API를 통한 토큰 등록

curl -X POST 'https://rest-api.argosidentity.com/v3/submission/tokens' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: text/plain' \
  -d '{
        "tokenId": [
          "user-session-001",
          "user-session-002",
          "verification-abc123"
        ]
  }'
응답:
{
  "success": true,
  "message": "All tokens are now in the pool",
  "summary": {
    "totalSubmitted": 3,
    "currentCount": 3,
    "processed": 3,
    "failed": 0
  }
}
2

토큰화된 URL 생성

const tokenId = "user-session-001";
const secureUrl = `https://form.argosidentity.com?pid={your_pid}&token=${tokenId}`;

// 이 URL을 사용자에게 전송
sendEmail(userEmail, `검증 완료: ${secureUrl}`);
3

토큰 만료 처리

토큰은 다음 경우에 무효화됩니다:
  • 최초 사용 후 3분이 경과한 경우
  • 토큰으로 제출이 결정된 상태(승인/거절/대기)에 도달한 경우
에러 처리:
// 사용자가 토큰이 무효하다는 오류를 보는 경우
// 사용자를 위해 새 토큰 생성:

const newToken = `user-session-${Date.now()}`;

await fetch('https://rest-api.argosidentity.com/v3/submission/tokens', {
  method: 'POST',
  headers: {
    'x-api-key': YOUR_API_KEY,
    'Content-Type': 'text/plain'
  },
  body: JSON.stringify({ tokenId: [newToken] })
});

const newUrl = `https://form.argosidentity.com?pid={your_pid}&token=${newToken}`;
토큰 제한사항:
  • 프로젝트당 최대 100,000개 토큰
  • API 요청당 최대 500개 토큰
  • 토큰 ID 형식: 8-64자, 영숫자 + -_.
더 알아보기: POST Token API

4단계: 리턴 URL 구성

검증 후 결과와 함께 사용자를 앱으로 리디렉션하세요.
1

대시보드에서 리턴 URL 설정

  1. Settings → General로 이동
  2. 리턴 URL 입력:
https://yourapp.com/verification-complete
  1. Save 클릭
2

검증 결과 수신

사용자는 쿼리 파라미터와 함께 리디렉션됩니다:
https://yourapp.com/verification-complete?userid=user123&email=user@example.com&kycStatus=approved&cf1=campaign_summer
사용 가능한 파라미터:
  • userid - 원본 URL의 사용자 ID
  • email - 사용자 이메일
  • kycStatus - approved, rejected, 또는 pending
  • cf1, cf2, cf3 - 커스텀 필드
보안 데이터 전송을 활성화한 경우, 이 파라미터들은 encrypted 파라미터에 암호화됩니다. 리턴 URL 가이드를 참조하세요.
3

리디렉션 처리

// Express.js 예시
app.get('/verification-complete', (req, res) => {
  const { userid, kycStatus, email } = req.query;

  if (kycStatus === 'approved') {
    // 데이터베이스에서 사용자 상태 업데이트
    await updateUser(userid, { verified: true });
    res.render('verification-success');
  } else if (kycStatus === 'pending') {
    res.render('verification-pending');
  } else {
    res.render('verification-rejected');
  }
});

Liveform 통합 완료!

이제 작동하는 Liveform 통합이 있습니다. 전체적으로 테스트하세요:
1

데스크톱 플로우 테스트

데스크톱에서 Liveform URL 열기 → QR 스캔 → 모바일에서 검증 완료
2

모바일 플로우 테스트

모바일에서 Liveform URL 직접 열기 → 검증 완료
3

파라미터로 테스트

미리 입력된 데이터와 정책 오버라이드가 포함된 URL 테스트
4

리턴 URL 테스트

검증 완료 후 올바른 파라미터로 리디렉션 확인

다음: 웹훅 설정

실시간 검증 업데이트를 받기 위해 웹훅 설정으로 계속하세요

5단계: 웹훅 설정

웹훅은 검증 이벤트가 발생할 때 실시간 알림을 제공합니다. 이는 운영 배포에 필수적입니다.
1

웹훅 엔드포인트 생성

웹훅 POST 요청을 받을 HTTPS 엔드포인트를 생성하세요:
const express = require('express');
const app = express();

app.use(express.json());

app.post('/webhooks/idcheck', async (req, res) => {
  const event = req.body;

  console.log('웹훅 수신:', event.webhook_trigger);
  console.log('제출 ID:', event.submissionId);
  console.log('KYC 상태:', event.kycStatus);

  try {
    // 이벤트 유형에 따라 처리
    switch (event.webhook_trigger) {
      case 'approved':
        await handleApproved(event);
        break;

      case 'rejected':
        await handleRejected(event);
        break;

      case 'pending':
        await handlePending(event);
        break;

      case 'updated':
        await handleUpdated(event);
        break;

      default:
        console.log('알 수 없는 이벤트 유형:', event.webhook_trigger);
    }

    // 항상 빠르게 200 OK 응답
    res.status(200).json({ received: true });

  } catch (error) {
    console.error('웹훅 처리 오류:', error);
    // 처리 오류에도 200을 반환하여 재시도 방지
    res.status(200).json({ received: true, error: error.message });
  }
});

async function handleApproved(event) {
  // 데이터베이스에서 사용자 업데이트
  await db.users.update({
    id: event.userid,
    verified: true,
    verificationDate: new Date(),
    fullName: event.fullName,
    birthDate: event.birthDate
  });

  // 확인 이메일 전송
  await sendEmail(event.email, '검증 승인', {
    name: event.fullName
  });

  console.log(`사용자 ${event.userid} 승인됨`);
}

async function handleRejected(event) {
  // 사용자 상태 업데이트
  await db.users.update({
    id: event.userid,
    verified: false,
    rejectionReason: event.rejectionReason
  });

  // 사용자에게 알림
  await sendEmail(event.email, '검증 실패', {
    reason: event.rejectionReason
  });

  console.log(`사용자 ${event.userid} 거절됨`);
}

async function handlePending(event) {
  // 관리자에게 알림
  await notifyAdmin(`사용자 ${event.userid}에 대한 수동 심사 필요`);

  console.log(`사용자 ${event.userid} 심사 대기 중`);
}

async function handleUpdated(event) {
  // 업데이트된 데이터 동기화
  await db.submissions.update({
    submissionId: event.submissionId,
    data: event
  });
}

app.listen(3000, () => {
  console.log('웹훅 서버가 포트 3000에서 실행 중');
});
중요한 웹훅 모범 사례:
  1. 항상 빠르게 200 OK 응답 (5초 이내)
  2. 웹훅을 비동기로 처리 (시간이 오래 걸리는 경우)
  3. 중복 웹훅 처리 (제출 ID로 중복 제거)
  4. 실패한 처리에 대한 재시도 로직 구현
  5. 디버깅을 위한 모든 웹훅 로깅
2

대시보드에서 웹훅 URL 등록

  1. Dashboard에 로그인
  2. Settings → Access Management로 이동
  3. 웹훅 URL 필드에 웹훅 URL 입력:
    https://yourapp.com/webhooks/idcheck
    
  4. Save 클릭
웹훅 설정
웹훅 URL은 반드시 HTTPS를 사용해야 합니다. 로컬 테스트의 경우 ngrok 또는 유사한 도구를 사용하여 로컬 서버를 노출하세요.
3

웹훅 전송 테스트

옵션 1: webhook.site를 사용한 테스트
1. https://webhook.site 방문
2. 고유 URL 복사
3. 대시보드 웹훅 설정에 입력
4. 테스트 검증 수행
5. webhook.site에서 페이로드 확인
옵션 2: ngrok을 사용한 로컬 테스트
# ngrok 설치
npm install -g ngrok

# 포트 3000에서 로컬 서버 시작
node server.js

# 다른 터미널에서 노출
ngrok http 3000

# HTTPS URL 복사 (예: https://abc123.ngrok.io)
# 대시보드에 https://abc123.ngrok.io/webhooks/idcheck 입력
옵션 3: curl로 테스트
curl -X POST https://yourapp.com/webhooks/idcheck \
  -H 'Content-Type: application/json' \
  -d '{
    "webhook_trigger": "approved",
    "submissionId": "test_123",
    "kycStatus": "approved",
    "email": "test@example.com",
    "userid": "test_user"
  }'
4

웹훅 이벤트 처리

사용 가능한 이벤트 유형:
이벤트트리거사용 사례
approved검증 승인사용자 상태 업데이트, 접근 권한 부여
rejected검증 거절사용자 알림, 재제출 요청
pending수동 심사 필요관리자 알림, 사용자 안내
updated데이터 수정데이터베이스 변경사항 동기화
deleted제출 삭제관련 데이터 정리
created제출 생성새 검증 추적
retry사용자 재시도재시도 패턴 모니터링
injectionAPI를 통한 데이터 주입API 작업 로깅
amlAML 검사 완료컴플라이언스 결과 처리
웹훅 페이로드 예시:
{
  "webhook_trigger": "approved",
  "submissionId": "sub_abc123",
  "kycStatus": "approved",
  "email": "user@example.com",
  "userid": "user_12345",
  "fullName": "John Doe",
  "birthDate": "1990-01-01",
  "nationality": "USA",
  "gender": "male",
  "documentType": "passport",
  "documentNumber": "123456789",
  "issuingCountry": "USA",
  "expiryDate": "2030-01-01",
  "createdAt": "2024-01-15T10:30:00Z",
  "verifiedAt": "2024-01-15T10:35:00Z",
  "cf1": "campaign_summer",
  "cf2": null,
  "cf3": null,
  "ipAddress": "192.168.1.1"
}
더 알아보기: 웹훅 이벤트 참조

파트 3: 운영 배포

보안 설정

운영 환경으로 전환하기 전에 다음 필수 보안 기능을 구현하세요:
모든 API 요청, 응답, 웹훅을 암호화하세요.
1

대시보드에서 활성화

  1. Settings → Access Management로 이동
  2. “Secure Data Transfer” 옵션을 ON으로 토글
  3. Save 클릭
보안 데이터 전송
2

코드에서 암호화 구현

const CryptoJS = require('crypto-js');

function encryptData(data, apiKey) {
  // API 키를 SHA-256으로 해싱
  const hashedKey = CryptoJS.SHA256(apiKey);

  // AES-256 키를 위해 32바이트 추출
  const key = CryptoJS.lib.WordArray.create(
    hashedKey.words.slice(0, 8),
    32
  );

  // AES-256-ECB로 데이터 암호화
  const encrypted = CryptoJS.AES.encrypt(
    JSON.stringify(data),
    key,
    { mode: CryptoJS.mode.ECB }
  );

  return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}

// API 요청에서 사용
const userData = {
  email: 'user@example.com',
  fullName: 'John Doe',
  birthDate: '1990-01-01'
};

const encryptedBody = encryptData(userData, YOUR_API_KEY);

const response = await axios.post(
  'https://rest-api.argosidentity.com/v3/submission/migration',
  { body: encryptedBody },
  {
    headers: {
      'x-api-key': YOUR_API_KEY,
      'Content-Type': 'application/json'
    }
  }
);
주요 차이점:
  • API 요청/응답: AES-256-ECB 사용
  • 웹훅: AES-256-CBC 사용
  • 항상 API 키를 SHA-256으로 먼저 해싱
3

암호화 테스트

구현을 확인하기 위해 암호화/복호화 도구를 사용하세요:
  1. 도구를 다운로드하고 실행
  2. API 키 입력
  3. 샘플 데이터로 암호화/복호화 테스트
  4. 코드 결과와 비교
도구는 ECB와 CBC 모드를 모두 지원합니다. 둘 다 테스트하세요!
더 알아보기: 암호화 가이드
신뢰할 수 있는 IP 주소에서만 API 접근을 허용하세요.
1

서버 IP 찾기

# 서버의 공용 IP 찾기
curl ifconfig.me

# 또는 클라우드 제공업체 대시보드에서 확인
# AWS: EC2 Elastic IP
# Google Cloud: External IP
# Azure: Public IP
2

화이트리스트에 IP 추가

  1. Settings → Access Management → IP Whitelist로 이동
  2. 서버 IP 주소 입력 (한 줄에 하나씩):
    52.12.34.56
    52.12.34.57
    
  3. Save 클릭
3

접근 테스트

화이트리스트된 IP에서 (성공해야 함):
curl -H "x-api-key: YOUR_API_KEY" \
  https://rest-api.argosidentity.com/v3/submission
화이트리스트되지 않은 IP에서 (403으로 실패해야 함):
{
  "errorCode": "forbidden",
  "errorMessage": "Access denied. IP not whitelisted."
}
API를 호출할 모든 서버 IP를 화이트리스트에 추가해야 합니다:
  • 운영 서버
  • 스테이징 서버
  • CI/CD 파이프라인 IP (해당하는 경우)
  • 테스트용 관리자/개발자 IP
토큰을 사용하여 안전한 일회용 검증 URL을 생성하세요.프라이빗 모드 사용 시기:
  • 고보안 애플리케이션 (금융, 의료)
  • URL 공유/전달 방지
  • 시간 제한이 있는 검증
  • 특정 사용자 세션 추적
구현:
// 1. 사용자 세션용 고유 토큰 생성
const tokenId = `session-${userId}-${Date.now()}`;

// 2. ARGOS에 토큰 등록
await fetch('https://rest-api.argosidentity.com/v3/submission/tokens', {
  method: 'POST',
  headers: {
    'x-api-key': YOUR_API_KEY,
    'Content-Type': 'text/plain'
  },
  body: JSON.stringify({ tokenId: [tokenId] })
});

// 3. 안전한 Liveform URL 생성
const secureUrl = `https://form.argosidentity.com?pid=${projectId}&token=${tokenId}`;

// 4. 사용자에게 URL 전송 (이메일, SMS 등)
await sendEmail(userEmail, {
  subject: '신원 인증 완료',
  body: `인증하려면 여기를 클릭하세요: ${secureUrl}`,
  expiresIn: '3분'
});

// 5. 토큰 만료 처리
setTimeout(async () => {
  // 토큰이 사용되었는지 확인
  const submission = await getSubmissionByToken(tokenId);

  if (!submission) {
    console.log(`토큰 ${tokenId}가 사용되지 않고 만료됨`);
    // 선택적으로 사용자에게 알리거나 새 토큰 생성
  }
}, 3 * 60 * 1000); // 3분
토큰 라이프사이클:
생성됨 → 등록됨 → URL 전송됨 → 사용자가 열음 → 제출 생성됨 → 토큰 소모됨

                       제출이 최종 상태에 도달하거나 3분 후 만료
더 알아보기: POST Token API
API 키를 클라이언트 코드나 버전 관리에 절대 노출하지 마세요.모범 사례:
# .env 파일 (gitignore에 추가!)
ARGOS_API_KEY=argos_live_abc123xyz...
ARGOS_PROJECT_ID=pid_abc123

# Node.js에서 로드
require('dotenv').config();
const apiKey = process.env.ARGOS_API_KEY;
절대 API 키를 git에 커밋하지 마세요!.gitignore에 추가:
.env
.env.local
.env.production
config/secrets.js
git-secrets 같은 도구를 사용하여 실수로 커밋하는 것을 방지하세요.
남용과 예상치 못한 비용으로부터 통합을 보호하세요.ARGOS 요청 제한:
  • API 호출: IP당 분당 100개 요청
  • 웹훅 재시도: 지수 백오프로 5회 시도
  • 토큰 등록: 요청당 500개 토큰, 총 100k개
애플리케이션 요청 제한:
const rateLimit = require('express-rate-limit');

// 사용자당 검증 요청 제한
const verificationLimiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1시간
  max: 3, // IP당 시간당 최대 3회 검증
  message: '검증 시도가 너무 많습니다. 나중에 다시 시도해주세요.',
  standardHeaders: true,
  legacyHeaders: false,
});

app.post('/api/create-verification',
  verificationLimiter,
  async (req, res) => {
    // 검증 로직
  }
);

// 데이터베이스에서 사용자별 제한 추적
async function checkUserVerificationLimit(userId) {
  const recentAttempts = await db.verifications.count({
    userId,
    createdAt: { $gte: new Date(Date.now() - 24 * 60 * 60 * 1000) }
  });

  if (recentAttempts >= 5) {
    throw new Error('일일 검증 제한 초과');
  }
}

테스트 체크리스트

운영 환경으로 전환하기 전에 모든 통합 지점을 철저히 테스트하세요:
1

기능 테스트

데스크톱 플로우:
  • QR 코드가 올바르게 표시됨
  • QR 코드가 스캔되어 모바일 플로우 열림
  • 모든 쿼리 파라미터가 예상대로 작동
  • 리턴 URL이 올바른 데이터로 리디렉션
  • 오류 메시지가 올바르게 표시됨
모바일 플로우:
  • 모바일 브라우저에서 폼 로드
  • 카메라 권한 요청 작동
  • 문서 캡처가 원활함
  • 셀피 캡처 작동
  • 업로드가 성공적으로 완료됨
  • 성공/오류 화면이 표시됨
  • POST /submission이 제출을 생성함
  • PUT /image이 이미지를 성공적으로 업로드함
  • GET /submission이 올바른 데이터를 조회함
  • PATCH /submission이 데이터를 업데이트함
  • DELETE /submission이 데이터를 제거함
  • 모든 오류 코드가 적절히 처리됨
  • 암호화된 요청/응답이 작동함
  • 요청 제한이 준수됨
  • 웹훅 엔드포인트가 이벤트를 수신함
  • 모든 이벤트 유형이 올바르게 처리됨
  • 웹훅 서명 검증이 작동함 (구현된 경우)
  • 중복 웹훅이 중복 제거됨
  • 실패한 처리가 웹훅 전송을 차단하지 않음
  • 암호화된 웹훅이 올바르게 복호화됨
  • 실패한 전송에 대한 재시도 로직이 작동함
2

보안 테스트

  • 잘못된 API 키가 거부됨
  • 화이트리스트되지 않은 IP가 차단됨 (403)
  • 전송 중 암호화된 데이터를 읽을 수 없음
  • API 키가 클라이언트 코드에 노출되지 않음
  • 모든 요청에 HTTPS가 강제됨
  • 토큰이 3분 후 만료됨
  • 사용된 토큰을 재사용할 수 없음
  • 잘못된 토큰이 적절한 오류를 표시함
  • 토큰 풀 제한이 적용됨 (100k)
  • 개인 데이터가 전송 중 암호화됨
  • 웹훅 페이로드가 암호화됨 (활성화된 경우)
  • 이미지가 HTTPS로 제공됨
  • 민감한 데이터가 로깅되지 않음
3

오류 처리 테스트

다음 오류 시나리오를 테스트하세요:
  • 네트워크 오류: 타임아웃, 연결 실패
  • 잘못된 데이터: 잘못된 형식의 JSON, 잘못된 타입
  • 누락된 필드: 필수 파라미터 누락
  • 요청 제한: 너무 많은 요청
  • 서버 오류: 500 응답
  • 웹훅 실패: 엔드포인트 다운, 타임아웃
  • 이미지 문제: 파일이 너무 큼, 잘못된 형식
  • 만료된 토큰: 토큰이 이미 사용됨/만료됨
4

사용자 경험 테스트

  • 검증 플로우가 직관적임
  • 오류 메시지가 도움이 됨
  • 로딩 상태가 표시됨
  • 성공 확인이 표시됨
  • 모바일 경험이 원활함
  • 여러 문서 유형이 작동함
  • 다른 국가가 작동함
  • 리턴 URL 경험이 좋음
5

성능 테스트

  • API 응답이 빠름 (<2초)
  • 이미지 업로드가 빠르게 완료됨
  • 웹훅이 신속하게 수신됨
  • 큰 페이로드가 타임아웃되지 않음
  • 동시 요청이 처리됨
  • 데이터베이스 쓰기가 효율적임

운영 전환 체크리스트

운영 환경 출시 전 최종 확인사항:
1

설정 검토

대시보드 설정:
  • 웹훅 URL이 올바르고 HTTPS임
  • IP 화이트리스트에 모든 운영 IP가 포함됨
  • 보안 데이터 전송이 활성화됨
  • 리턴 URL이 올바르게 구성됨
  • 프로젝트 설정이 요구사항과 일치함:
    • 허용된 문서 유형
    • 국가 블랙리스트/화이트리스트
    • 연령 제한
    • 중복 방지 규칙
    • AML 설정 (해당하는 경우)
2

코드 검토

  • API 키가 환경 변수에서 로드됨
  • 코드에 하드코딩된 자격 증명 없음
  • 오류 처리가 포괄적임
  • 로깅이 구현됨 (민감한 데이터는 제외!)
  • 요청 제한이 적용됨
  • 웹훅 재시도 로직이 구현됨
  • 데이터베이스 쿼리가 최적화됨
  • 프론트엔드가 API 키를 노출하지 않음
3

인프라

  • 운영 서버가 프로비저닝됨
  • 로드 밸런서가 구성됨 (필요한 경우)
  • SSL 인증서가 설치됨
  • 데이터베이스가 백업됨
  • 모니터링/알림이 설정됨
  • 정적 자산용 CDN이 구성됨
  • 방화벽 규칙이 구성됨
4

모니터링 설정

다음 항목에 대한 모니터링을 설정하세요:
// 예시: 주요 지표 로깅
const metrics = {
  verifications_started: 0,
  verifications_completed: 0,
  verifications_approved: 0,
  verifications_rejected: 0,
  api_errors: 0,
  webhook_failures: 0,
  average_completion_time: 0
};

// 애플리케이션에서 추적
function trackVerificationStart() {
  metrics.verifications_started++;
  // 모니터링 서비스로 전송 (Datadog, New Relic 등)
}

// 웹훅 전송 모니터링
app.post('/webhooks/idcheck', async (req, res) => {
  const startTime = Date.now();

  try {
    await processWebhook(req.body);
    metrics.verifications_completed++;

    if (req.body.kycStatus === 'approved') {
      metrics.verifications_approved++;
    } else if (req.body.kycStatus === 'rejected') {
      metrics.verifications_rejected++;
    }

  } catch (error) {
    metrics.webhook_failures++;
    logger.error('웹훅 처리 실패', { error, body: req.body });
  }

  const duration = Date.now() - startTime;
  metrics.average_completion_time =
    (metrics.average_completion_time + duration) / 2;

  res.status(200).json({ received: true });
});
모니터링할 주요 지표:
  • 검증 성공률
  • 평균 완료 시간
  • API 오류율
  • 웹훅 전송률
  • 시스템 가동 시간
  • 데이터베이스 성능
5

문서화

  • 내부 문서가 작성됨
  • 운영팀을 위한 실행 가이드가 생성됨
  • 사고 대응 계획이 문서화됨
  • 팀을 위한 API 통합 가이드
  • 사용자 플로우 다이어그램이 생성됨
6

롤아웃 계획

점진적 롤아웃 전략:
// 1단계: 사용자의 5% (카나리)
function shouldUseNewVerification(userId) {
  return parseInt(userId.slice(-2), 16) % 100 < 5;
}

// 2단계: 사용자의 25%
function shouldUseNewVerification(userId) {
  return parseInt(userId.slice(-2), 16) % 100 < 25;
}

// 3단계: 사용자의 100%
function shouldUseNewVerification(userId) {
  return true;
}

// 사용법
if (shouldUseNewVerification(user.id)) {
  redirectToArgosVerification(user);
} else {
  redirectToOldVerification(user);
}
  • 1단계: 48시간 동안 트래픽의 5%
  • 지표 모니터링, 문제 수정
  • 2단계: 24시간 동안 트래픽의 25%
  • 지표 모니터링, 문제 수정
  • 3단계: 트래픽의 100%
7

출시!

  • 운영 통합 활성화
  • 대시보드를 적극적으로 모니터링
  • 지원 요청에 대비
  • 롤백 계획 준비
  • 축하! 🎉

고급 기능

AML (자금세탁방지) 스크리닝

전 세계 제재 목록 및 감시 목록에 대한 컴플라이언스 검사를 수행하세요.
1

대시보드에서 AML 활성화

  1. Settings → General → AML Settings로 이동
  2. AML 스크리닝 활성화
  3. 스크리닝 옵션 구성:
    • 감시 목록 소스 (UN, OFAC, EU 등)
    • 매치 임계값 (퍼지 매칭 민감도)
    • 매치 시 자동 거절
2

API를 통한 AML 검사 요청

curl -X POST 'https://rest-api.argosidentity.com/v3/submission/aml' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "fullName": "John Doe",
    "birthDate": "1990-01-01",
    "nationality": "USA",
    "submissionId": "sub_abc123"
  }'
3

AML 보고서 조회

curl -X GET 'https://rest-api.argosidentity.com/v3/submission/aml/report?submissionId=sub_abc123' \
  -H 'x-api-key: YOUR_API_KEY'
응답:
{
  "submissionId": "sub_abc123",
  "amlStatus": "clear",
  "matches": [],
  "checkedAt": "2024-01-15T10:35:00Z",
  "sources": ["UN", "OFAC", "EU", "UK"]
}
매치가 발견된 경우:
{
  "submissionId": "sub_abc123",
  "amlStatus": "match",
  "matches": [
    {
      "name": "John Doe",
      "matchScore": 0.95,
      "source": "OFAC",
      "listType": "sanctions",
      "details": "Sanctioned individual"
    }
  ],
  "checkedAt": "2024-01-15T10:35:00Z"
}
4

AML 결과 처리

async function handleAMLWebhook(event) {
  if (event.webhook_trigger === 'aml') {
    const { submissionId, amlStatus, matches } = event;

    if (amlStatus === 'match') {
      // 심사 대상으로 플래그
      await db.submissions.update({
        submissionId,
        flagged: true,
        flagReason: 'AML 매치 감지됨',
        requiresManualReview: true
      });

      // 컴플라이언스 팀에 알림
      await notifyCompliance({
        type: 'AML_MATCH',
        submissionId,
        matches
      });

      // 자동 거절이 활성화된 경우 검증 거절
      if (config.aml.autoReject) {
        await rejectVerification(submissionId, 'AML 컴플라이언스 문제');
      }
    } else {
      // 진행 허용
      console.log(`${submissionId}에 대해 AML 클리어`);
    }
  }
}
더 알아보기: AML API 참조

지속적인 AML 모니터링

승인된 사용자를 업데이트된 감시 목록과 지속적으로 모니터링하세요.
// 지속적인 모니터링을 위해 사용자 등록
await fetch('https://rest-api.argosidentity.com/v3/submission/aml/ongoing', {
  method: 'POST',
  headers: {
    'x-api-key': YOUR_API_KEY,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    submissionId: 'sub_abc123',
    recordId: 'user_12345'
  })
});

// 새 매치가 발견되면 웹훅 수신
app.post('/webhooks/idcheck', (req, res) => {
  if (req.body.webhook_trigger === 'aml_monitor') {
    console.log('지속적인 AML 매치 감지됨:', req.body);
    // 조치 취하기 (계정 동결, 사용자 알림 등)
  }
  res.status(200).send('OK');
});
더 알아보기: AML 지속적인 모니터링

데이터 프로젝션 (필드 필터링)

수집되고 표시되는 데이터 필드를 제어하세요. 사용 사례:
  • GDPR 컴플라이언스를 위한 데이터 수집 최소화
  • 다양한 검증 수준 생성 (기본 vs 전체)
  • 특정 문서 유형이나 국가에 맞춤화
1

API를 통한 프로젝션 생성

curl -X POST 'https://rest-api.argosidentity.com/v3/projection' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "projectionName": "basic-kyc",
    "allowedFields": [
      "fullName",
      "birthDate",
      "nationality"
    ]
  }'
응답:
{
  "message": "success",
  "projectionId": "proj_123abc"
}
2

Liveform에서 프로젝션 사용

const config = {
  projectionId: "proj_123abc"
};

const encryptedConfig = encryptQueryParams(config, YOUR_API_KEY);
const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&encrypted=${encodeURIComponent(encryptedConfig)}`;
projectionId 대신 projectionName을 사용할 수도 있지만, 둘을 함께 사용할 수는 없습니다.
3

결과

이 프로젝션으로 폼은:
  • 이름, 생년월일, 국적만 수집
  • 다른 필드 (주소, 문서 번호 등) 건너뛰기
  • API 응답과 웹훅에서 프로젝션된 필드만 반환
더 알아보기: 프로젝션 API

다국어 지원

ID check Liveform은 전 세계 사용자를 위한 다국어를 지원합니다. 사용 가능한 언어:
  • 영어 (en)
  • 한국어 (ko)
  • 일본어 (ja)
  • 스페인어 (es)
  • 프랑스어 (fr)
  • 독일어 (de)
  • 기타…
사용법:
// Liveform URL에 lang 파라미터 추가
const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&lang=ko`;

// 또는 사용자의 브라우저 언어로 자동 결정
const userLang = navigator.language.split('-')[0]; // 'en', 'ko', 'ja' 등
const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&lang=${userLang}`;
더 알아보기: Liveform 언어

문제 해결 가이드

자주 발생하는 문제와 해결 방법:
증상:
  • 웹훅 이벤트가 도착하지 않음
  • 웹훅 엔드포인트가 호출되지 않음
가능한 원인 및 해결책:
  1. 웹훅 URL이 HTTPS가 아님
    ❌ http://yourapp.com/webhook
    ✅ https://yourapp.com/webhook
    
  2. 엔드포인트가 200이 아닌 상태 반환
    • 서버 로그 확인
    • 엔드포인트가 5초 이내에 200 OK 반환하는지 확인
    • 필요시 웹훅을 비동기로 처리
  3. 방화벽이 ARGOS IP 차단
    • 방화벽에서 ARGOS 웹훅 IP를 화이트리스트에 추가
    • ARGOS 지원팀에 IP 범위 확인 요청
  4. 대시보드의 엔드포인트 URL 오타
    • Settings → Access Management에서 URL 재확인
    • curl로 엔드포인트 테스트: curl -X POST https://yourapp.com/webhook
디버깅 단계:
// 상세한 로깅 추가
app.post('/webhooks/idcheck', (req, res) => {
  console.log('=== 웹훅 수신됨 ===');
  console.log('헤더:', req.headers);
  console.log('본문:', req.body);
  console.log('==================');

  res.status(200).json({ received: true });
});

// webhook.site로 테스트
// 1. https://webhook.site 방문
// 2. 고유 URL 복사
// 3. 대시보드에 입력
// 4. 테스트 이벤트 트리거
// 5. webhook.site에서 전송 확인
증상:
{
  "errorCode": "forbidden",
  "errorMessage": "Access denied"
}
가능한 원인 및 해결책:
  1. 잘못되었거나 누락된 API 키
    # 헤더 형식 확인
     x-api-key: argos_live_abc123...
     x-api-key: "argos_live_abc123..."  (따옴표 없이!)
     Authorization: Bearer argos_live... (잘못된 헤더!)
    
  2. IP가 화이트리스트되지 않음
    • 서버의 공용 IP 확인: curl ifconfig.me
    • 대시보드의 IP 화이트리스트에 추가
    • 프록시/로드 밸런서 사용 시 프록시 IP 화이트리스트
  3. 잘못된 API 키 사용
    • 올바른 프로젝트의 API 키 사용 확인
    • 복사-붙여넣기 오류 확인
    • 필요시 API 키 재생성
디버깅:
# 명령줄에서 테스트
curl -v -H "x-api-key: YOUR_API_KEY" \
  https://rest-api.argosidentity.com/v3/submission

# 응답 헤더에서 단서 확인
# 찾을 항목: X-Request-Id, X-Error-Code
증상:
  • “Invalid encrypted data” 오류
  • 복호화된 데이터가 깨진 문자
  • 복호화 시 JSON parse error
가능한 원인 및 해결책:
  1. 잘못된 암호화 모드 사용
    • API 요청/응답: AES-256-ECB 사용
    • 웹훅: AES-256-CBC 사용
    • 쿼리 스트링: AES-256-ECB 사용
  2. API 키를 먼저 해싱하지 않음
    const key = apiKey; // 잘못됨!
    const hashedKey = CryptoJS.SHA256(apiKey); // 올바름!
    
  3. 인코딩 문제
    // 암호화 출력은 반드시 Base64여야 함
    encrypted.ciphertext.toString(CryptoJS.enc.Base64)
    encrypted.toString() // 잘못된 인코딩!
    
    // 복호화 입력은 반드시 Base64 파싱해야 함
    CryptoJS.enc.Base64.parse(encryptedData)
    encryptedData // 잘못됨!
    
  4. 잘못된 키 추출 (ECB)
    CryptoJS.lib.WordArray.create(hashedKey.words.slice(0, 8), 32)
    hashedKey // 잘못됨!
    
테스트:
// 암호화를 확인하기 위해 이 테스트 사용
const testData = { test: "hello" };
const encrypted = encryptData(testData, YOUR_API_KEY);
const decrypted = decryptData(encrypted, YOUR_API_KEY);

console.log('원본:', testData);
console.log('암호화됨:', encrypted);
console.log('복호화됨:', decrypted);

if (JSON.stringify(testData) === JSON.stringify(decrypted)) {
  console.log('✅ 암호화가 올바르게 작동함!');
} else {
  console.log('❌ 암호화 실패!');
}
암호화 도구를 사용하여 확인하세요!
증상:
  • 이미지 업로드가 400 또는 413 오류 반환
  • “Image too large” 오류
  • “Invalid image format” 오류
가능한 원인 및 해결책:
  1. 이미지가 너무 큼 (>10MB)
    // 업로드 전 압축
    const compressedImage = await compressImage(originalImage, {
      maxWidth: 1920,
      maxHeight: 1080,
      quality: 0.8
    });
    
  2. 지원되지 않는 파일 형식
    • ✅ 지원됨: JPEG, PNG
    • ❌ 지원되지 않음: GIF, BMP, WebP, HEIC
    // HEIC를 JPEG로 변환 (iOS 사진)
    import heic2any from 'heic2any';
    
    if (file.type === 'image/heic') {
      const converted = await heic2any({
        blob: file,
        toType: 'image/jpeg'
      });
      file = converted;
    }
    
  3. 이미지 품질이 나쁨
    • 최소 해상도 확인: 1280x720
    • 이미지가 흐리지 않은지 확인
    • 모든 문서 가장자리가 보이는지 확인
    • 문서에 반사가 없는지 확인
  4. 잘못된 Content-Type 헤더
     Content-Type: image/jpeg
     Content-Type: application/octet-stream
    
증상:
  • Liveform URL을 열면 빈 화면
  • “Invalid project ID” 오류
  • QR 코드가 표시되지 않음
가능한 원인 및 해결책:
  1. 잘못된 프로젝트 ID (PID)
    • 대시보드 Settings → Access Management에서 PID 확인
    • URL의 오타 확인
    ✅ ?pid=proj_abc123
    ❌ ?pid=abc123 (접두사 누락)
    
  2. 잘못된 형식의 쿼리 파라미터
    • 모든 파라미터 값을 URL 인코딩
    • 적절한 형식 확인
    ?email=user@example.com&userid=user 123
    ?email=${encodeURIComponent('user@example.com')}&userid=${encodeURIComponent('user 123')}
    
  3. 암호화된 파라미터 문제
    • 암호화가 올바른지 확인
    • 암호화된 값의 URL 인코딩 확인
    • 암호화 도구 출력과 일치하는지 확인
  4. 브라우저 호환성
테스트:
// 먼저 기본 URL 테스트
https://form.argosidentity.com?pid={your_pid}

// 그다음 파라미터를 하나씩 추가
https://form.argosidentity.com?pid={your_pid}&email=test@example.com

// 브라우저 DevTools (F12) → Console에서 오류 확인
증상:
  • “Duplicate user detected” 오류
  • 사용자가 이전에 제출하지 않았는데도 제출할 수 없음
가능한 원인 및 해결책:
  1. 중복 방지 활성화됨
    • 대시보드 Settings → Project Settings → Duplicate Prevention 확인
    • rejectDuplicateUser가 활성화됨
    • 같은 이름+생년월일+국적의 사용자가 이미 검증됨
  2. 승인/거절 기간 제한
    • 대시보드 설정이 X일 내 재제출 방지
    • 쿼리 파라미터로 오버라이드:
      ?approvePeriod=false&rejectPeriod=false
      
  3. 같은 이메일/userid 재사용
    • 각 사용자에 대해 고유 식별자 사용
    • 테스트 이메일 주소 재사용하지 않기
해결책:
// 옵션 1: 특정 사용자에 대해 오버라이드
const liveformUrl = `https://form.argosidentity.com?pid={your_pid}&rejectDuplicateUser=false`;

// 옵션 2: 이전 제출 삭제
await fetch(`https://rest-api.argosidentity.com/v3/submission?submissionId=${oldSubmissionId}`, {
  method: 'DELETE',
  headers: { 'x-api-key': YOUR_API_KEY }
});

// 옵션 3: 다른 userid/email 사용
const uniqueUserid = `user_${userId}_${Date.now()}`;
증상:
{
  "errorCode": "too_many_requests",
  "errorMessage": "Rate limit exceeded"
}
해결책:
  1. 지수 백오프로 재시도 구현
    async function callAPIWithRetry(url, options, maxRetries = 3) {
      for (let i = 0; i < maxRetries; i++) {
        try {
          const response = await fetch(url, options);
    
          if (response.status === 429) {
            const retryAfter = response.headers.get('Retry-After') || (2 ** i);
            console.log(`요청 제한됨. ${retryAfter}초 후 재시도...`);
            await sleep(retryAfter * 1000);
            continue;
          }
    
          return response;
    
        } catch (error) {
          if (i === maxRetries - 1) throw error;
          await sleep(1000 * 2 ** i); // 1초, 2초, 4초
        }
      }
    }
    
  2. 요청 큐잉 구현
    const queue = require('p-queue').default;
    
    const apiQueue = new queue({
      concurrency: 1,
      interval: 1000, // 초당 1개 요청
      intervalCap: 1
    });
    
    async function queuedAPICall(url, options) {
      return apiQueue.add(() => fetch(url, options));
    }
    
  3. API 응답 캐싱
    const cache = new Map();
    
    async function cachedGetSubmission(submissionId) {
      if (cache.has(submissionId)) {
        return cache.get(submissionId);
      }
    
      const submission = await getSubmission(submissionId);
      cache.set(submissionId, submission);
    
      // 5분 후 만료
      setTimeout(() => cache.delete(submissionId), 5 * 60 * 1000);
    
      return submission;
    }
    
증상:
  • “Token expired” 오류
  • “Token not found” 오류
  • “Token already used” 오류
가능한 원인 및 해결책:
  1. 토큰 만료됨 (최초 사용 후 3분 경과)
    // 새 토큰 생성
    const newToken = `session-${userId}-${Date.now()}`;
    
    await fetch('https://rest-api.argosidentity.com/v3/submission/tokens', {
      method: 'POST',
      headers: { 'x-api-key': YOUR_API_KEY, 'Content-Type': 'text/plain' },
      body: JSON.stringify({ tokenId: [newToken] })
    });
    
    // 사용자에게 새 URL 전송
    const newUrl = `https://form.argosidentity.com?pid={your_pid}&token=${newToken}`;
    
  2. 토큰이 이미 사용됨
    • 각 토큰은 하나의 제출만 생성할 수 있음
    • 각 검증 시도에 대해 새 토큰 생성
  3. 토큰 풀 초과 (100k 제한)
    • 오래된 토큰 삭제:
      curl -X DELETE 'https://rest-api.argosidentity.com/v3/submission/tokens?startDate=2024-01-01&endDate=2024-01-31' \
        -H 'x-api-key: YOUR_API_KEY'
      
    • 대시보드에서 자동 삭제 활성화
  4. 토큰 형식이 무효함
    • 8-64자여야 함
    • 영숫자 + -_.만 허용
    • 문자나 숫자로 시작/끝나야 함
    "user-session-123"
    "token_abc.xyz"
    "-invalid-" (하이픈으로 시작)
    "short" (너무 짧음, 8 미만)
    "has space" (공백 포함)
    

모범 사례 요약

모든 통합에 대해

보안

  • 보안 데이터 전송 암호화 활성화
  • 운영 환경에서 IP 화이트리스트 사용
  • 클라이언트 코드에 API 키 노출 금지
  • 민감한 앱에 프라이빗 모드 사용
  • API 키 정기적 교체 (분기별)

오류 처리

  • 모든 HTTP 오류 코드 처리 (400, 403, 500 등)
  • 지수 백오프로 재시도 로직 구현
  • 디버깅을 위한 오류 로깅 (민감한 데이터 제외)
  • 사용자 친화적인 오류 메시지 표시
  • 중요한 오류에 대한 대체 플로우 보유

웹훅

  • 항상 빠르게 200 OK 응답 (<5초)
  • 웹훅을 비동기로 처리
  • 멱등성 구현 (중복 제거)
  • 모든 웹훅 이벤트 로깅
  • 웹훅 전송률 모니터링
  • 처리 실패에 대한 재시도 로직 구현

테스트

  • 출시 전 모든 통합 지점 테스트
  • 개발 중 테스트 계정/데이터 사용
  • 오류 시나리오 철저히 테스트
  • 고트래픽 앱에 대한 부하 테스트 수행
  • 운영 환경 전에 스테이징에서 모니터링

성능

  • 적절한 경우 API 응답 캐싱
  • 자체 요청 제한 구현
  • 데이터베이스 쿼리 최적화
  • 정적 자산용 CDN 사용
  • API 응답 시간 모니터링

컴플라이언스

  • 데이터 수집 최소화 (프로젝션 사용)
  • 데이터 보존 정책 구현
  • 규제 산업에 AML 스크리닝 활성화
  • 검증의 감사 로그 유지
  • GDPR/CCPA 요구사항 준수

추가 리소스


지원

도움이 필요하신가요? 언제든지 연락주세요:

이메일 지원

support@argosidentity.com응답 시간: 영업일 기준 24시간 이내

문서

포괄적인 문서와 가이드 탐색

커뮤니티

개발자 커뮤니티 참여 (지원팀에서 링크 제공)

엔터프라이즈 지원

엔터프라이즈 고객용: 전용 지원 채널 제공

다음 단계는?

1

구축 시작

이제 필요한 모든 것이 있습니다! 사용 사례에 가장 적합한 통합 방법으로 시작하세요.
2

커뮤니티 참여

다른 개발자들과 연결하고, 경험을 공유하며, 커뮤니티에서 도움을 받으세요.
3

업데이트 확인

새 기능과 개선사항에 대한 업데이트를 받기 위해 변경 로그를 구독하세요.
4

피드백 제공

여러분의 피드백이 ID check를 더 나은 제품으로 만드는 데 도움이 됩니다!

축하합니다! ID check 온보딩 가이드를 완료했습니다. 이제 애플리케이션에 안전하고 컴플라이언스가 준수되는 신원 인증 기능을 구축할 준비가 되었습니다.
프로 팁: 구축하면서 이 가이드를 북마크하고 문제 해결 섹션을 참조하세요. 즐거운 코딩 되세요!
I