단일 SMS는 GSM-7 인코딩에서 160자, UCS-2 인코딩에서 70자입니다. 통신사가 어떤 인코딩을 선택할지는 메시지 내용에 따라 자동으로 결정됩니다. 모든 글자가 GSM-7 기본 알파벳 안에 있으면 160자를 모두 사용할 수 있습니다. 단 하나의 글자라도 그 알파벳 밖이라면 메시지 전체가 UCS-2로 다시 인코딩되어 한도가 70자로 떨어집니다.
한국어로 SMS를 보내면 한글이 GSM-7 알파벳 밖이므로 항상 UCS-2가 적용됩니다. 즉, 한국어 단일 SMS는 70자 이내여야 합니다. 70자를 넘으면 메시지는 분할 세그먼트로 쪼개집니다. 각 세그먼트는 수신 기기가 메시지를 다시 합칠 수 있도록 6바이트 헤더를 포함하므로, 분할 SMS는 세그먼트당 GSM-7에서 153자, UCS-2에서 67자만 사용합니다.
SMS 한도 빠른 참조
| 시나리오 | 한도 | 비고 |
|---|---|---|
| 단일 SMS, GSM-7 | 160자 | 일반 라틴 텍스트, 이모지/곡선 따옴표 없음 |
| 단일 SMS, UCS-2 | 70자 | 한글, 이모지 등 GSM-7 외 모든 문자 |
| 분할 세그먼트, GSM-7 | 153자 | 6바이트 UDH가 세그먼트당 7자 차지 |
| 분할 세그먼트, UCS-2 | 67자 | 6바이트 UDH가 세그먼트당 3자 차지 |
| 최대 세그먼트 (대부분 통신사) | 6-10개 | 초과 시 잘리거나 거부될 수 있음 |
| 이모지 | UCS-2 유닛 2개 | 메시지 전체를 UCS-2로 강제 |
| iMessage / KakaoTalk / WhatsApp | 20,000자+ | SMS가 아님. 완전히 다른 규칙 |
GSM-7 인코딩: 160자 표준
GSM-7은 GSM 03.38 표준에 정의된 기본 SMS 인코딩입니다. 문자당 7비트로 패킹해 1,120비트(140바이트) SMS 페이로드에 160자가 들어갑니다. 알파벳은 128개의 기본 문자와 10자 확장 테이블을 가집니다. 이 138자 밖의 문자가 있으면 UCS-2로 전환됩니다.
기본 알파벳은 악센트 없는 라틴 문자(A-Z, a-z), 0-9 숫자, 일반 구두점, 공백, 줄바꿈, 캐리지 리턴, 소수의 유럽 악센트 문자, 과학 표기에 사용되는 그리스어 대문자, 몇몇 통화/기호 문자를 다룹니다.
GSM-7 확장 문자 (각 2자로 계산)
기술적으로는 GSM-7이지만 확장 테이블에 있어 각각 2자로 계산됩니다.
- 중괄호 { }, 대괄호 [ ], 파이프 |, 백슬래시 \, 틸드 ~, 캐럿 ^
- 유로 기호 EUR
- 폼 피드(form feed)
UCS-2 인코딩: 70자로 떨어지는 순간
UCS-2는 16비트(2바이트) Unicode 인코딩입니다. 같은 140바이트 SMS 페이로드에 세그먼트당 70 UCS-2 코드 유닛, 분할 시 67개가 들어갑니다. 통신사는 단 하나의 문자가 GSM-7 밖에 있는 순간 UCS-2로 전환합니다. 부분 변환은 없습니다. 한 글자가 메시지 전체를 뒤집습니다.
가장 일반적인 UCS-2 트리거는 발신자가 생각하지 않는 문자들입니다. Word와 macOS가 자동으로 직선 따옴표 대신 넣는 곡선 따옴표, em-dash와 en-dash, 줄임표 문자, 모든 이모지, 그리고 비라틴 문자(키릴, 그리스 소문자, 아랍어, 히브리어, 태국어, CJK). 한국어는 항상 UCS-2입니다.
분할 SMS: 왜 세그먼트가 153/67자인가
메시지가 단일 SMS 한도를 초과하면 세그먼트로 분할되고 각 세그먼트가 별도의 SMS로 무선 전송됩니다. 수신자 휴대폰이 올바른 순서로 다시 조립할 수 있도록 각 세그먼트는 참조 번호, 총 세그먼트 수, 위치를 담은 사용자 데이터 헤더(UDH)를 포함합니다.
UDH는 6바이트입니다. GSM-7에서는 7자에 해당해 세그먼트당 용량이 160자에서 153자로 줄어듭니다. UCS-2에서는 같은 6바이트가 3 UCS-2 코드 유닛이므로 70자에서 67자로 떨어집니다.
빠른 세그먼트 계산
- 한글 100자 메시지: UCS-2 강제, 100 > 70, ceil(100 / 67) = 2세그먼트
- 71자 영어 + 이모지: UCS-2 강제, 71 > 70, 2세그먼트
- 320자 일반 ASCII: ceil(320 / 153) = 3세그먼트
- 한글 정확히 70자: UCS-2 단일 SMS, 1세그먼트
멀티 세그먼트 SMS의 실제 비용
거의 모든 상업용 SMS API는 메시지가 아닌 세그먼트당 청구합니다. 가격 계산은 단순합니다. 총 비용 = 메시지당 세그먼트 수 × 수신자 × 세그먼트당 요금. 비싸지는 지점은 인코딩 함정입니다. 곡선 따옴표가 포함된 캠페인은 조용히 세그먼트 수를 두 배로 늘리고 청구액도 두 배로 만듭니다.
한국 통신사 기준으로는 SMS(80바이트, 한글 40자), LMS(2,000바이트, 한글 1,000자), MMS(이미지 포함)로 구분되며, LMS와 MMS는 일반적으로 SMS보다 단가가 높습니다.
UCS-2를 강제하는 흔한 문자
- 한글: 자모와 완성형 음절 모두 GSM-7 밖이므로 항상 UCS-2 강제.
- 곡선 따옴표: Word, Pages, macOS가 자동으로 직선 따옴표를 곡선으로 바꿉니다. SMS 발송 전 일반 텍스트 단계를 거치세요.
- em-dash와 en-dash: 모두 UCS-2 강제. ASCII 하이픈에 양쪽 공백을 두거나 문장을 둘로 나누세요.
- 줄임표 문자: 단일 글자 줄임표(…)는 UCS-2. ASCII 세 점(...)이 시각적으로 동일하면서 GSM-7입니다.
- 모든 이모지: UCS-2를 강제하고 70자 중 2자를 소비. 피부톤과 복합 이모지는 4자 이상.
- 비라틴 문자: 키릴, 그리스 소문자, 아랍어, 히브리어, 태국어, 데바나가리, 중국어, 일본어, 한국어 모두 UCS-2.
iMessage / KakaoTalk / WhatsApp: 한도가 적용되지 않는 경우
160/70 한도는 SMS가 GSM 제어 채널을 타고 140바이트 페이로드 제약을 받기 때문에 존재합니다. 데이터 기반 프로토콜로 옮기는 순간 이 한도들은 사라집니다.
- iMessage: Apple의 서비스는 약 20,000자 한도. GSM-7 / UCS-2 구분 없음, 세그먼트 청구 없음.
- RCS (Rich Communication Services): GSMA가 지원하는 SMS의 후속. 고정 글자 한도 없음(보통 8,000-20,000자). 리치 미디어, 읽음 확인, 입력 표시 지원. 안드로이드와 iOS 18+에서 광범위하게 지원.
- WhatsApp: 메시지당 65,536자, 분할 없음, 인코딩 규칙 없음.
- KakaoTalk: 한국에서 가장 널리 쓰이는 메신저로 사실상 한도가 없습니다(메시지당 약 5,000자). 비즈니스 메시지(알림톡)는 1,000자 한도.
- Telegram, Signal, Messenger: 일반 사용에서 사실상 한도 없음(메시지당 4,000-20,000자 이상).
SMS 비용을 줄이는 실용 팁
- 일반 ASCII 사용. 발송 전에 곡선 따옴표, 멋진 대시, 줄임표 문자를 제거하세요.
- 가치가 없으면 이모지 빼기. 모든 이모지는 UCS-2를 강제하고 최소 2자를 소비합니다.
- 프로모션 SMS는 160자 이하 유지. 1 GSM-7 세그먼트 안에 머무는 것이 최고의 비용 최적화.
- 한국어 SMS는 70자 이하 유지. UCS-2 단일 세그먼트를 목표로 하세요. 70자를 넘으면 즉시 비용이 두 배가 됩니다.
- 링크 단축. UTM 파라미터가 붙은 https URL은 70자를 잡아먹습니다. 브랜드 단축 링크를 사용하세요.
- 발송 전 글자 수 확인. 모든 캠페인을 인코딩을 감지하고 세그먼트를 보여주는 글자 카운터로 점검하세요.