라벨이 하이브리드앱인 게시물 표시

Android WebView 안전하게 설정하는 방법 (JS 허용, 외부 URL 분기, 파일 접근 차단)

하이브리드 앱을 개발하거나 운영하다 보면 앱 내부에 웹 화면을 넣기 위해 WebView를 정말 자주 쓰게 됩니다. 저의 경우도 공지사항, 이벤트 페이지, 또는 결제 화면 등을 WebView로 처리하곤 하는데요. 웹 페이지가 정상적으로 동작해야 하니까 처음 개발할 때 별생각 없이 JavaScript를 켜고 관련 설정을 느슨하게 다 열어두는 경우가 많습니다. 하지만 이렇게 설정을 열어두면 XSS 같은 웹 보안 취약점이 그대로 앱의 취약점으로 이어집니다. 특히 내부 도메인과 외부 링크 구분이 안 되거나, file:// 접근이 허용된 상태에서 JavaScript가 켜지면 로컬에 있는 민감한 데이터가 유출될 위험도 있습니다. 매번 프로젝트 세팅할 때마다 설정 값이 헷갈려서, 실제 운영 환경에 맞춰 안전하게 쓸 수 있는 가이드와 공통 코드를 정리해 둡니다. 1. 안전한 WebView 공통 설정 코드 매번 화면마다 설정을 따로 복사해서 넣으면 누락되는 부분이 생기기 쉽습니다. 아래처럼 공통으로 검증하고 세팅할 수 있는 Configurator 클래스를 만들어 두고 호출하는 방식이 안전합니다. Kotlin class SecureWebViewConfigurator ( private val allowedHosts: Set<String>, ) { fun configure (webView: WebView ) { webView.settings.apply { // 웹 서비스 동작을 위해 필요한 경우만 켭니다. javaScriptEnabled = true domStorageEnabled = true // 로컬 파일 접근은 기본적으로 모두 차단합니다. allowFileAccess = false allowContentAccess = false allowFileAccessFromFil...

Android WebView 커스텀 스킴 파라미터 검증 및 라우팅 구현 방법

이래저래 하이브리드 앱을 개발하고 운영하다 보면, 웹 화면에서 안드로이드 네이티브 기능을 꼭 호출해야 하는 상황이 생깁니다. 공유하기를 띄우거나, 외부 브라우저를 열거나, 기기 지도를 호출하는 기능들이 대표적이죠. 저의 경우 결과값을 웹으로 다시 리턴해 줄 필요가 없는 단순 단방향 호출에는 커스텀 스킴( myapp://action?key=value )을 자주 사용합니다. 구조가 단순해서 웹 쪽에서 호출하기 편하거든요. 하지만 이게 웹 개발자랑 앱 개발자 사이에 규칙을 제대로 안 잡아두면 나중에 코드가 지저분해지고 보안 구멍이 생기기 딱 좋습니다. 웹에서 주는 값을 검증 없이 그대로 Intent에 쑤셔 넣었다가 앱이 픽 터지거나 민감한 정보가 노출되는 경우가 많기 때문입니다. 실무에서 안전하게 쓸 수 있는 라우팅 구조와 파라미터 검증 코드를 정리해 둡니다. 1. 연동 방식 선택 기준 (내가 커스텀 스킴을 쓰는 이유) 웹과 앱을 연결하는 방법은 몇 가지가 있지만, 각자 장단점이 명확합니다. 상황에 맞게 골라 써야 나중에 고생을 안 합니다. 방식 설명 장점 주의할 점 / 추천 상황 커스텀 스킴 특정 URL 형식을 앱이 가로채서 분기 구조가 단순함 결과 리턴이 필요 없는 단순 단방향 호출 JavaScript Interface JS에서 Android 메서드를 직접 호출 양방향 연동 가능 노출 메서드가 많아지면 보안 검토 필수 postMessage 메시지 기반으로 웹/앱 통신 구조화하기 좋음 OS 버전별 동작 확인 필요 서버 API 웹/앱이 서버를 통해 상태를 공유 결합도가 낮음 실시간 네이티브 제어에는 부적합 저의 경우, "공유창 열기", "외부 브라우저 토스"처럼 호출만 하고 끝나는 기능에는 무조건 커스텀 스킴으로 구조를 단순하게 가져갑니다. 2. 핵심 구현 코드 (Java) 자꾸 까먹어서 나중에 바로 복사해 쓰려고 남겨두는 베이스 코드입니다. 실무 프로젝트에 적용할 때는 서비스 규칙에 맞게 스킴명( myapp )이나 호스트( na...

Android WebView 뒤로가기 종료 및 외부 링크(Intent) 분기 처리 방법

Android WebView 뒤로가기 종료 및 외부 링크(Intent) 분기 처리 방법 하이브리드 앱을 개발하고 운영하다 보면 웹뷰(WebView) 안에서 뒤로 가기 처리나 외부 링크 분기 때문에 골치 아픈 일이 종종 생깁니다. 대충 퉁쳐서 처리하면 웹뷰에 방문 기록이 남아있는데도 앱이 픽 꺼져버리거나, 지도나 결제 창 같은 외부 링크가 웹뷰 안에서 깨진 채로 로딩되는 현상이 발생합니다. 심지어 검증되지 않은 도메인이 웹뷰 내에서 열려 보안 문제가 생기기도 하죠. 자꾸 헷갈리는 부분이라, 저의 경우 아예 기준을 명확히 잡고 베이스 코드로 만들어 두고 사용합니다. 나중에 다시 보려고 깔끔하게 정리해 둡니다. 1. 처리 기준 명확히 나누기 웹뷰 URL 처리는 무조건 아래 4가지 유형으로 딱 부러지게 나눠서 라우팅 정책을 잡아야 나중에 로그인이나 결제, 지도 기능이 추가되어도 꼬이지 않습니다. 구분 처리 위치 예시 URL / 스킴 판단 및 처리 기준 내부 도메인 WebView 내부 https://www.example.com/page 우리 서비스 정상 화면인지 확인 후 그대로 이동 외부 웹 링크 외부 브라우저 https://external.example 서비스 밖 링크거나 새 창 성격이면 크롬 등으로 토스 앱 스킴 외부 앱 / 마켓 market:// , tel: , mailto: Android Intent 처리 가능 여부 확인 후 실행 차단 대상 로딩 차단 알 수 없는 스킴 보안 정책상 허용하지 않고 예외 처리 2. 핵심 구현 코드 (Java) 민감한 운영 도메인은 제외하고, 실무에서 바로 뼈대로 잡고 쓸 수 있는 실제 구현 코드입니다. 최신 Android 트렌드에 맞춰 onBackPressed() 대신 OnBackPressedDispatcher 를 사용했습니다. Java public class MainActivity extends AppCompatActivity { // 운영하시는 서비스 도메인을 입력하세요 private static ...