본문 바로가기
Develop

[Flutter] Uri를 활용한 SMS 보내기 기능 구현

by 너드나무 2024. 8. 29.
728x90

서론

문자 보내기 기능을 구현하면서 android.permission.SEND_SMS 권한에서 reject 이슈가 발생했다.

해당 권한은 민감한 권한으로 단순히 사유를 변경하는 것으로 해결이 불가능하여,
url_launcher 패키지를 활용하여 launchUrl 함수를 통해 sms Scheme를 호출하는 것으로 해결한다.

SEND_SMS 왜 민감한건데?

  • 기능 구현에 있어서는 단순히 문자 보내기에 불과한 기능이지만, 심각한 취약점을 유발할 수 있다.
  • 예를 들면, 설치한 단말기에서 스팸 문자를 대량으로 발송하는 것이나 스피어 피싱을 수행하는 시나리오를 생각해 볼 수 있었다.
  • Play Store를 통해 설치하는 것이 아닌 직접 설치라고 가정한다면 위 시나리오가 모두 구현 가능하다..!

SEND_SMS 권한 Reject 사유


URI 호출은 무엇이길래?

통합 자원 식별자 (Uniform Resource Identifier ,  URI), Wikipedia

1. URI 구문 분석

  • URI는 일반적으로 다음과 같은 구조를 가지고 있다: scheme://authority/path?query#fragment.
    • Scheme: 리소스에 접근하는 방법을 정의. 예: http, https, ftp, mailto 등.
    • Authority: 리소스가 위치한 권한을 나타내며, 호스트명(예: www.example.com)과 포트 번호(예: :80)를 포함
    • Path: 서버에서 리소스의 경로 정의. 예: /index.html.
    • Query: 리소스에 전달되는 추가적인 데이터를 포함. 예: ?name=value.
    • Fragment: 리소스 내의 특정 부분 지정. 예: #section1.

2. URI 해석

  • 웹 브라우저, 이메일 클라이언트 등 사용자가 사용하는 애플리케이션이 URI를 해석한다.
  • 예를 들어, mailto:example@example.com은 이메일 클라이언트에서 이메일 작성 창을 엽니다.
  • https://www.example.com은 웹 브라우저가 이를 인식하고, 웹 서버에 HTTP 요청을 보내 해당 페이지를 호출한다.

3. 프로토콜 결정 및 리소스 접근

  • Scheme을 기반으로 사용자가 접근하려는 리소스에 어떤 프로토콜이 사용될지를 결정한다.
  • http는 HTTP 프로토콜, ftp는 FTP 프로토콜, 문자 메세지 발송 기능은 sms로 정의할 수 있다.

Flutter PoC Code

Uri uri = Uri(
  scheme: 'sms', // sms:: 기능 내포
  path: recipients.join(','), // 수신자 여러 명을 콤마로 구분
  queryParameters: <String, String>{
    'body': smsMessage // 송신하려는 문자 메세지 내용
  },
);

if (await canLaunchUrl(uri)) { // uri 호출이 가능한지
  await launchUrl(uri); // 가능하다면 uri 호출
}
728x90
반응형