1. 소개
이 기사에서는 regex 를 사용하여 신용 카드 번호에서 신용 카드 유형을 식별하는 방법을 배웁니다 .
그런 다음 Luhn 알고리즘 과 이를 사용하여 신용 카드 번호가 유효한지 확인하는 방법에 대해 알아봅니다.
2. 카드 번호의 앞자리 숫자는 무엇을 알려줍니까?
기본 계정 번호(PAN)는 신용 카드 번호의 또 다른 이름입니다.
PAN은 카드 발급사에 따라 숫자가 다를 수 있지만 일반적으로 16자리 입니다.
현재 발급자 식별 번호(IIN)는 PAN의 처음 6자리입니다 . 선행 숫자 1개와 5개 숫자로 구성됩니다.
앞으로 변할 가능성이 있기 때문에 이것이 현재 상황임을 강조하는 것이 중요합니다. IIN을 처음 8자리로 늘리기 위한 작업은 이르면 2015년에 시작되었습니다.
IIN만 보고 신용 카드 유형을 결정하는 방법을 살펴보겠습니다.
2.1. 선행 숫자는 우리에게 무엇을 말합니까?
주요 산업 식별자는 카드 번호의 첫 번째 숫자입니다.
이름에서 알 수 있듯이 카드 번호의 첫 번째 숫자를 보고 카드가 속한 산업을 결정할 수 있습니다.
- 1, 2 – 항공사(기타)
- 3 – 여행 및 엔터테인먼트
- 4, 5 – 뱅킹
- 6 – 소매 및 은행업
- 7 – 연료 산업
- 8 – 의료 및 통신
- 9 – 국가 당국
- 0 – 기타, 미래를 위해 예약됨
이제 IIN을 사용하여 카드 발급자를 식별하는 방법을 살펴보겠습니다.
2.2. IIN에서 카드 유형을 어떻게 결정합니까?
1989년부터 PAN 할당 방법을 정의하는 국제 표준 이 있었습니다. IIN의 공식 등록부는 공개적으로 사용할 수 없습니다.
다행히 대부분의 주요 카드 발급기관은 널리 알려진 IIN 범위를 가지고 있으므로 정규식을 사용하여 IIN을 카드 발급기관과 일치시킬 수 있습니다 .
정규식을 살펴보기 전에 IIN 범위 List이 지속적으로 변경 된다는 점을 기억하십시오 .
이를 수행하기 위해 응용 프로그램을 작성하는 경우 응용 프로그램을 최신 상태로 유지하는 방법을 고려해야 합니다.
또는 우리가 관리할 수 있는 것보다 더 많은 카드 유형을 포함하고 더 철저하게 테스트된 여러 사용 가능한 오픈 소스 라이브러리 중 하나를 가져오도록 선택할 수 있습니다. 예를 들어 Stripe API를 사용하면 카드 처리가 우리를 위해 관리된다는 의미입니다.
2.3. Regex를 사용하여 카드 발급사 식별
Visa 카드를 식별해 봅시다.
Visa 카드 번호는 4로 시작하므로 Visa 카드를 식별하는 간단한 정규식은 입니다 ^4[0-9]{0,}$
.
이 예에서는 숫자의 길이를 확인하지 않았습니다. 지금까지 우리는 카드 번호가 유효하다고 가정했으므로 길이는 우리가 여기서 검증하는 것이 아닙니다.
유사한 패턴을 적용하여 다른 카드 발급자를 식별할 수 있습니다. 예를 들어 American Express 카드는 34 또는 37로 시작하므로 ^3[47][0-9]{0,}$
.
일부 카드 발급사는 IIN 범위가 더 넓습니다.
Mastercard의 카드는 일반적으로 51-55로 시작하지만 지난 10년 동안 BIN 범위 222100-272099 내에서 카드를 도입했습니다.
이것은 우리에게 ^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$
.
유사한 패턴을 사용하여 IIN 범위가 알려진 모든 카드 발급자의 카드를 식별할 수 있습니다.
3. 카드 번호의 중간 숫자는 무엇을 알려줍니까?
전체 PAN은 문제 식별 번호(IIN), 개인 계정 식별 번호 및 체크섬 숫자의 세 부분으로 구성됩니다.
IIN과 마지막 숫자 사이에는 개인 계정 식별 번호가 있습니다.
발행자는 이러한 중간 숫자의 의미를 정의하므로 발행자마다 다른 의미를 갖습니다.
카드 번호에 연결된 계정 유형과 같은 정보를 나타냅니다.
4. 카드 번호의 마지막 숫자는 무엇을 알려줍니까?
체크섬 숫자는 카드 번호의 마지막 숫자입니다.
유용하게도 체크섬 숫자를 사용하면 Luhn 알고리즘 을 사용 하여 유효하지 않은 카드 번호를 신속하게 식별할 수 있습니다.
Hans Peter Luhn은 1950년대 후반에 Luhn 알고리즘을 개발했습니다.
오늘날 우리가 사용하는 모든 최신 신용 카드 번호를 생성하는 데 사용되어 모든 카드 번호가 특정 속성을 공유하도록 합니다.
Luhn 알고리즘은 카드 번호의 모든 숫자를 사용합니다. 즉, 한 자리 숫자만 잘못 입력한 경우에도 주어진 카드 번호가 유효하지 않은 경우를 쉽게 판단하는 데 사용할 수 있습니다.
이렇게 하면 불필요한 카드 처리 기능의 수를 제한할 수 있습니다. 이는 우리가 요청한 거래당 비용이 청구되는 경우에 특히 중요합니다!
Java 응용 프로그램에서 Luhn 알고리즘을 사용하는 방법을 살펴보겠습니다.
4.1. Luhn 알고리즘을 사용하여 카드 번호를 확인하려면 어떻게 해야 합니까?
Luhn 알고리즘을 사용하여 주어진 카드 번호를 확인하는 것과 관련된 단계를 살펴보겠습니다.
IIN을 포함한 전체 신용 카드 번호를 가져와야 합니다.
가장 오른쪽 숫자부터 시작하여 두 번째 숫자마다 특별한 단계를 수행하여 모든 숫자를 함께 추가합니다.
오른쪽부터 시작하므로 카드 번호를 거꾸로 순환하여 모든 두 번째 숫자를 식별해야 합니다.
for (int i = cardNumber.length() - 1; i >= 0; i--) {
int digit = Integer.parseInt(cardNumber.substring(i, i + 1));
if ((cardNumber.length() - i) % 2 == 0) {
digit = doubleAndSumDigits(digit);
}
sum += digit;
}
두 번째 자릿수마다 두 배로 계산한 다음 나머지 자릿수를 합산해야 합니다.
(일반적인 16자리 대신) 4자리의 짧은 예에서 이것이 어떻게 작동하는지 봅시다. 숫자 8642가 유효한 카드 번호인지 확인합시다.
가장 오른쪽 숫자부터 시작하여 매 두 번째 숫자를 두 배로 만듭니다.
- 따라서 2(오른쪽에서 첫 번째 숫자)의 경우 변경 사항이 없습니다.
- 다음으로 두 번째 숫자인 4를 두 배로 하여 8을 얻습니다.
- 그 다음에는 변화가 없는 세 번째 숫자인 6입니다.
- 마지막으로 네 번째 숫자인 8을 두 배로 하여 16을 얻습니다.
숫자를 두 배로 하면 두 자리 숫자가 되는 경우 다시 한 자리 숫자로 돌아가기 위해 추가 단계를 수행해야 합니다. 이러한 숫자를 함께 더하여 한 자리 숫자를 생성하므로 16은 이것은 1+6=7이 됩니다.
이 단계는 빼기 9 와 동일 하므로 코드에서 다음과 같이 구현할 수 있습니다.
private static int doubleAndSumDigits(int digit) {
int ret = digit * 2;
if (ret > 9) {
ret = digit - 9;
}
return ret;
}
마지막으로 예제를 완성하기 위해 각 숫자를 더해 봅시다: 2 + 8 + 6 + 7 = 23.
Luhn 알고리즘의 결과가 10으로 나누어지면 카드 번호가 유효할 수 있습니다.
확인 결과 다음과 같이 반환됩니다.
return sum % 10 == 0;
우리의 경우 23은 10으로 나눌 수 없으므로 8642는 유효한 카드 번호가 아닙니다.
이 예에서 마지막 숫자 2는 체크섬 숫자입니다.
실제 카드 번호의 경우 체크섬 숫자는 Luhn 알고리즘을 사용하여 계산됩니다.
예를 들어 체크섬 숫자를 9로 변경하여 8649를 제공하면 Luhn 알고리즘의 결과는 30이며 10으로 나눌 수 있으므로 8649는 위의 Luhn 검사를 통과합니다.
4.2. Luhn 알고리즘의 한계가 있습니까?
물론 우리가 확인한 결과 8649가 확실히 유효한 카드 번호라는 의미는 아닙니다. 당사의 확인을 통과하더라도 해당 카드 발급사에서 실제 카드로 발급되지 않았을 수 있습니다.
카드 번호가 진짜인지 확실하게 확인할 수 있는 유일한 방법은 카드 발급사에 문의하는 것입니다.
Luhn 알고리즘은 주어진 카드 번호가 확실히 유효하지 않은 경우 확인하는 유용한 방법을 여전히 제공합니다.
그러나 Luhn 검사에서 카드 번호의 오타를 감지하지 못하는 경우가 몇 가지 있습니다 .
다행스럽게도 이러한 극단적인 경우는 드물기 때문에 실제 생활에서 접할 가능성은 거의 없습니다.
마지막으로 Luhn 알고리즘은 카드 번호의 길이를 고려하지 않습니다 .
실제로 우리는 8649가 Luhn 검사를 통과하더라도 실제 신용 카드 번호가 되기에는 너무 짧다는 것을 알고 있습니다.
카드 번호 길이에 대한 추가 검사를 구현할 수 있지만 각 카드 발급자의 번호 길이가 다를 수 있음을 기억해야 합니다.
5. 결론
이 기사에서는 카드 번호의 각 부분이 신용 카드 계정에 대해 무엇을 알 수 있는지 살펴보았습니다.
먼저 앞자리 숫자에 정규식 패턴을 일치시켜 카드 발급자를 식별하는 방법을 배웠습니다. 다음으로 카드 번호 중간이 계정에 대해 알려주는 내용을 이해하려면 발행자별 정보가 필요하다는 것을 확인했습니다. 마지막으로 Luhn 알고리즘이 어떻게 작동하는지 살펴보고 주어진 카드 번호를 확인하는 코드를 구현했습니다.
항상 그렇듯이 예제 프로젝트는 GitHub 에서 사용할 수 있습니다 .