메뉴

IBAN 구조와 mod-97 검증

IBAN이 국가 코드, ISO 체크 디지트, BBAN으로 나뉘는 구조를 설명하고, mod-97 검증이 무엇을 확인하는지와 왜 국가마다 길이가 다른지 정리합니다.

게시일

  • IBAN
  • 번호 검증

해외 송금 화면에서 처음 보는 긴 문자열을 마주치면 어디까지가 나라를 뜻하고 어디부터가 계좌인지 감이 오지 않습니다. IBAN 구조를 알면 그 문자열을 세 토막으로 나눠 읽을 수 있습니다. 이 글에서는 각 토막이 무엇을 담는지, 두 자리 검증값이 어떻게 계산되는지, 그리고 검증을 통과했다는 사실이 어디까지 말해 주는지 살펴봅니다.

IBAN은 어떤 토막으로 나뉘나요?

국제 표준이 정하는 것은 앞의 두 토막입니다. 맨 앞 두 글자는 국가 코드이고, 그다음 두 자리는 그 나라의 번호 체계를 식별하는 검증값입니다. 나머지 전부는 BBAN이라고 부르며, 이 안에 계좌 식별 정보가 들어갑니다.

위치 이름 무엇을 담는가
1–2번째 국가 코드 어느 나라의 체계인지
3–4번째 검증값 앞뒤 전체로 계산한 두 자리
5번째 이후 BBAN 계좌·지점 등 국가별 식별 정보

중요한 점은 세 번째 토막의 내부 구조와 전체 길이가 국제 표준이 아니라 각국이 정한다는 사실입니다. 국제 표준은 앞의 두 토막과 계산 방식만 통일하고, 나머지는 나라마다 다르게 두도록 남겨 두었습니다. 그래서 길이를 하나로 고정한 규칙은 다른 나라의 번호를 걸러내게 됩니다.

국가 코드와 두 자리 검증값은 어떻게 정해지나요?

국가 코드는 이미 널리 쓰이는 두 글자 약속을 그대로 가져옵니다. 문제는 그다음 두 자리입니다. 이 값은 나라 정보가 아니라 계산 결과이며, 앞의 국가 코드와 뒤따르는 BBAN 전체를 재료로 삼아 나옵니다.

계산이 전체를 대상으로 하므로, BBAN 중 한 글자만 바뀌어도 두 자리 검증값은 더 이상 맞지 않습니다. 즉 두 자리 검증값은 계좌 정보 자체를 보호하는 장치가 아니라, 옮겨 적는 과정에서 생긴 변형을 드러내는 장치입니다. 계좌가 존재하는지, 송금을 받을 수 있는지는 이 두 자리가 답하지 않습니다.

BBAN 안에 또 다른 검증값이 들어 있나요?

들어 있는 나라가 많습니다. 국제 표준이 요구하는 두 자리와는 별개로, 각국이 자기 번호 체계를 관리하면서 BBAN 안에 자국용 검증값을 넣어 두는 경우가 흔합니다. 이런 나라의 IBAN은 두 겹의 산술 제약을 동시에 만족해야 합니다.

이 구조는 검증 결과를 설명할 때 실질적인 차이를 만듭니다. 어느 쪽이 어긋났는지 밝히지 않고 그냥 실패라고만 적으면, 사용자는 국가 코드를 의심해야 하는지 계좌 부분을 의심해야 하는지 알 수 없습니다. 그래서 국제 검증값과 국가 검증값을 각각 확인하고 각각의 결과를 보여주는 편이 정확합니다. 이 구분이 왜 필요한지는 번호 검증의 원리에서 층별 판정으로 다시 설명합니다.

글자를 숫자로 바꾸는 mod-97 계산은 어떻게 하나요?

앞부분을 뒤로 옮기고 글자를 숫자로 바꾼 다음, 큰 수를 나눠 나머지를 보는 방식입니다. 국가 코드 두 글자와 검증값 두 자리를 문자열 끝으로 옮기고, 남아 있는 글자 가운데 숫자가 아닌 것은 정해진 규칙에 따라 두 자리 숫자로 바꿔 이어 붙입니다. 이렇게 만든 긴 숫자열을 정해진 수로 나눈 나머지가 특정 값이면 검증이 성립합니다.

