자체 호스팅 TWA가 '소프트 페일' 상태 - 전체 화면 UI는 작동하지만 네이티브 위임은 실패

자체 호스팅한 Discourse 사이트의 TWA에서 네이티브 알림을 작동시키려다 디지털 자산 링크(Digital Asset Link) 인증에서 매우 이상한 “소프트 페일(soft fail)” 현상을 겪고 있습니다.

구체적인 증상은 다음과 같습니다:

  1. 앱이 URL 바 없이 전체 화면으로 실행됩니다. 이는 자산 링크가 부분적으로 작동하고 있음을 시사합니다.

  2. 그러나 모든 실행 시마다 "Chrome에서 실행 중"이라는 토스트 메시지가 표시됩니다.

  3. 가장 중요한 점은, PWA가 알림 권한을 요청할 때 네이티브 Android 다이얼로그가 아닌 브라우저 스타일의 프롬프트가 표시된다는 것입니다. 이는 네이티브 API 위임이 실패하고 있음을 증명합니다.

이러한 동작은 모든 테스트 기기(Android 12 및 13)와 BubblewrapMicrosoft PWABuilder로 생성된 APK에서 일관되게 나타납니다.

광범위한 디버깅을 거쳐, 클라이언트 측 및 공개된 서버 구성이 완벽하다는 것을 확인했습니다. 문제는 Android 검증기에만 영향을 미치는 미묘한 서버 측 문제인 것으로 보입니다.

이미 검증한 내용은 다음과 같습니다:

  • 서명 키 및 assetlinks.json:android.keystore의 SHA-256 지문은 라이브 /.well-known/assetlinks.json 파일 내의 지문과 100% 정확히 일치합니다.

  • 서버 응답: 제 서버는 assetlinks.json URL을 200 OK 상태 코드, 올바른 application/json Content-Type, 그리고 표준 웹 도구로 확인했을 때 차단하는 CORS 헤더 없이 제공합니다.

  • Android 앱 구성: 생성된 AndroidManifest.xml은 정확하며 표준 com.google.androidbrowserhelper.trusted.DelegationService를 포함하고 있습니다.

  • Discourse 관리자 설정: 제 관리자 보안 설정인 cors origins 및 **Allowed crawler user agents**는 모두 비어 있습니다.

이러한 특정한 “소프트 페일” 동작을 고려할 때, 제 질문은 다음과 같습니다:

기본 Discourse 자체 호스팅 환경에서 Android 검증기가 “부분적 신뢰”(전체 화면 UI 허용)는 부여하지만 네이티브 API 위임에 필요한 더 높은 수준의 신뢰는 거부하게 만드는 알려진 Nginx 규칙, 방화벽 설정, 또는 미묘한 서버 응답 문제(예: slight delay 또는 비표준 헤더)가 존재합니까?

클라이언트 측에서 진단할 수 있는 한계에 도달했습니다. 서버의 깊은 구성에 대한 통찰이 있다면 큰 도움이 될 것입니다.