전화번호를 데이터베이스에 E.164 형식으로 저장해야 하는 이유
전화번호는 데이터베이스에 국가코드를 포함한 E.164 형태로 정규화해 저장하고, 하이픈과 공백이 있는 국내 표시는 화면에서만 만들어 쓰는 편이 좋습니다. 그래야 같은 번호의 중복 가입을 줄이고 국가별 SMS API 입력 형식을 일관되게 관리할 수 있습니다.
표시 문자열을 그대로 저장하면 01012345678, 010-1234-5678, +821012345678이 서로 다른 값이 됩니다. 원본 입력, 정규화 저장값, 사용자에게 보여 줄 표시값의 역할을 분리해야 합니다.
먼저 보는 핵심 요약
- E.164 저장값은 +와 국가코드, 국내 가입자 번호를 공백·하이픈 없이 사용합니다.
- 한국 휴대폰 번호를 +82로 바꿀 때 국내 접두사 0을 제거하지만 번호 종류별 규칙은 검증 라이브러리로 확인합니다.
- 형식이 맞는 번호와 실제로 사용 중인 번호는 다른 개념이며 OTP나 발신 확인이 필요합니다.
표시용 전화번호를 그대로 저장하면 생기는 문제
검색과 중복 판정이 문자열 모양에 좌우됩니다. 사용자가 국가번호를 붙이거나 하이픈 위치를 다르게 쓰면 같은 번호가 여러 계정으로 들어갈 수 있습니다. 국가가 다른 번호에서는 지역 접두사 규칙까지 달라 단순 숫자 제거만으로 해결되지 않습니다.
한국 번호를 +82로 바꿀 때 앞의 0을 빼는 이유
국내에서 쓰는 0은 장거리·국내 접속을 위한 접두사 역할을 하며 국제 번호에서는 국가코드 뒤에 그대로 두지 않는 방식이 일반적입니다. 예를 들어 010-1234-5678은 +821012345678 형태가 됩니다. 유선과 특수번호는 별도 규칙을 확인해야 합니다.
저장값과 화면 표시값을 분리하는 설계
DB에는 정규화된 값을 저장하고 화면에서는 사용자의 국가와 지역 관행에 맞춰 포맷팅합니다. 원본 입력을 감사 용도로 보관해야 한다면 별도 필드와 보관 기간을 정합니다. 검색 키는 정규화 값 하나를 기준으로 만들어야 합니다.
형식 검증이 실제 번호 인증은 아닌 이유
E.164 길이와 국가별 패턴을 만족해도 개통되지 않았거나 다른 사람의 번호일 수 있습니다. 가입과 비밀번호 복구처럼 소유 확인이 필요한 흐름에서는 SMS OTP 또는 통화 인증을 별도로 거쳐야 합니다.
단계별로 확인하는 방법
- 사용자 국가 확인하기
국가 선택값과 입력 문자열을 함께 받아 지역 규칙을 해석할 기준을 만듭니다.
- 번호 파싱과 정규화하기
검증된 전화번호 라이브러리나 포맷터로 국가코드를 포함한 E.164 값을 만듭니다.
- 정규화 값으로 중복 검사하기
공백·하이픈 없는 저장값에 고유 제약이나 검색 인덱스를 적용합니다.
- 표시와 소유 인증 분리하기
화면에는 지역 형식으로 보여 주고 중요한 기능은 OTP로 실제 소유를 확인합니다.
판단 기준을 한눈에 비교하기
| 확인 항목 | 판단 기준 |
|---|---|
| DB 저장 | +821012345678처럼 E.164 정규화 값을 기준으로 사용합니다. |
| 화면 표시 | 010-1234-5678처럼 사용 지역에 익숙한 형태로 렌더링합니다. |
| 원본 입력 | 필요한 경우 목적과 보관 기간을 정해 별도 보관하며 검색 기준으로 쓰지 않습니다. |
| 소유 확인 | 형식 검사와 별개로 SMS OTP·통화 등 실제 도달 확인을 수행합니다. |
실행 전 체크리스트
- 입력 번호의 국가를 확정할 수 있나요?
- 저장값에서 공백·하이픈을 제거했나요?
- 정규화 값으로 중복을 검사하나요?
- 형식 검증과 번호 소유 인증을 구분했나요?
주의할 점
E.164 형식이 맞는다고 실제 사용자의 번호라는 뜻은 아닙니다. 인증·결제·계정 복구에서는 소유 확인과 번호 변경 이력, 재사용 번호 위험을 별도로 관리하세요.
함께 보면 좋은 글
자주 묻는 질문
+82 뒤에 010을 그대로 쓰면 안 되나요?
한국 휴대폰의 국내 접두사 0을 제거해 +8210으로 이어 쓰는 형태가 일반적입니다. 번호 종류별 예외는 검증 라이브러리로 확인하세요.
E.164 번호에 하이픈을 저장해도 되나요?
표준화된 비교와 API 전송을 위해 저장값은 보통 +와 숫자만 사용하고 하이픈은 화면 표시 단계에서 추가합니다.
최대 몇 자리까지 저장 공간을 잡아야 하나요?
E.164는 국제 번호의 최대 자릿수를 규정합니다. + 기호를 포함할 문자열 길이와 향후 확장을 고려하되 임의로 숫자형 컬럼에 저장하지 마세요.
전화번호를 숫자 타입으로 저장하면 안 되나요?
앞자리 0과 + 기호를 잃고 산술 연산할 값도 아니므로 문자열 타입이 적합합니다.
근거와 출처
- ITU-T E.164 권고 — 1차 출처, 조회일 2026-08-30
- Google libphonenumber — 보조 출처, 조회일 2026-08-30
도구에서 직접 확인하기
설명한 기준을 실제 값에 적용하려면 전화번호 E.164 포맷터·검증기에서 작은 샘플부터 확인하세요. 원본과 결과를 나란히 비교한 뒤 실제 사용 환경에 적용하는 순서가 가장 안전합니다.
이 글은 알파카랩스 Utils의 텍스트 및 문자열 도구와 함께 보는 정보성 가이드입니다. 규격과 외부 서비스 정책은 바뀔 수 있으므로 중요한 결정 전에는 연결된 공식 출처의 최신 내용을 다시 확인하세요.