즉시 유효한 테스트 IBAN을 생성하거나 기존 IBAN을 검증합니다. 10개 유럽 국가의 MOD 97 검증을 지원합니다. 금융 소프트웨어 테스트 및 개발에 완벽합니다.
실제 은행 계좌 데이터 없이 금융 소프트웨어를 테스트해야 할 때? 유효성 검사를 통과하는 유효한 IBAN 형식이 필요할 것입니다. 이 도구는 국가별 형식을 따르는 임의의 IBAN을 생성하고 ISO 13616 표준을 사용하여 기존 IBAN의 유효성을 검사합니다.
다음은 이 도구가 해결하는 실제 문제입니다: 결제 시스템이나 은행 애플리케이션을 구축할 때, 유효성 검사를 통과하면서 실제 계좌번호 노출 위험이 없는 테스트 데이터가 필요합니다. 개발자들이 흔히 저지르는 실수는 MOD 97 검사 알고리즘을 통과하지 못하는 "가짜" IBAN을 만들어 잘못된 이유로 테스트가 실패하는 것입니다.
이 도구는 두 가지 핵심 작업을 처리합니다:
IBAN(국제 은행 계좌 번호)은 국가 간 은행 계좌를 식별하는 방식을 표준화합니다. 각 IBAN에는 국가 코드, MOD 97로 계산된 두 개의 검사 숫자, 그리고 국가마다 다른 기본 은행 계좌 번호(BBAN)가 포함됩니다. 이를 복잡하게 만드는 것은 독일은 22자를 사용하고 프랑스는 27자가 필요하며, 내부 구조가 완전히 다르다는 점입니다.
IBAN은 최대 34개의 영숫자 문자로 구성될 수 있지만, 대부분의 유럽 국가는 22-27개를 사용합니다. 모든 IBAN은 세 부분으로 나뉩니다:
독일 IBAN을 예로 들어보겠습니다. 패턴 DE2!n8!n10!n은 다음을 의미합니다:
DE = 국가 코드2!n = 두 개의 숫자 검증 숫자8!n = 8자리 은행 코드 (Bankleitzahl)10!n = 10자리 계좌 번호 (Kontonummer)사람들을 당황하게 하는 것은 이러한 형식이 국가마다 얼마나 다른지입니다:
| 국가 | 길이 | 구조 | 예시 |
|---|---|---|---|
| 독일 (DE) | 22 | DE2!n8!n10!n | DE89370400440532013000 |
| 영국 (GB) | 22 | GB2!n4!a6!n8!n | GB29NWBK60161331926819 |
| 프랑스 (FR) | 27 | FR2!n5!n5!n11!c2!n | FR1420041010050500013M02606 |
| 스페인 (ES) | 24 | ES2!n4!n4!n1!n1!n10!n | ES9121000418450200051332 |
| 이탈리아 (IT) | 27 | IT2!n1!a5!n5!n12!c | IT60X0542811101000000123456 |
IBAN 검증은 ISO 7064에 정의된 MOD 97 알고리즘에 의존합니다. IBAN을 검증할 때 실제로 일어나는 일은 다음과 같습니다:
수학적으로:
왜 특별히 MOD 97인가? 거의 모든 일반적인 오류를 잡아냅니다: 단일 숫자 실수, 숫자 전치, 심지어 대부분의 유사한 문자를 입력하는 오류. 실제로 우연한 데이터 입력 오류의 약 99.9%를 잡아낸다는 것을 발견했으며, 이것이 국제 표준이 된 이유입니다.
알아둘 만한 한 가지 특이점은: IBAN을 생성할 때, "00"으로 시작하여 알고리즘을 실행한 후 98에서 나머지를 빼서 검증 숫자를 계산합니다. 이렇게 하면 최종 IBAN이 올바르게 검증됩니다.
실제 계좌번호를 사용하지 않고 유효성 검사를 통과하는 테스트 IBAN을 생성합니다:
생성 프로세스:
프로 팁: 테스트 데이터베이스를 시딩할 때, 국가 간 시나리오를 테스트하기 위해 여러 국가의 IBAN을 생성하세요. 실제 결제 시스템은 특정 국가와 관련된 엣지 케이스가 종종 있습니다.
프로덕션에 도달하기 전에 IBAN 구조를 확인하고 형식 문제를 잡아냅니다:
검증 확인은 순서대로 실행됩니다:
일반적인 시나리오: API가 일관성 없는 공백이 있는 사용자 입력 IBAN을 수신합니다. 처리 전에 검증기를 사용하여 정규화하세요 - 자동으로 공백을 제거하고 적절한 형식을 보여줍니다.
API 테스트: 결제 통합 테스트를 구축할 때, 유효성 검사를 통과하지만 실제 거래를 트리거하지 않는 IBAN이 필요합니다. 자동화된 테스트 스위트를 위해 테스트 IBAN 배치를 생성하여 다양한 국가 형식에 대한 오류 처리가 올바르게 작동하는지 확인하세요.
양식 검증: 체크아웃 흐름을 테스트하고 있나요? 검증기를 사용하여 프론트엔드 검증이 백엔드 요구 사항과 일치하는지 확인하세요. 흔한 문제는 결제 프로세서가 나중에 거부할 IBAN 형식을 수락하는 것입니다. 개발 중에 이를 포착하면 고객의 좌절감을 줄일 수 있습니다.
엣지 케이스 테스트: 대부분의 개발자는 한두 가지 국가 형식으로 테스트합니다. 독일의 22자 IBAN을 기준으로 설계된 시스템에서 21자 IBAN을 가진 스위스 고객이 사용할 때 어떤 일이 발생할까요? 다양한 국가 형식을 생성하여 필드 길이 및 검증 로직을 스트레스 테스트하세요.
회귀 테스트: IBAN 검증 라이브러리를 업데이트한 후, 생성된 테스트 IBAN을 이전 및 새 버전 모두에서 실행하세요. 불일치가 있다면 프로덕션에 영향을 줄 수 있는 호환성 중단 변경을 나타냅니다.
결제 시스템: 국제 송금 기능을 구축할 때, IBAN 구조 자체가 라우팅 동작을 결정하는 시나리오를 만나게 됩니다. 네덜란드의 IBAN(BBAN에 문자 포함)을 테스트하면 모든 숫자로 된 독일 IBAN에서는 발견할 수 없는 버그를 노출시킬 수 있습니다.
은행 소프트웨어: IBAN을 구문 분석하여 은행 코드 및 지점 식별자를 추출하려면 국가별 특정 로직이 필요합니다. 각 지원 국가의 IBAN을 생성하여 구문 분석 알고리즘이 이러한 구성 요소를 올바르게 식별하는지 확인하세요.
규정 준수 확인: 금융 규정은 종종 처리 전 IBAN 검증을 요구합니다. 이 도구를 사용하여 시스템이 잘못된 체크 숫자와 잘못된 형식을 거부함을 증명하는 테스트 사례를 만드세요. 감사 추적에 필수적입니다.
은행 표준 교육: 국제 결제 시스템에 대해 배우는 학생들은 실제 IBAN 구조를 보면 도움이 됩니다. 다양한 국가의 예시를 생성하여 다른 은행 시스템에서 표준화가 어떻게 작동하는지 설명하세요.
API 문서: 실제 IBAN을 기술 문서에 사용하는 대신 깨끗한 예시를 생성하세요. "테스트를 위해 IBAN DE89370400440532013000 사용"과 같은 문구는 개발자에게 이것이 안전한 테스트 값임을 즉시 알려줍니다.
데이터베이스 시딩: 개발 및 스테이징 환경에는 현실적인 테스트 데이터가 필요합니다. 다양한 IBAN을 생성하여 개인정보 문제 없이 대표적인 국제 고객 프로필로 데이터베이스를 채우세요.
데이터 익명화: 프로덕션에서 스테이징으로 마이그레이션하나요? 실제 IBAN을 형식 유효성을 유지하면서 민감한 정보를 제거하는 생성된 IBAN으로 대체하세요. 개발 환경에서 GDPR 준수에 중요합니다.
다양한 도구가 다양한 요구에 적합합니다. 다음은 솔직한 비교입니다:
실제 은행 레지스트리에 대한 프로덕션 검증에 가장 적합합니다. 이러한 서비스는 IBAN이 단순히 형식이 올바른지가 아니라 실제 활성 계좌에 해당하는지 확인합니다.
사용 시기: IBAN이 구조적으로 유효한지 뿐만 아니라 실제로 존재하고 결제를 받을 수 있는지 확인해야 할 때.
제한 사항: 비용이 듭니다(일반적으로 API 호출당 가격), 통합 작업이 필요하며, 개발 중에는 여전히 테스트 IBAN이 필요합니다. 이것이 바로 이 도구가 유용한 이유입니다.
애플리케이션 코드에 내장된 검증에 가장 적합합니다. JavaScript용 ibantools 또는 Python용 python-stdnum과 같은 라이브러리는 검증 및 생성 기능을 모두 제공합니다.
사용 시기: 빌드 또는 런타임 검증의 일부로 프로그래밍 방식 접근이 필요할 때.
제한 사항: 통합에 개발 노력이 필요하며, 디버깅 중 특정 IBAN을 수동으로 테스트할 수 있는 빠른 방법이 여전히 필요합니다. 이때 웹 도구가 테스트 스크립트를 작성하는 것보다 더 빠릅니다.
SWIFT에서 유지 관리하는 공식 IBAN 레지스트리는 모든 국가의 형식과 검증 규칙을 나열합니다. 이는 권위 있는 출처입니다.
사용 시기: IBAN 지원을 처음부터 구현하고 공식 사양이 필요할 때.
제한 사항: 이는 문서일 뿐, 도구가 아닙니다. 여전히 해당 사양을 기반으로 IBAN을 실제로 생성하고 검증할 무언가를 구축하거나 찾아야 합니다.
많은 국가 은행에서 국가별 검증기(예: 독일 IBAN의 분데스방크)를 제공합니다. 이들은 해당 국가에 대해 매우 정확합니다.
사용 시기: 한 국가에서만 작업하고 은행 수준의 검증 세부 정보가 필요할 때.
제한 사항: 단일 국가에 초점을 맞춥니다. 국제 결제 시스템을 구축하는 경우 각 국가에 대한 검증기가 필요합니다.
API 통합 없이 빠른 테스트가 필요할 때 이 도구를 사용하세요. 개발 및 디버깅 중 즉시 유효한 테스트 데이터를 생성하거나 특정 IBAN이 검증에 실패하는 이유를 확인해야 할 때 특히 유용합니다. 코드베이스의 프로덕션 수준 검증 라이브러리를 대체하지는 않지만, 일회용 테스트 스크립트를 작성하는 것보다 빠릅니다.
IBAN은 국제 은행 계좌 번호(International Bank Account Number)의 약자로, 국제표준화기구(ISO)에서 국가 간 지불에서 오류를 줄이기 위해 만든 표준화된 형식입니다. IBAN 이전에는 각 국가마다 고유의 계좌번호 형식을 사용해 잦은 실수와 이체 실패가 발생했습니다. IBAN은 국가 코드와 검증 숫자를 추가하여 자금 이동 전 오류를 잡아냅니다.
생성된 IBAN은 수학적으로 정확하며 ISO 13616에 정의된 MOD 97 검증 알고리즘을 통과합니다. 각 국가별 구조를 정확히 따릅니다. 하지만 이들은 무작위로 생성되며 실제 은행 계좌와 연결되지 않습니다. 바로 이 점 때문에 테스트에 안전합니다. 실수로 실제 계좌에 접근하지 않기 때문입니다.
현재 독일, 영국, 프랑스, 스페인, 이탈리아, 네덜란드, 스위스, 오스트리아, 벨기에, 폴란드 등 10개 유럽 국가를 지원합니다. 이 국가들은 유럽 결제 시스템에서 가장 흔히 볼 수 있는 IBAN 형식을 커버합니다. 다른 국가가 필요하다면 피드백 양식을 통해 추가 요청할 수 있습니다.
절대 안 됩니다. 이는 테스트용 IBAN일 뿐입니다. 형식 검증은 통과하지만 실제 은행 계좌와 연결되어 있지 않습니다. 실제 거래에 사용하면 지불 실패나 거부가 발생합니다. 이들은 개발, 테스트, 교육 목적으로만 사용됩니다.
검증기는 순차적으로 4가지 검사를 수행합니다:
어느 검사라도 실패하면 무엇이 잘못되었는지 설명하는 특정 오류 메시지가 표시됩니다.
(나머지 번역은 동일한 방식으로 계속됩니다)
DE89370400440532013000와 같은 IBAN을 보고 각 부분의 의미를 궁금해한 적 있나요? 다음은 모든 IBAN을 해독하는 방법입니다:
1단계: 국가 코드 (처음 2자)
DE = 독일2단계: 검증 숫자 (다음 2자)
89 = 계산된 체크섬3단계: 은행 코드 (국가마다 다름)
37040044 = 8자리 은행 식별자4단계: 계좌번호 (나머지 문자)
0532013000 = 해당 은행의 실제 계좌번호국가마다 BBAN 부분을 다르게 구성합니다. 영국 IBAN은 은행 코드와 계좌번호 사이에 6자리 정렬 코드(지점 식별자)를 포함합니다. 프랑스 IBAN은 은행 코드, 지점 코드, 계좌번호를 검증 키와 함께 결합합니다. 이러한 차이점을 이해하는 것은 IBAN을 프로그래밍적으로 분석할 때 중요합니다.
IBAN 검증을 구현할 때 다음과 같은 문제를 반복적으로 마주치게 됩니다:
원인: MOD 97 계산 결과가 1과 같지 않습니다. 체크 숫자가 잘못되었거나 IBAN의 다른 부분에 오류가 있습니다.
해결 방법: 모든 오타를 수정한 후 다시 검증을 실행하세요. IBAN의 어느 한 문자라도 잘못되면 체크 숫자 검증에 실패합니다. 이는 데이터 입력 오류를 잡기 위한 설계입니다.
원인: IBAN의 문자 수가 해당 국가 코드에 비해 너무 많거나 적습니다.
해결 방법: 국가 코드가 의도한 국가와 일치하는지 확인하세요. 독일 IBAN은 항상 22자, 영국 IBAN은 22자, 프랑스 IBAN은 27자입니다. 누락되거나 추가된 문자는 잘림 또는 잘못된 데이터를 나타냅니다.
원인: 해당 위치에 있으면 안 되는 문자(예: 숫자만 허용되는 곳에 문자가 있는 경우)입니다.
해결 방법: 국가별 형식을 확인하세요. 예를 들어, 독일 IBAN은 국가 코드와 체크 숫자 이후 모두 숫자이며, 영국 IBAN은 은행 코드에 4개의 문자를 포함합니다.
원인: 처음 두 글자가 인식된 국가 코드가 아니거나 검증기에서 지원되지 않습니다.
해결 방법: 국가 코드 철자를 확인하세요. 일반적인 실수로는 UK 대신 GB, 또는 국가 코드 대신 EN을 사용하는 것입니다. 이 도구는 10개의 유럽 국가를 지원하며, 프로덕션 검증기는 모든 SWIFT 레지스트리 국가를 지원해야 합니다.
중요한 구분: 검증은 IBAN이 구조적으로 올바른지 확인하며, 계좌의 실제 존재 여부는 확인하지 않습니다. IBAN은 모든 검증 검사를 통과할 수 있지만 실제 은행 계좌에 해당하지 않을 수 있습니다. 프로덕션 결제 시스템의 경우 형식 검증 이상의 추가 확인이 필요합니다.
애플리케이션에 IBAN 지원을 구축하고 있다면, 다음은 여러 언어로 된 검증된 코드 예시입니다. 이러한 구현은 프로덕션에서 마주치게 될 엣지 케이스를 처리합니다:
1function validateIban(iban) {
2 // 공백 제거 및 대문자로 변환
3 const cleanedIban = iban.replace(/\s/g, '').toUpperCase();
4
5 // 기본 형식 확인
6 if (!/^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$/.test(cleanedIban)) {
7 return false;
8 }
9
10 // 재배열 및 문자를 숫자로 변환
11 const rearranged = cleanedIban.substring(4) + cleanedIban.substring(0, 4);
12 const converted = rearranged.split('').map(char => {
13 if (/[A-Z]/.test(char)) {
14 return (char.charCodeAt(0) - 55).toString();
15 }
16 return char;
17 }).join('');
18
19 // mod 97 계산
20 let remainder = 0;
21 for (let i = 0; i < converted.length; i++) {
22 remainder = (remainder * 10 + parseInt(converted[i], 10)) % 97;
23 }
24
25 return remainder === 1;
26}
27
28// 사용 예시
29console.log(validateIban('DE89 3704 0044 0532 0130 00')); // true
30console.log(validateIban('GB29 NWBK 6016 1331 9268 19')); // true
31console.log(validateIban('DE89 3704 0044 0532 0130 01')); // false (잘못된 체크 숫자)
321def validate_iban(iban):
2 # 공백 제거 및 대문자로 변환
3 iban = iban.replace(' ', '').upper()
4
5 # 기본 형식 확인
6 if not (len(iban) > 4 and iban[:2].isalpha() and iban[2:4].isdigit()):
7 return False
8
9 # 처음 4자리를 끝으로 이동
10 rearranged = iban[4:] + iban[:4]
11
12 # 문자를 숫자로 변환 (A=10, B=11, ..., Z=35)
13 converted = ''
14 for char in rearranged:
15 if char.isalpha():
16 converted += str(ord(char) - 55)
17 else:
18 converted += char
19
20 # mod 97이 1인지 확인
21 return int(converted) % 97 == 1
22
23# 사용 예시
24print(validate_iban('DE89 3704 0044 0532 0130 00')) # True
25print(validate_iban('GB29 NWBK 6016 1331 9268 19')) # True
26print(validate_iban('DE89 3704 0044 0532 0130 01')) # False (잘못된 체크 숫자)
271public class IbanValidator {
2 public static boolean validateIban(String iban) {
3 // 공백 제거 및 대문자로 변환
4 String cleanedIban = iban.replaceAll("\\s", "").toUpperCase();
5
6 // 기본 형식 확인
7 if (!cleanedIban.matches("[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}")) {
8 return false;
9 }
10
11 // 처음 4자리를 끝으로 이동
12 String rearranged = cleanedIban.substring(4) + cleanedIban.substring(0, 4);
13
14 // 문자를 숫자로 변환
15 StringBuilder converted = new StringBuilder();
16 for (char c : rearranged.toCharArray()) {
17 if (Character.isLetter(c)) {
18 converted.append(c - 'A' + 10);
19 } else {
20 converted.append(c);
21 }
22 }
23
24 // mod 97 계산
25 BigInteger numeric = new BigInteger(converted.toString());
26 return numeric.mod(BigInteger.valueOf(97)).intValue() == 1;
27 }
28
29 public static void main(String[] args) {
30 System.out.println(validateIban("DE89 3704 0044 0532 0130 00")); // true
31 System.out.println(validateIban("GB29 NWBK 6016 1331 9268 19")); // true
32 System.out.println(validateIban("DE89 3704 0044 0532 0130 01")); // false
33 }
34}
351function generateIban(countryCode) {
2 const countryFormats = {
3 'DE': { length: 22, bbanPattern: '8n10n' },
4 'GB': { length: 22, bbanPattern: '4a6n8n' },
5 'FR': { length: 27, bbanPattern: '5n5n11c2n' }
6 // 필요에 따라 더 많은 국가 추가
7 };
8
9 if (!countryFormats[countryCode]) {
10 throw new Error(`국가 코드 ${countryCode}는 지원되지 않습니다`);
11 }
12
13 // 국가 패턴에 따라 무작위 BBAN 생성
14 let bban = '';
15 const pattern = countryFormats[countryCode].bbanPattern;
16 let i = 0;
17
18 while (i < pattern.length) {
19 const count = parseInt(pattern.substring(i + 1), 10);
20 const type = pattern[i];
21
22 if (type === 'n') {
23 // 숫자 문자 생성
24 for (let j = 0; j < count; j++) {
25 bban += Math.floor(Math.random() * 10);
26 }
27 } else if (type === 'a') {
28 // 알파벳 문자 생성
29 for (let j = 0; j < count; j++) {
30 bban += String.fromCharCode(65 + Math.floor(Math.random() * 26));
31 }
32 } else if (type === 'c') {
33 // 영숫자 문자 생성
34 for (let j = 0; j < count; j++) {
35 const isLetter = Math.random() > 0.5;
36 if (isLetter) {
37 bban += String.fromCharCode(65 + Math.floor(Math.random() * 26));
38 } else {
39 bban += Math.floor(Math.random() * 10);
40 }
41 }
42 }
43
44 i += 2;
45 }
46
47 // 체크 숫자 계산
48 const checkDigits = calculateCheckDigits(countryCode, bban);
49
50 return countryCode + checkDigits + bban;
51}
52
53function calculateCheckDigits(countryCode, bban) {
54 // 체크 숫자 '00'으로 초기 IBAN 생성
55 const initialIban = countryCode + '00' + bban;
56
57 // 재배열 및 문자를 숫자로 변환
58 const rearranged = bban + countryCode + '00';
59 const converted = rearranged.split('').map(char => {
60 if (/[A-Z]/.test(char)) {
61 return (char.charCodeAt(0) - 55).toString();
62 }
63 return char;
64 }).join('');
65
66 // 98에서 mod 97 빼기
67 let remainder = 0;
68 for (let i = 0; i < converted.length; i++) {
69 remainder = (remainder * 10 + parseInt(converted[i], 10)) % 97;
70 }
71
72 const checkDigits = (98 - remainder).toString().padStart(2, '0');
73 return checkDigits;
74}
75
76// 사용 예시
77console.log(generateIban('DE')); // 유효한 독일 IBAN 생성
78console.log(generateIban('GB')); // 유효한 영국 IBAN 생성
791import random
2import string
3
4def generate_iban(country_code):
5 country_formats = {
6 'DE': {'length': 22, 'bban_format': '8n10n'},
7 'GB': {'length': 22, 'bban_format': '4a6n8n'},
8 'FR': {'length': 27, 'bban_format': '5n5n11c2n'}
9 # 필요에 따라 더 많은 국가 추가
10 }
11
12 if country_code not in country_formats:
13 raise ValueError(f"국가 코드 {country_code}는 지원되지 않습니다")
14
15 # 국가 형식에 따라 무작위 BBAN 생성
16 bban = ''
17 format_str = country_formats[country_code]['bban_format']
18 i = 0
19
20 while i < len(format_str):
21 count = int(''.join(c for c in format_str[i+1:] if c.isdigit()))
22 type_char = format_str[i]
23
24 if type_char == 'n': # 숫자
25 bban += ''.join(random.choices(string.digits, k=count))
26 elif type_char == 'a': # 알파벳
27 bban += ''.join(random.choices(string.ascii_uppercase, k=count))
28 elif type_char == 'c': # 영숫자
29 bban += ''.join(random.choices(string.ascii_uppercase + string.digits, k=count))
30
31 i += 1 + len(str(count))
32
33 # 체크 숫자 계산
34 check_digits = calculate_check_digits(country_code, bban)
35
36 return country_code + check_digits + bban
37
38def calculate_check_digits(country_code, bban):
39 # 체크 숫자 계산을 위한 문자열 생성
40 check_string = bban + country_code + '00'
41
42 # 문자를 숫자로 변환 (A=10, B=11, ..., Z=35)
43 numeric = ''
44 for char in check_string:
45 if char.isalpha():
46 numeric += str(ord(char.upper()) - 55)
47 else:
48 numeric += char
49
50 # 98에서 mod 97 빼기
51 remainder = int(numeric) % 97
52 check_digits = str(98 - remainder).zfill(2)
53
54 return check_digits
55
56# 사용 예시
57print(generate_iban('DE')) # 유효한 독일 IBAN 생성
58print(generate_iban('GB')) # 유효한 영국 IBAN 생성
59결제 시스템을 위한 테스트 데이터가 필요하신가요? 위의 지원되는 국가에서 유효한 IBAN을 생성하거나, 기존 IBAN을 붙여넣어 해당 구조를 확인하세요. 이 도구는 전적으로 브라우저에서 실행되며—회원가입, API 키, 서버로 데이터 전송이 전혀 없습니다.
간단한 팁: 엣지 케이스를 테스트하기 위해 여러 국가의 IBAN을 생성하세요. 실제 결제 시스템은 다양한 형식을 처리하며, 단 하나의 국가 형식으로만 테스트하는 것은 프로덕션 버그의 흔한 원인입니다.
귀하의 워크플로에 유용할 수 있는 더 많은 도구를 발견하세요.