Universal Links와 App Links에 이해하기 위해 여러 게시물들을 확인했지만, 대부분 모바일앱 개발자분들이 관심사항인 듯했습니다. 실제로 해당 기능의 구현 주체가 모바일앱이긴 하지만, 웹을 통한 호스팅 방식도 포함하기에 해당 영역의 이해가 필요하다고 생각했습니다. Universal Links와 App Links을 검색면, Deep Links가 나오고 이어서 Deep Linkings 이 나오기에 용어 정리부터 진행하고자 합니다.
Deep Linkings
Deep Linkings은 웹상에서 "https://example.com"처럼 최상위 페이지를 가리키는 것이 아닌, 특정 페이지로 연결되는 "https://example.com/path/page"와 같은 URL을 의미합니다. 하지만 평소 저러한 형태의 링크를 "Deep Link"라고 부르진 않습니다. 웹에서는 굳이 "Link"와 "Deep Link"를 구분지어서 말하지 않기 때문입니다. 그렇기 때문에 우리가 "Deep Link"라고 부르는 이 기술은 대부분 모바일앱의 영역이라고 불립니다.
즉, Deep Linkings은 개념으로서 모바일앱이나 웹상에서 특정 콘텐츠로 직접 링크 기술 및 방법으로 이해할 수 있습니다.
Reference
Deep Link (mobile deep linking)
Deep Link는 단순히 모바일 앱을 실행시키는 것뿐만 아니라 모바일 앱의 특정 위치로 까지 연결되는 non-HTTP URI를 사용하여 구성합니다. URI Scheme을 특정하여 자신의 모바일 앱을 연결시킬 수 있습니다.
- `twitter://` : Twitter의 모바일 앱을 시작하기 위한 iOS URI입니다.
- `YouTube://` : YouTube의 모바일 앱을 실행하기 위한 iOS URI입니다.
하지만 이런 방식은 바로 한계에 직면합니다. 모바일 앱의 수가 점차 증가하면서 URI Scheme 이 중복되는 경우가 발생합니다. 앱의 입장에서는 앱에 등록된 URI Scheme 값이 자신들만의 고유 값인지 알 수 없기 때문입니다.
또한, 앱이 설치되어 있지 않은 경우 에러페이지를 보여줍니다. (fallback URL이 지원되지 않습니다.)
추가적으로 모바일 앱의 여러 취약점들도 확인되었지만 이 글에서는 다루지는 않습니다.
Reference
Universal Links, App Links
위에서 언급된 Deep Link의 단점인 URI Scheme의 중복 문제를 해결하기 위해 고유 값을 보장할 수 있는 도메인 주소를 활용해 Deep Link의 실행값으로 사용하는 방식이 새롭게 사용됩니다. 이를 iOS에서는 Universal Link, Android에서는 App Link라고 부릅니다.
이처럼 도메인 주소를 활용하기 때문에 Deep Link에서 처럼 모바일앱으로 이동을 할 수 있는 정보를 도메인 주소부터 얻어야 합니다.
Universal Links, App Links를 사용하기 위해서는 반드시 아래 URL 형식과 일치하게 연관 파일을 생성해 호스팅 해줘야 합니다.
- Universal Links : https://example.com/.well-known/apple-app-site-association
- iOS 13 미만:{domain}/apple-app-site-association
- ex: https://www.youtube.com/.well-known/apple-app-site-association
- App Links: https://www.example.com/.well-known/assetlinks.json
Reference
IOS Association File
{
"applinks": {
"details": [
{
"appIDs": [ "ABCDE12345.com.example.app", "ABCDE12345.com.example.app2" ],
"components": [
{
"#": "no_universal_links",
"exclude": true,
"comment": "Matches any URL with a fragment that equals no_universal_links and instructs the system not to open it as a universal link."
},
{
"/": "/buy/*",
"comment": "Matches any URL with a path that starts with /buy/."
},
]
}, {
"appIDs": [ "ABCDE12345.com.example.app3"],
"paths": [
"/test1/*",
"/test2/*"
]
}
]
},
"webcredentials": {
"apps": [ "ABCDE12345.com.example.app" ]
},
"appclips": {
"apps": ["ABCED12345.com.example.MyApp.Clip"]
}
}
"appIDs"와 "apps" 에는 "Application identifier"를 명시합니다. Application identifier는 아래의 구조로 생성됩니다.
<Application Identifier Prefix>.<Bundle Identifier>
- Application Identifier Prefix: Apple로부터 제공받는 고유한 식별자입니다.
- Bundle Identifier: 개발자가 직접 정의하는 앱의 고유한 식별자입니다.
- 이 식별자는 역순 도메인 이름 형식을 따르는 것이 일반적입니다.
이렇게 구성된 Application Identifier는 앱을 고유하게 식별하는 데 사용됩니다.
"details" 에는 appIDs에 작성된 앱에게 적용되는 Universal Link URL의 규칙을 추가합니다.
- components: 여러 옵션들을 사용하여 보다 디테일한 Universal Link URL 규칙을 추가 할 수 있습니다.
- paths: 웹사이트의 특정 경로를 앱으로 열리게 할 때 사용합니다.
- 앱에서 해당 처리가 되어야 한다.
Reference
- https://developer.apple.com/documentation/xcode/supporting-associated-domains
- https://yoojin99.github.io/app/Universal-Link/
- https://ohgyun.com/707
Android AssetLink File
[
{
"relation": [
"delegate_permission/common.handle_all_urls"
],
"target" : {
"namespace" : "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": [
"hash_of_app_certificate"
]
}
}
]
- namespace: 보통 "android_app"으로 설정되며, Android 앱과 웹사이트 간의 연결을 나타내는 데 사용되는 표준적인 값입니다.
- package_name: Android 앱의 패키지 이름을 지정합니다.
- sha256_cert_fingerprints: 앱 서명 인증서의 SHA256 지문입니다.
Android에서는 IOS와 다르게 path를 명시하는 영역이 없는데 이는 Android 앱의 AndroidManifest.xml 파일에서 App Links를 설정합니다. 이를 통해 웹사이트의 특정 URL이 어떤 Activity로 열릴지를 정의합니다.
Reference
- https://developer.android.com/training/app-links/verify-android-applinks?hl=ko
- https://developer.android.com/studio/write/app-link-indexing?hl=ko
- https://developers.google.com/digital-asset-links/v1/getting-started?hl=ko
마치며
어떤 URL에 대하여 모바일앱의 어떤 화면이 열릴지를 정의하는 부분은 모바일앱에서 영역입니다.
하지만 "모바일앱이 설치되어있으면 모바일앱으로, 그렇지 않은경우 그대로 웹으로 연결"이라는 니즈를 충족하기 위해서는 Universal Link나 App Links가 단순히 링크역할만을 하는 도메인으로 호스팅되는것이 아닌, 서비스 중이 URL을 통해 호스팅이 되어야 합니다. 웹을 관리하고 있는 입장이라면 자신의 도메인을 통해 호스팅되는 파일의 목적과 방식에 대하여 알고 있는것은 필요하다고 생각합니다.
'개발' 카테고리의 다른 글
네트워크 용어 정리 (1) | 2023.11.24 |
---|---|
데몬 (Daemon) (0) | 2023.09.08 |
Exponential Backoff (0) | 2022.12.22 |
Redis 에서 "Used Memory RSS" 가 지속적으로 증가할때 (0) | 2022.12.22 |
Android WebView Debugging (0) | 2021.07.23 |