| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 윈도우10 Wake On Lan
- docker
- 홈서버
- hermes
- IOCP
- mobile
- 오픈소스
- 벤치마크
- github
- AI
- Winsock
- AI에이전트
- codex
- OpenAI
- GIT
- 윈도우10 WOL
- LLM
- telegram
- wol
- 개발도구
- ai 코딩 에이전트
- Wake On Lan
- docker-compose
- IOCP 클라이언트
- 셀프호스팅
- 자동화
- IOCP 서버
- docker desktop
- Firefly
- n8n
- Today
- Total
;
Firebase Dynamic Links 종료 대응과 자체 링크 라우팅 서버 구축 방법 본문
Firebase Dynamic Links가 종료되면 예전에 만든 page.link 주소가 더 이상 앱 실행 경로를 보장하지 않습니다. QR 코드, 문자, 카카오톡 공유 링크를 오래 뿌려 둔 서비스라면 미리 자체 링크 서버로 바꿔야 합니다.
실제 문제 상황

앱 딥링크는 단순히 앱을 여는 주소가 아닙니다. iOS는 유니버설 링크용 apple-app-site-association 파일을 확인하고, Android는 앱 링크 검증 정보를 봅니다. 앱이 없으면 웹 fallback이나 스토어로 보내는 규칙도 같이 필요합니다.
기존 공유 링크가 이미 배포됐다면 종료일 전에 대체 주소를 먼저 준비해야 합니다.
이전에 아이폰 탈옥 없이 듀얼 카카오톡 설치하기에서 iOS 앱 설치 경로를 다뤘다면, 이번에는 이미 배포된 공유 링크를 앱 진입 경로와 다시 연결하는 작업입니다.
적용 대상

- 예전 Firebase Dynamic Links 주소를 QR, 문자, 카카오톡 공유에 사용한 경우.
- iOS 유니버설 링크와 Android 앱 링크를 직접 운영해야 하는 경우.
- 앱 미설치 사용자를 스토어나 웹 랜딩으로 보내야 하는 경우.
- 내부 테스트용 링크만 쓰는 작은 프로젝트는 우선순위가 낮습니다.
사전 준비 사항
- 링크용 도메인: 예시는
link.example.com으로 둡니다. - iOS Team ID와 Bundle ID.
- Android package name과 SHA-256 certificate fingerprint.
- Nginx나 Caddy 같은 정적 파일 제공 서버.
설치 절차
먼저 /.well-known/apple-app-site-association 파일을 준비합니다. iOS는 확장자 없는 JSON 파일을 기대하므로 Content-Type: application/json으로 내려주시면 됩니다.
{
"applinks": {
"apps": [],
"details": [
{
"appIDs": ["<TEAM_ID>.com.example.app"],
"components": [
{ "/": "/p/*", "comment": "product deep link" },
{ "/": "/share/*", "comment": "share deep link" }
]
}
]
}
}
Android는 /.well-known/assetlinks.json에 앱 서명 정보를 넣습니다.
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["<SHA256_FINGERPRINT>"]
}
}
]
1. 자체 링크 라우팅

link.example.com/p/123처럼 짧은 주소를 받으면 서버에서 앱 진입 정보와 fallback 주소를 함께 결정합니다. 앱이 열리지 않는 브라우저에서는 웹 랜딩을 보여주고, 설치가 필요한 경우에는 스토어 버튼을 표시합니다.
카카오톡 공유는 executionParams 값을 같이 넣어야 앱에서 어느 화면을 열지 알 수 있습니다. 공유 메시지에는 긴 원본 URL 대신 자체 링크 주소만 넣어주시면 됩니다.
1.1. Nginx 설정 예시
아래처럼 .well-known 파일은 리다이렉트 없이 바로 내려야 합니다.
server {
server_name link.example.com;
location /.well-known/apple-app-site-association {
default_type application/json;
root /var/www/link.example.com;
}
location /.well-known/assetlinks.json {
default_type application/json;
root /var/www/link.example.com;
}
location / {
proxy_pass http://127.0.0.1:8080;
}
}
주요 오류 및 해결 방안
제 경우 원인은 대부분 AASA 파일을 리다이렉트 뒤에 둔 점이었습니다. iOS는 /.well-known/apple-app-site-association 요청에서 301이나 HTML 응답을 만나면 링크 검증이 깨질 가능성이 높습니다. 해당 경로만큼은 인증, 리다이렉트, HTML 템플릿을 빼고 바로 JSON을 내려주는 편이 안전합니다.
확인
curl -I https://link.example.com/.well-known/apple-app-site-association
curl https://link.example.com/.well-known/assetlinks.json
첫 명령에서 200과 application/json이 보이고, 두 번째 명령에서 package name과 fingerprint가 출력되면 기본 검증 파일 제공은 정상입니다.
'Mobile' 카테고리의 다른 글
| Tailscale로 집 서버를 안전하게 외부 접속하는 방법 (0) | 2026.07.05 |
|---|---|
| Hermes Mobile 안드로이드 앱 설치하고 기존 Hermes와 연결하는 방법 (0) | 2026.07.05 |
| 아이폰 탈옥 없이 듀얼 카카오톡 설치하기 (8) | 2020.12.06 |
| 안드로이드 폰으로 웹서버 구축하기 (그누보드, 제로보드, PHP, Mysql, Nginx) (15) | 2016.11.15 |
| 갤럭시 탭 A6 T-280 루팅하기 (Samsung Galaxy Tab A6 SM-T280 Root) (83) | 2016.11.14 |
