
Flutter 앱에서 WebView를 띄우고, 앱이 보유한 access token을 JS 측 localStorage에 전달해야 하는 상황.
Android에서는 문제 없이 동작하지만, iOS에서는 다음과 같은 현상이 발생했다.
window.localStorage.setItem('x-api-token', token) 호출getItem() 결과는 null401 Unauthorized 오류iOS의 WKWebView 특성상 보안 context가 완전히 준비되기 전에는 localStorage에 접근하거나 데이터를 주입하는 것이 제한될 수 있다.
이에 따라 다음과 같은 방식들이 장기적인 해결책으로 제안된다.
window.HeartField.postMessage('requestToken');
Flutter는 이 메시지를 받아 다시 JS로 토큰을 삽입:
webViewController.runJavascript("localStorage.setItem('x-api-token', '\$token');");
https://example.com?token=abc123localStorage.setItem(...) 수행⚠️ 보안상 민감함 → HTTPS + 짧은 생명주기 토큰 필수
웹/서버 코드를 수정할 수 없는 경우엔, 다음 방식이 가장 확실하다:
if (Platform.isIOS) {
final html = '''
<html>
<script>
localStorage.setItem('x-api-token', '\$token');
location.replace('\$realUrl'); // ✅ 히스토리에 남지 않음
</script>
</html>
''';
webViewController.loadHtmlString(html, baseUrl: Uri.parse('https://yourdomain.com'));
} else {
webViewController.loadRequest(Uri.parse(realUrl));
}
localStorage에 토큰 확실히 저장됨location.replace() 덕분에 히스토리에 안 남음WebView의 전체 히스토리를 지우고 싶을 땐 아래처럼:
void dispose() {
webViewController.clearHistory(); // 🧼 히스토리 초기화
super.dispose();
}
📌 flutter_inappwebview 전용 기능이므로, webview_flutter에선 지원되지 않음.
Flutter WebView + iOS 환경에서는 단순한 JS 삽입만으로 localStorage에 토큰을 심는 것이 불안정하다.
보안 정책을 우회하기 위해 preload HTML 기법을 사용해 문제를 해결할 수 있으며,
장기적으로는 앱과 웹 간 통신 구조를 개선하는 방향이 필요하다. 🚀