미국 SSN 형식은 아홉 자리 숫자를 세 부분으로 나누어 적는 관행으로 굳어져 있습니다. 이 글에서는 그 세 부분이 각각 무엇을 뜻하는지, 영영 발급되지 않는 번호대가 무엇인지, 그리고 이 번호를 신분증처럼 다루면 왜 위험한지 살펴봅니다. 시험 데이터를 만드는 사람이라면 어디까지 검사해야 하고 어디부터는 검사해도 소용이 없는지도 함께 짚습니다.
미국 SSN은 어떻게 생겼나요?
SSN은 아홉 자리 숫자입니다. 관행적으로 세 자리, 두 자리, 네 자리로 끊어 세 부분으로 적고 사이에 붙임표를 넣습니다. 각 부분을 지역 번호, 그룹 번호, 일련 번호라고 부르지만, 이름이 그렇게 붙었다고 해서 지금의 값이 그 뜻을 담고 있지는 않습니다.
예전에는 앞의 세 자리가 발급 지역을 가리킨다고 여겨졌습니다. 하지만 지금은 번호가 무작위로 배정되므로 번호만 보고 어디서 발급되었는지, 언제 태어난 사람인지 알아낼 수 없습니다. 오래된 자료를 다룰 때 이 차이를 잊으면 엉뚱한 추론을 하게 됩니다.
발급되지 않는 번호대가 있나요?
있습니다. 미국 사회 보장국은 특정 구간을 아예 쓰지 않는다고 밝히고 있습니다.
| 위치 | 쓰지 않는 값 |
|---|---|
| 첫 세 자리 | 000, 666, 900부터 999까지 |
| 가운데 두 자리 | 00 |
| 마지막 네 자리 | 0000 |
이 구간을 비워 두는 이유는 혼동을 막기 위해서입니다. 시험 데이터를 만들 때 이 값들이 실제로 나오면 형식만 보는 검사는 통과하지만 실제 발급 체계와는 어긋난 값이 됩니다. 검사 규칙이 이 구간을 걸러 내는지 한 번은 확인해 둘 만합니다.
SSN은 신분증인가요?
아닙니다. SSN은 납세와 사회 보장 기록을 연결하기 위해 만들어진 번호이고, 사진이 붙은 신분증이나 여권을 대신하지 않습니다. 미국에는 연방 차원의 주민 등록 번호가 따로 없기 때문에 SSN이 신분 확인의 대용으로 쓰이는 경우가 많지만, 그 관행이 SSN을 신원 증명 서류로 만들어 주지는 않습니다.
이 구분은 시험 데이터를 설계할 때도 중요합니다. 번호 형식이 맞다는 사실은 그 번호가 어떤 사람에게 발급되었다는 뜻도, 어떤 기관이 받아 준다는 뜻도 아닙니다. 나라마다 번호 체계가 어떻게 다른지는 국가별 신원 번호 길이에서 비교해 두었습니다.
붙임표를 넣은 표기와 붙여 적은 표기는 어떻게 다른가요?
같은 아홉 자리라도 세 부분으로 끊어 적은 값과 붙여 적은 값이 있습니다. 서류에서는 끊어 적는 표기가 흔하지만, 시스템끼리 주고받을 때는 구분 기호 없이 적는 경우도 많습니다. 두 표기를 서로 다른 값으로 저장하면 같은 사람의 기록이 두 건이 되고, 중복을 찾는 검사도 이를 잡아내지 못합니다.
입력란에서는 두 표기를 모두 받아들이고 저장할 때 한쪽으로 맞추는 편이 안전합니다. 어느 쪽으로 맞출지는 사정에 따라 다르므로 한 가지로 정하고 문서에 남겨 둡니다. 화면에 보여 줄 때는 끊어 적는 표기로 되돌리면 읽기 쉬워집니다.
검사 규칙도 한 표기를 기준으로 삼고, 다른 표기는 비교 전에 맞추는 단계에서 바꿉니다. 표기마다 검사를 따로 만들면 규칙이 두 벌이 되고, 한쪽만 고치는 실수가 생깁니다. 표기 문제는 형식 문제와 섞이기 쉬우므로 어느 쪽을 다루는 검사인지 구분해 두는 편이 좋습니다.
시험 데이터에서 SSN을 어떻게 다루나요?
시험용 번호는 실제 발급 구간과 겹치지 않는 값으로 만들거나, 애초에 쓰지 않는 구간을 골라 쓰는 편이 안전합니다. 실제 번호를 본 적이 있다면 그 값을 시험 데이터로 옮기지 마세요. 그 순간 시험 환경에 개인정보가 하나 생깁니다.
또 하나 자주 나오는 실수는 SSN을 나이의 근거로 쓰는 것입니다. 무작위 배정 이후에는 번호 안에 출생 정보가 없으므로, 나이를 확인해야 하는 화면은 생년월일을 따로 받아 계산해야 합니다. 번호의 앞자리로 연령대를 추정하는 코드가 남아 있다면 함께 걷어내야 합니다.
신원 생성기에서 미국 기록 만들어 보기
신원 생성기에서 미국을 고르면 주소, 우편번호, 전화번호, 공적 번호가 같은 지역 데이터에서 함께 만들어집니다. 미국의 주소가 어떤 순서로 조립되는지 궁금하다면 미국 국가 페이지에서 형식을 따로 확인할 수 있습니다.
여기서 만들어지는 값은 알고리즘이 합성한 것이며 실존하는 인물과 무관합니다. 시험용으로만 쓰고, 실제 인물을 사칭하거나 본인 확인 절차를 통과하는 데 사용하지 마세요.
개발자를 위한 메모: 검사는 형식과 예약 구간까지만
- 자릿수와 구분 기호를 확인하는 검사는 값싸고 효과가 큽니다. 붙임표를 넣은 표기와 넣지 않은 표기를 모두 받아들일지 먼저 정하세요.
- 예약 구간 검사는 형식 검사와 따로 둡니다. 예약 구간은 발급 규칙이고 자릿수는 표기 규칙이라 성격이 다릅니다.
- 앞의 세 자리로 발급 지역을 추정하는 코드는 넣지 마세요. 지금의 배정 방식에서는 그 추정이 틀립니다.
- 검사를 통과했다는 사실을 유효성 보증으로 표시하지 않습니다. 시험용 값이 실제 기관에서 받아들여질 것처럼 보이면 오해를 만듭니다.
- 시험 데이터에 실제 번호가 섞여 들어오는 것을 막는 검사를 따로 둡니다. 저장 전에 걸러 내는 편이 나중에 지우는 것보다 쉽습니다.
- 입력란의 길이 제한을 정할 때는 붙임표가 있는 표기를 기준으로 삼습니다. 열한 자까지만 받는 입력란은 붙임표를 넣은 값을 자릅니다.
- 표기를 맞추는 단계와 형식을 검사하는 단계를 분리합니다. 두 단계를 한 함수에 섞으면 어느 쪽에서 걸린 값인지 알기 어려워집니다.
- 경고 문구에 유효성 판단을 담지 않습니다. 형식이 맞다는 안내가 확인 완료처럼 읽히면 오해를 만듭니다.
다음 단계
여러 나라의 신원 기록이 필요하다면 신원 생성기에서 국가를 바꿔 가며 만들어 보고, 나라마다 번호의 길이와 문자 구성이 어떻게 달라지는지 비교해 보세요. 시험 데이터를 어떤 단위로 묶어 둘지 고민된다면 테스트 신원 데이터란 무엇인가를 이어서 읽어 보시길 권합니다.