# SMS OTP 자동 완성: Android SMS Retriever, iOS one-time-code 및 WebOTP 메시지 형식

> 메시지가 적절한 형식으로 구성되어 있다면 Android, iOS 및 웹에서 SMS 인증번호가 자동으로 입력될 수 있습니다. Android의 SMS Retriever을 위한 11자리 앱 해시, iOS 및 Safari를 위한 autocomplete="one-time-code", 그리고 WebOTP을 위한 @your-domain #code가 포함된 마지막 줄이 필요합니다. 다음은 각 형식과 세 플랫폼 모두에서 작동하는 템플릿 예시입니다.

- 정식 URL: https://www.broadnet.me/ko/blog/sms-otp-autofill-android-ios-web-guide
- 언어: ko
- 최종 업데이트: 2026-09-28
- 발행처: BroadNet (https://www.broadnet.me)

- 게시일: 2026-09-28
- 작성자: BroadNet Editorial Team

SMS 일회용 코드는 메시지가 플랫폼 형식에 맞게 구성되어 있으면 자동으로 입력될 수 있습니다. Android에서는 SMS Retriever API가 140바이트 이하이며, 코드를 포함하고, 앱을 식별하는 11자리 해시가 포함된 메시지를 읽습니다. iOS 및 Safari에서는 입력란에 autocomplete="one-time-code"(네이티브 앱의 경우 textContentType oneTimeCode)를 표시하면 키보드에서 코드를 제안합니다. 웹에서는 WebOTP API가 마지막 줄이 @your-domain #code인 메시지를 읽습니다. 하나의 템플릿으로 세 플랫폼 모두를 충족할 수 있습니다.

## 핵심 요약

- 자동 완성 기능을 사용하면 사용자가 코드를 수신하고 입력하는 과정에서 앱을 전환하며 발생하는 이탈을 방지할 수 있습니다.
- Android SMS Retriever: 최대 140바이트의 메시지이며, 코드와 11자리 앱 해시를 포함해야 합니다. SMS 권한은 필요하지 않습니다.
- Android SMS User Consent: 해시가 필요하지 않습니다. 메시지는 최소 하나의 숫자를 포함한 4~10자리의 영문 숫자 코드를 포함해야 하며, 사용자가 탭하여 허용합니다.
- iOS 및 Safari: 입력란에 autocomplete="one-time-code"를 사용합니다. 도메인 기반의 마지막 줄을 통해 Safari의 코드 제안 기능이 활성화됩니다.
- WebOTP: 마지막 줄 @domain #code, 스킴, 포트 또는 경로 없음; Android 및 데스크톱 Chrome에서 지원됩니다.

## OTP 자동 완성 기능이 왜 중요한가요?

"코드 전송"과 "코드 입력" 사이의 모든 단계에서 사용자가 이탈합니다. 메시지 앱으로 전환하고, 6자리 숫자를 기억하고, 다시 앱으로 돌아오는 과정이 필요하기 때문입니다. 자동 완성 기능을 사용하면 이 과정을 단 한 번의 탭으로 줄일 수 있습니다. 또한 입력 오류를 줄여주며, 도메인 기반 코드를 사용하면 유사 사이트에서 사용자가 코드를 입력하도록 유도하는 피싱 공격을 방어하는 데 도움이 됩니다. 다만, 자동 완성이 전송 문제를 해결하는 것은 아닙니다. 코드가 여전히 신속하게 도착해야 하므로, 자동 완성 기능을 빠른 경로 및 대체 발송과 함께 구성하세요. [OTP 전송 성공률 최적화 가이드](https://www.broadnet.me/answers/sms-otp-best-practices)를 참조하세요.

## Android SMS Retriever API는 어떻게 작동하나요?

SMS Retriever API를 사용하면 Android 앱이 SMS 읽기 권한을 요청하지 않고도 인증 메시지를 수신할 수 있습니다. Google의 문서에서는 메시지에 대해 다음 세 가지 규칙을 규정합니다:

- 140바이트 이내여야 합니다.
- 앱이 서버로 다시 전송할 일회용 코드를 포함해야 합니다.
- 앱을 식별하는 11자리의 해시 문자열을 포함해야 합니다.

해시는 앱의 패키지 이름과 서명 인증서를 기반으로 계산됩니다. 인증서의 16진수 형태 뒤에 패키지 이름을 붙인 후, SHA-256을 취하고, 이를 base64 인코딩하여 처음 11자리를 유지합니다. 디버그 빌드와 릴리스 빌드는 보통 서로 다른 키로 서명되므로 해시 값도 다릅니다. 메시지를 생성할 때 서버에서 올바른 해시를 추가합니다.

## SMS User Consent API란 무엇인가요?

템플릿이 다른 채널과 공유되는 등의 이유로 메시지에 앱 해시를 포함할 수 없는 경우, Android의 SMS User Consent API는 사용자에게 앱이 메시지 하나를 읽을 수 있도록 허용할지 묻는 프롬프트를 표시합니다. Google에 따르면, 메시지에는 최소 하나의 숫자가 포함된 4~10자리의 영문 숫자 조합이 포함되어야 하며, 발신자를 지정한 경우 해당 발신자로부터 온 메시지여야 합니다. API는 시작 후 약 5분 동안 대기하며, 이후에는 타임아웃됩니다.

## iOS에서 OTP 자동 완성은 어떻게 작동하나요?

iOS는 키보드에서 보안 코드 자동 완성 기능을 제공합니다. 네이티브 앱의 경우 텍스트 필드의 textContentType을 oneTimeCode로 설정하세요. 웹 페이지의 경우 입력란에 autocomplete="one-time-code"를 추가합니다. 일치하는 문자가 도착하면 키보드 위에 코드가 나타나며 사용자가 이를 탭하면 됩니다. Safari는 WebOTP JavaScript API를 구현하지 않지만, Chrome의 WebOTP 문서에 따르면 autocomplete 어노테이션을 사용하고 SMS가 아래의 도메인 기반 형식을 따르는 경우 기본 키보드에서 코드를 제안합니다 (iOS 14 및 macOS Big Sur 이상).

## WebOTP 메시지 형식은 무엇인가요?

WebOTP API를 사용하면 웹 페이지가 navigator.credentials.get({ otp: { transport: ['sms'] } })를 통해 코드를 읽을 수 있습니다. 문자는 사람이 읽을 수 있는 텍스트로 시작해야 하며, 마지막 줄은 반드시 다음과 같은 형식으로 끝나야 합니다:

```
Your BroadNet code is 482913.

@www.example.com #482913
```

- 마지막 줄은 @와 코드를 요청하는 페이지의 도메인으로 시작합니다.
- 공백 한 칸을 입력한 후 #과 코드를 입력합니다.
- 도메인에 스킴, 포트 또는 경로를 포함하지 않으며, 도메인 내부에 공백을 포함하지 않습니다.
- 메시지를 읽는 사람들을 위해 사람이 읽을 수 있는 부분에도 코드가 포함되어야 합니다.

WebOTP 기능이 없는 브라우저에서도 코드를 제공할 수 있도록 입력값에 항상 autocomplete="one-time-code"을 유지해야 합니다.

## 하나의 SMS 템플릿으로 모든 플랫폼에서 작동할 수 있나요?

네, Android 바이트 제한을 준수하고 줄 순서가 올바르다면 가능합니다. 결합된 템플릿 예시:

```
Your BroadNet code is 482913. Do not share it.
FA+9qCX9VSu

@www.example.com #482913
```

| 플랫폼 | 코드를 읽는 주체 | 메시지 필요 항목 |
|---|---|---|
| Android 앱 | SMS Retriever API | 코드 및 11자리 앱 해시; 최대 140바이트 |
| Android 앱 (해시 없음) | SMS User Consent API | 숫자가 최소 하나 포함된 4~10자리의 영문 숫자 코드 |
| iOS 앱 | 보안 코드 자동 완성 (oneTimeCode) | 식별 가능한 코드; 도메인 기반 라인 권장 |
| Safari (iOS, macOS) | autocomplete="one-time-code" | 마지막 라인 @domain #code |
| Chrome (Android, desktop) | WebOTP API | 마지막 라인 @domain #code |

표시된 해시는 예시용입니다. 실제 앱의 값을 사용하세요. 메시지가 하나의 세그먼트로 유지되도록 템플릿을 GSM-7 문자 집합으로 유지해야 합니다. 이모지나 액센트 문자가 포함되면 전체 메시지가 Unicode로 전환되어 용량이 절반으로 줄어들고 140바이트 제한을 초과할 수 있습니다. [SMS 인코딩 및 세그먼트 분할](https://www.broadnet.me/blog/sms-encoding-segmentation-gsm7-ucs2)을 참조하세요.

## BroadNet을 사용하여 이러한 메시지를 어떻게 발송하나요?

서버에서 메시지를 생성한 후 [OTP API](https://www.broadnet.me/products/otp) 또는 [SMS API](https://www.broadnet.me/products/sms-api)을 통해 발송하세요. 줄바꿈은 메시지 텍스트의 일부로 포함됩니다. BroadNet의 OTP 제품은 인증번호가 도착하지 않을 경우 SMS, WhatsApp, 음성 및 Flash Call로 대체 발송을 수행하며, [MyOTP.App](https://www.broadnet.me/products/myotp)은 하나의 계정으로 SMS, WhatsApp 또는 Telegram를 통해 인증번호를 발송합니다. 전체 프로세스에 대해서는 [OTP 흐름 구축 방법](https://www.broadnet.me/answers/how-to-build-otp-flow)과 당사의 [멀티채널 OTP 인증 가이드](https://www.broadnet.me/blog/multichannel-otp-verification-api-2026)를 읽어보시기 바랍니다.

## 자주 묻는 질문

### 왜 제 Android 앱이 OTP SMS를 읽지 못하나요?

일반적으로 메시지에 포함된 앱 해시가 빌드와 일치하지 않거나(디버그 및 릴리스 키가 다름), 메시지가 140바이트보다 길거나, 메시지가 도착한 후에 리스너가 시작된 경우입니다.

### Android에서 인증번호를 자동 완성하려면 SMS 권한이 필요한가요?

아니요. SMS Retriever API와 SMS User Consent API 모두 SMS 읽기 권한 없이 작동합니다.

### iOS에서 OTP 자동 완성을 활성화하려면 어떻게 해야 하나요?

네이티브 앱에서는 textContentType을 oneTimeCode로 설정하거나, 웹 페이지의 입력란에 autocomplete="one-time-code"를 추가하세요.

### WebOTP SMS 형식은 무엇인가요?

사람이 읽을 수 있는 텍스트를 먼저 작성한 후, 마지막 줄에 @와 도메인, 공백, # 그리고 인증번호를 입력합니다. 예: @www.example.com #482913.

### Safari에서도 WebOTP이 작동하나요?

Safari는 WebOTP JavaScript API를 지원하지 않지만, autocomplete="one-time-code"을 사용하면 키보드에서 도메인 기반 형식의 메시지에 포함된 인증번호를 제안합니다.

### Android, iOS, 웹에서 하나의 템플릿을 공통으로 사용할 수 있나요?

네, 가능합니다. 텍스트 내 인증번호, 별도 줄에 작성된 앱 해시, 그리고 마지막 줄의 도메인 기반 라인을 모두 포함하여 140바이트 이내로 구성하면 됩니다.

플랫폼 규정은 2026년 9월 28일에 Google의 SMS Retriever 및 SMS User Consent 문서(developers.google.com)와 Chrome의 WebOTP 문서(developer.chrome.com)를 참조하여 확인되었습니다. 당사의 [편집 기준](https://www.broadnet.me/about/editorial-standards)을 확인하세요.