핵심은 순서와 변환 규칙이 공개되어 있다는 점입니다. 누구나 같은 재료로 같은 결과를 얻을 수 있으므로, 발급한 쪽과 확인하는 쪽이 서로 다른 도구를 써도 결론이 일치합니다. 반대로 말하면 규칙을 조금이라도 다르게 적용하면 멀쩡한 값이 실패로 나오므로, 표준이 공개한 순서를 그대로 따르는 일이 중요합니다. 글자와 숫자를 오가는 이 계열의 특성은 체크 디지트 알고리즘 편에서 가족 전체의 관점으로 정리했습니다.

검증을 통과하면 계좌가 있다는 뜻인가요?

아닙니다. 통과가 말해 주는 것은 그 문자열이 정해진 산술 규칙과 형식을 스스로 만족한다는 사실 하나입니다. 그 계좌가 실제로 개설되어 있는지, 어떤 사람이나 회사의 것인지, 지금 송금을 받을 수 있는지는 이 계산의 사정거리 밖입니다.

이 구분이 실무에서 특히 중요한 이유는 두 종류의 확인이 겉보기에 비슷하기 때문입니다. 하나는 문자열 자체를 계산해 보는 일이고, 다른 하나는 등록 정보를 조회하는 일입니다. 앞은 빠르고 오프라인에서도 되지만 뒤는 상대 시스템에 물어야 하고 실패할 수도 있습니다. 화면이나 문서에서 두 가지를 같은 말로 뭉뚱그리면, 계산만 통과한 값이 확인된 계좌처럼 읽힙니다. 알고리즘 자체가 공개되지 않은 체계에서는 형식만 확인할 수 있다는 점도 함께 기억할 필요가 있습니다. 그 경우의 정직한 문구는 체크 디지트가 없는 번호에서 다룹니다.

개발자를 위한 메모: 길이 차이를 어떻게 다룰까

  • 길이를 하나의 상수로 두지 말고, 국가 코드를 먼저 읽어 그 나라의 규칙을 찾는 구조로 만듭니다. 문자열을 훑는 순서 자체가 달라집니다.
  • 규칙은 자료로 두고 계산 절차와 분리합니다. 나라가 늘거나 길이가 바뀔 때 계산 코드를 열지 않아도 됩니다.
  • 정리 단계에서 공백과 하이픈을 먼저 걷어냅니다. 사람이 붙여 넣는 값에는 네 글자마다 띄어쓰기가 들어 있는 경우가 흔합니다.
  • 대소문자를 통일한 뒤 계산합니다. 같은 값이 대문자와 소문자로 다르게 판정되면 사용자는 이유를 알 수 없습니다.
  • 국가 검증값이 있는 나라인지 여부를 결과에 함께 담습니다. 어느 층에서 멈췄는지가 사용자에게는 수정 안내가 됩니다.

시험 자료를 만들 때는 정상 값을 하나 두고, 거기서 한 자리만 바꾼 값을 함께 준비합니다. 자리를 바꿔 넣은 값도 하나 넣어 두면 국가 검증값과 전체 검증값이 각각 무엇을 잡아내는지 확인할 수 있습니다. 같은 값에 공백을 넣은 형태와 대소문자를 섞은 형태도 함께 시험하면 정리 단계가 빠졌는지 곧바로 드러납니다.

여기서 설명한 문자열과 계산 예시는 mod-97의 진행 방식을 보여 주기 위해 지어낸 합성 값입니다. 실제 계좌나 기관을 가리키지 않으며, 이 글의 내용을 실제 송금 가능 여부의 판단 근거로 사용해서는 안 됩니다.

다음 단계

계산 순서를 눈으로 따라가 보고 싶다면 번호 검증 도구에 구분 기호가 섞인 값을 붙여넣고 정리 결과가 어떻게 달라지는지 비교해 보세요. 같은 값이 대문자와 소문자로 들어갔을 때 판정이 흔들리지 않는지도 함께 확인해 볼 만합니다.

이어 읽기

카드번호·신분증번호 검증기 관련 글