Repository navigation
test(platform): App Link https 진입과 Digital Asset Links 검증을 실기기에서 확인한다 #2087
Description
작업 유형
test — 테스트·검증·회귀 방지
주 담당 모듈
platform — CI·빌드·릴리스·저장소 운영
개요
무엇이 남았나
#924 의 완료 조건 5 "Digital Asset Links 검증과 실제 https 링크 진입을 adb 또는 실기기에서 확인한다" 하나가 코드로 닫히지 않는다. 나머지 여섯은 #924 를 닫는 PR 의 단위 테스트와 CI 가 닫는다. 이 이슈는 그 실측 몫만 갖는다.
선언 자체는 그 PR 로 들어간다. MainActivity 의 VIEW/BROWSABLE/https intent-filter 에 android:autoVerify 가 켜지고, 파서가 목적지로 해석하는 다섯 경로만 열거된다. 남은 것은 그 선언이 실제 기기에서 검증을 통과하는지, 통과한 뒤 브라우저 링크가 선택창 없이 앱을 여는지다. 둘 다 기기가 있어야 판정된다.
지금 확인한 사실
https://afternote.kro.kr/.well-known/assetlinks.json 은 2026-09-13 22:36 KST 조회에서 HTTP 200 이고, 내용은 Afternote/Afternote-BE#228 이 고친 그대로다. package_name 은 com.afternote.afternote_fe, relation 은 delegate_permission/common.get_login_creds 와 delegate_permission/common.handle_all_urls 가 둘 다 실려 있다.
문제는 서명 지문이다. 게시된 두 개가 BE#228 이 고치기 전 파일에 있던 값과 같다.
82:D9:C6:1E:84:22:AE:F0:04:0A:7D:A6:A1:B8:FF:15:AA:55:25:6D:EF:03:0F:DD:08:D4:F5:77:81:2E:C7:FB
9C:C7:57:27:5C:5B:9C:16:89:09:B3:92:24:F9:8C:A9:00:61:DF:A7:0A:97:80:E9:95:72:C6:D5:FC:1C:08:29
BE#228 은 수정 항목 셋 중 패키지명과 relation 만 반영하고, 3번 "sha256_cert_fingerprints 재확인, FE 에서 debug·release 서명 지문을 다시 뽑아 전달하겠다" 를 FE 몫(#764 범위)으로 남긴 채 닫혔다. 그 전달은 아직 없다. 지금 게시된 두 지문이 어느 키에서 나왔는지 확인된 적이 없다는 뜻이다.
검증이 실패하면 첫 용의자가 여기다. 이 저장소의 debug 서명은 local.properties 의 DEBUG_* 네 키가 있으면 팀 공유 keystore, 없으면 AGP 기본 ~/.android/debug.keystore 로 갈린다(app/build.gradle.kts 의 signingConfigs). 기본 keystore 는 머신마다 다른 키다. 0913 에 확인한 머신은 DEBUG_*·RELEASE_* 가 모두 없어 기본 keystore 로 서명하는데, 그 지문 88:06:F4:EC:0D:14:06:8E:2E:73:53:B1:B0:65:35:D0:54:20:7E:E0:ED:CC:C4:21:3D:4F:14:57:9D:8E:4F:AC 는 게시된 둘 중 어느 것도 아니다. 그 머신에서 만든 빌드로는 autoVerify 가 성립할 수 없다.
확인 절차
- 검증에 쓸 빌드의 서명 지문을 먼저 뽑아 게시 목록과 대조한다. 없으면 그 지문을 Afternote-BE 이슈로 넘겨
assetlinks.json에 더한 뒤 다시 설치한다. 지문이 맞기 전의 실패는 intent-filter 의 문제가 아니다. adb shell pm get-app-links com.afternote.afternote_fe가afternote.kro.kr에 대해verified를 돌려준다.adb shell am start -a android.intent.action.VIEW -d "https://afternote.kro.kr/timeletter/1"이 선택창 없이 앱을 열고, 로그인 관문 뒤 타임레터 상세에 선다.- 계약 표의 다섯 경로가 각각 제 화면에 선다.
/,/afternote,/timeletter/{id},/mindrecord/daily-question,/settings/notification. - 계약 밖 주소는 앱이 가로채지 않는다. 예로
/afternote/42는 브라우저에 남는다. 그 경로는 intent-filter 에 없다. - Digital Asset Links statements API 가 우리 패키지와 검증한 빌드의 지문을 함께 돌려준다.
완료 조건
- 절차 2, 3, 6 이 실기기 또는 에뮬레이터에서 통과하고 결과를 이 이슈에 기록한다.
- 절차 4 의 다섯 경로와 절차 5 의 비계약 경로를 각각 한 번씩 확인한다.
- 지문이 어긋나 있으면 BE 이슈로 교정하고 그 번호를 여기 남긴다. 어긋나지 않았으면 게시된 두 지문이 어느 키인지 확인한 결과를 남긴다.
- 로그인하지 않은 상태로 링크를 눌렀을 때 로그인 뒤 원래 목적지로 한 번만 재개하는지도 같은 자리에서 본다. 단위 테스트가 고정한 동작이 실제 기기에서도 같은지 확인하는 값이다.
자식 이슈
No response
참고
- 본 이슈는 feat(platform): App Links URI 계약·인텐트 수신·인증 후 목적지 재개 #924 다. 코드는 feat(platform): App Links URI 계약·인텐트 수신·인증 후 목적지 재개 #924 를 닫는 PR 이 들어가고, 이 이슈는 그 PR 이 닫지 못하는 완료 조건 5 만 갖는다.
assetlinks.json교정 이력과 검증 API 는 [fix] assetlinks.json 패키지명 불일치 — 패스키 검증 불가 + 앱링크 relation 부재 Afternote-BE#228. 서명 지문 재확인은 패스키 로그인 — Credential Manager 통합 인증 연동 #764 범위로 남아 있다.- 애프터노트 상세
/afternote/{id}는 계약에서 빠져 있다. 그 목적지를 여는 몫은 enhancement(afternote): 애프터노트 상세를 App Link 목적지로 연다 #2088 이 갖는다. 절차 5 가 그 경로를 비계약 경로로 두는 것은 그 때문이다. - QA 기록 정본은
docs/qa/, 기기 기준은docs/qa/device-baseline.md.
Activity
1hyok commentedon Sep 20, 2026
2026-09-20 실제 APK와 별도 Android 35 에뮬레이터에서 재검증했습니다. 도메인 인증은 통과했고, 실제 로그인 입력 후 재개 검증은 남았습니다.
대상은 PR #2093 HEAD
c896a857559ddd0ca82ee57e1fd12936584bb97a, 직접:app:assembleDebug로 만든versionName=1.0+c896a85APK입니다. 빌드 exit 0, 기기는 1080×2400 / 420dpi입니다. 기존 QA 기기의 앱·계정 데이터는 그대로 보존했습니다.본문의 09-13 서명 차단은 이 대상 빌드에 해당하지 않습니다. APK의 실제 SHA-256은
9C:C7:57:27:5C:5B:9C:16:89:09:B3:92:24:F9:8C:A9:00:61:DF:A7:0A:97:80:E9:95:72:C6:D5:FC:1C:08:29이고 인증서 DN은 Afternote Debug입니다. 현재 배포 assetlinks.json HTTP 200과 공식 statements API가 이 지문·패키지·handle_all_urls를 함께 반환합니다.adb shell pm verify-app-links --re-verify com.afternote.afternote_fe후pm get-app-links는 다음과 같습니다. 검증 상태를 강제 설정하지 않았습니다.컴포넌트·패키지를 지정하지 않은 일반
am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d https://afternote.kro.kr/...로 여섯 주소를 각각 실행했습니다.//afternote/timeletter/1/mindrecord/daily-question/settings/notification/afternote/42로그인하지 않은 설치 직후에는 타임레터 링크가 앱을 열고 온보딩에 머무는 것까지 확인했습니다. 위 표의 인증된 화면 확인은 기존 QA 계정의 유효한 세션을 별도 기기에 fixture로 복사한 결과입니다. 계정 생성이나 새 기록 저장은 하지 않았습니다. 이 과정을 실제 로그인 UI 완료 후 pending 목적지가 한 번만 재개된 E2E로 보고하지 않습니다.
signingReport의 debug 결과도 같은 공유 debug 지문이며, release 보고는Cannot query the value of this provider because it has no value available로 실패했습니다. 따라서 게시된 나머지 키의 출처는 이 머신에서 확인하지 못했습니다.남은 확인은 실제 기존 계정 로그인 절차를 통한 원래 목적지의 1회 재개와, 게시된 다른 지문
82:D9:...:C7:FB의 서명 키 출처입니다. 현재 검증한 공유 debug 빌드는 DAL 수정 없이 정상 인증됩니다. 이 결과를 지문 불일치 때문에 전체 QA를 기다리는 상태로 남기지 않으며, 이슈는 남은 완료 조건 때문에 OPEN으로 유지합니다.1hyok commentedon Sep 26, 2026
#924 와 같은 이유로 보류해 닫는다. 실기기에서 확인할 intent-filter 와 경로 계약 자체가 서버·PM 결정(App Link 발급처, Afternote/Afternote-BE#261) 전이라 #2093 을 머지하지 않고 닫았다. 결정이 나면 새 계약으로 다시 연다.
본문의 서명 지문 불일치(게시된 두 지문의 출처 미확인, 기본 debug keystore 지문
88:06:F4:…:4F:AC불일치)는 App Link 와 상관없이 패스키도 막는 결함이라 #764 가 이미 추적하고 있다.