Skip to content

test(platform): App Link https 진입과 Digital Asset Links 검증을 실기기에서 확인한다 #2087

Closed as not planned

Description

@1hyok

작업 유형

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 가 성립할 수 없다.

확인 절차

  1. 검증에 쓸 빌드의 서명 지문을 먼저 뽑아 게시 목록과 대조한다. 없으면 그 지문을 Afternote-BE 이슈로 넘겨 assetlinks.json 에 더한 뒤 다시 설치한다. 지문이 맞기 전의 실패는 intent-filter 의 문제가 아니다.
  2. adb shell pm get-app-links com.afternote.afternote_fe 가 afternote.kro.kr 에 대해 verified 를 돌려준다.
  3. adb shell am start -a android.intent.action.VIEW -d "https://afternote.kro.kr/timeletter/1" 이 선택창 없이 앱을 열고, 로그인 관문 뒤 타임레터 상세에 선다.
  4. 계약 표의 다섯 경로가 각각 제 화면에 선다. /, /afternote, /timeletter/{id}, /mindrecord/daily-question, /settings/notification.
  5. 계약 밖 주소는 앱이 가로채지 않는다. 예로 /afternote/42 는 브라우저에 남는다. 그 경로는 intent-filter 에 없다.
  6. Digital Asset Links statements API 가 우리 패키지와 검증한 빌드의 지문을 함께 돌려준다.

완료 조건

  1. 절차 2, 3, 6 이 실기기 또는 에뮬레이터에서 통과하고 결과를 이 이슈에 기록한다.
  2. 절차 4 의 다섯 경로와 절차 5 의 비계약 경로를 각각 한 번씩 확인한다.
  3. 지문이 어긋나 있으면 BE 이슈로 교정하고 그 번호를 여기 남긴다. 어긋나지 않았으면 게시된 두 지문이 어느 키인지 확인한 결과를 남긴다.
  4. 로그인하지 않은 상태로 링크를 눌렀을 때 로그인 뒤 원래 목적지로 한 번만 재개하는지도 같은 자리에서 본다. 단위 테스트가 고정한 동작이 실제 기기에서도 같은지 확인하는 값이다.

자식 이슈

No response

참고

Activity

  1. added
    test테스트·검증·회귀 방지 작업
    area:platformCI·빌드·릴리스·저장소 운영 영역
    on Sep 13, 2026
  2. 1hyok commented on Sep 20, 2026

    @1hyok
    CollaboratorAuthor

    2026-09-20 실제 APK와 별도 Android 35 에뮬레이터에서 재검증했습니다. 도메인 인증은 통과했고, 실제 로그인 입력 후 재개 검증은 남았습니다.

    대상은 PR #2093 HEAD c896a857559ddd0ca82ee57e1fd12936584bb97a, 직접 :app:assembleDebug로 만든 versionName=1.0+c896a85 APK입니다. 빌드 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는 다음과 같습니다. 검증 상태를 강제 설정하지 않았습니다.

    Signatures: [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]
    Domain verification state:
      afternote.kro.kr: verified
    

    컴포넌트·패키지를 지정하지 않은 일반 am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d https://afternote.kro.kr/...로 여섯 주소를 각각 실행했습니다.

    경로 OS 실제 선택 인증된 기존 QA 세션으로 확인한 화면
    / MainActivity, 선택창 없음 홈 탭. 현재 서버 데이터 로드 오류 상태는 별도로 관측
    /afternote MainActivity, 선택창 없음 애프터노트 목록
    /timeletter/1 MainActivity, 선택창 없음 타임레터 상세의 로드 오류 화면. 이어서 기존 QA 계정 목록 GET 200에서 얻은 본인 소유 ID로 상세 본문 표시까지 확인
    /mindrecord/daily-question MainActivity, 선택창 없음 오늘 질문 작성 화면
    /settings/notification MainActivity, 선택창 없음 기기 알림·마케팅 알림 설정 화면
    /afternote/42 Chrome 앱이 가로채지 않음

    로그인하지 않은 설치 직후에는 타임레터 링크가 앱을 열고 온보딩에 머무는 것까지 확인했습니다. 위 표의 인증된 화면 확인은 기존 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으로 유지합니다.

  3. 1hyok commented on Sep 26, 2026

    @1hyok
    CollaboratorAuthor

    #924 와 같은 이유로 보류해 닫는다. 실기기에서 확인할 intent-filter 와 경로 계약 자체가 서버·PM 결정(App Link 발급처, Afternote/Afternote-BE#261) 전이라 #2093 을 머지하지 않고 닫았다. 결정이 나면 새 계약으로 다시 연다.

    본문의 서명 지문 불일치(게시된 두 지문의 출처 미확인, 기본 debug keystore 지문 88:06:F4:…:4F:AC 불일치)는 App Link 와 상관없이 패스키도 막는 결함이라 #764 가 이미 추적하고 있다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:platformCI·빌드·릴리스·저장소 운영 영역test테스트·검증·회귀 방지 작업

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions