·2분 읽기
카드번호 정규식 검증 — 비자·마스터카드·아멕스 실전 패턴
카드사별로 시작 숫자와 자릿수가 달라요. 비자, 마스터카드, 아멕스, 디스커버 각각의 정규식 패턴과 Luhn 검증까지 정리했어요.

🔍
정규식 테스터 바로 사용하기
정규표현식을 테스트하고 매치 결과를 확인하세요
→
카드번호 검증이 왜 어려운가
카드사마다 번호 규칙이 달라요. 비자는 4로 시작해 13 또는 16자리, 아멕스는 34/37로 시작해 15자리, 마스터카드는 51~55 또는 2221~2720으로 시작해 16자리예요.
정규식만으로는 80% 검증이 가능하고, 나머지 20%는 Luhn 알고리즘을 써야 완전해져요.
카드사별 정규식 패턴
주요 4대 카드사 패턴이에요.
- Visa: 4로 시작, 13 또는 16자리
- MasterCard: 51~55 또는 2221~2720으로 시작, 16자리
- American Express: 34 또는 37로 시작, 15자리
- Discover: 6011 또는 65XX로 시작, 16자리
공백과 하이픈을 허용하려면 입력을 replace로 먼저 정리하세요.
통합 검증 함수 (JavaScript)
function detectCardType(num) {
const clean = num.replace(/[^0-9]/g, '');
if (/^4[0-9]{12}([0-9]{3})?$/.test(clean)) return 'Visa';
if (/^5[1-5][0-9]{14}$/.test(clean)) return 'MasterCard';
if (/^3[47][0-9]{13}$/.test(clean)) return 'Amex';
if (/^6(?:011|5[0-9]{2})[0-9]{12}$/.test(clean)) return 'Discover';
return 'Unknown';
}
이 함수로 카드 입력 폼에서 실시간 카드사 감지가 가능해요.
Luhn 알고리즘으로 최종 검증
정규식 통과한 번호도 Luhn 체크를 해야 유효한 카드번호예요.
function luhnCheck(num) {
const digits = num.replace(/[^0-9]/g, '').split('').reverse().map(Number);
let sum = 0;
digits.forEach((d, i) => {
if (i % 2 === 1) {
d *= 2;
if (d > 9) d -= 9;
}
sum += d;
});
return sum % 10 === 0;
}
실제 결제 폼에서는 정규식 → Luhn → 카드사 BIN 테이블 조회 순으로 검증하는 게 표준이에요.
포매팅도 같이 처리하기
입력 중 자동으로 4자리씩 띄어 쓰기를 넣으면 UX가 좋아요.
function formatCard(num) {
const clean = num.replace(/[^0-9]/g, '');
return clean.match(/.{1,4}/g)?.join(' ') || '';
}
아멕스는 15자리라 4-6-5로 포매팅해요. 카드 종류 감지한 뒤 포맷을 다르게 적용하세요.
Toolkio Regex Tester로 안전하게 확인
정규식 작성 중 실제 카드번호를 넣기 꺼려지죠. Toolkio의 Regex Tester는 브라우저 안에서만 돌아가서 서버로 데이터가 가지 않아요.
카드번호 샘플은 4242 4242 4242 4242 같은 공개 테스트 번호만 쓰세요.