사전 딥 링크
개념

딥 링크

gabury1고친 사람 github-actions[bot]

딥 링크는 누르면 앱의 첫 화면을 건너뛰고 안쪽의 한 화면으로 바로 데려가는 링크입니다. 친구가 보낸 상품 링크를 누르면 쇼핑 앱의 첫 화면이 아니라 그 상품 화면이 뜹니다. 앱 화면마다 주소를 붙여 두어서 가능한 일입니다. 웹에서는 사이트 첫 페이지 대신 안쪽 페이지로 곧장 가는 링크를 같은 이름으로 부르기도 합니다.

쉽고 빠른 이해

딥 링크는 앱 안쪽의 한 화면을 가리키는 주소입니다. 배달 앱의 「음식이 출발했습니다」 알림을 누르면 배달 현황 화면이 바로 뜨는 것이 딥 링크 덕분입니다.

이게 없으면 링크는 앱을 열어 주기만 합니다. 사용자는 첫 화면에서 메뉴를 뒤져 그 화면을 다시 찾아야 합니다.

어떻게 도나:

  1. 앱이 「이런 주소는 내가 연다」고 휴대폰 운영체제에 미리 알려 둡니다
  2. 사용자가 그 주소를 누르면 운영체제가 앱을 열고 주소를 넘깁니다
  3. 앱이 주소를 읽고 그에 맞는 화면을 엽니다

대가도 있습니다. 앱은 누가 만들었는지 모를 주소를 받아 화면을 엽니다. 주소에 담긴 값을 하나하나 확인해야 합니다. 누가 만든 앱인지 운영체제가 확인할 수 있게, 웹 서버에 확인 파일을 올려 두어야 하는 방식도 있습니다.

딥 링크는 주소만으로 다시 그릴 수 있는 화면에 붙입니다. 앞 단계에서 고른 값이 있어야 뜨는 화면에는 붙이지 않습니다.

상세

큰 건물로 손님을 부를 때 건물 주소만 적어 주면 손님은 로비에 도착합니다. 거기서 몇 층 어느 방인지 다시 물어야 합니다. 초대장에 방 번호까지 적어 주면 손님은 곧장 그 방 문 앞으로 갑니다.

딥 링크는 방 번호까지 적힌 초대장입니다. 로비는 앱의 첫 화면입니다. 방은 상품 화면이나 주문 화면 같은 앱 안쪽의 한 화면입니다.

주소가 없던 앱 화면

웹 페이지는 저마다 주소를 가집니다. 이 주소를 URL(Uniform Resource Locator, 자원 위치 지정자)이라고 부릅니다. https://shop.example.com/products/42 는 어느 쇼핑 사이트의 42번 상품 페이지를 가리킵니다. 누구든 이 주소를 받으면 그 페이지로 바로 갑니다.

웹에서 딥 링크라는 말은 이런 링크를 가리켰습니다. 사이트 첫 페이지가 아니라 안쪽 깊은 페이지로 바로 들어가는 링크입니다. 웹은 모든 페이지가 주소를 가지므로 따로 할 일이 없습니다.

앱 화면은 사정이 다릅니다. 앱은 휴대폰에 설치된 프로그램이라 화면마다 주소가 붙어 있지 않습니다. 딥 링크가 없으면 밖에서 앱을 여는 길은 아이콘을 누르는 것뿐입니다. 아이콘으로 열면 언제나 첫 화면이 뜹니다.

모바일에서 딥 링크는 앱 화면에 주소를 붙여 주는 일입니다. 주소가 생기면 문자 메시지나 이메일이나 푸시 알림에서 앱의 한 화면을 가리킬 수 있습니다. 아래부터는 이 모바일의 뜻으로 씁니다.

링크가 앱 안쪽까지 들어가야 하는 까닭

배달 앱이 「주문하신 음식이 출발했습니다」라는 푸시 알림을 보냈다고 해 봅시다. 사용자가 알림을 누르며 기대하는 것은 그 주문의 배달 현황 화면입니다.

딥 링크가 없으면 알림은 앱을 열어 주기만 합니다. 사용자는 첫 화면에서 주문 내역 메뉴를 찾아 들어가야 합니다. 한 번 누르면 끝날 일이 서너 번으로 늘어납니다.

공유 링크도 같습니다. 친구가 보낸 상품 링크를 눌렀다고 합시다. 쇼핑 앱 첫 화면이 뜨면 그 상품을 검색해서 다시 찾아야 합니다. 딥 링크는 이렇게 다시 찾는 수고를 없앱니다.

운영체제가 링크를 앱에 넘기는 흐름

링크를 누른 순간 그 링크를 어느 앱이 열지 정하는 것은 휴대폰의 운영체제입니다. 앱은 설치될 때 「이런 모양의 주소는 내가 연다」는 목록을 운영체제에 미리 알려 둡니다.

안드로이드에서는 이 목록을 매니페스트에 적습니다. 매니페스트는 앱이 어떤 화면과 권한을 갖는지 운영체제에 알리는 설정 파일입니다.

매니페스트 안에서 받을 주소의 모양을 적는 항목이 인텐트 필터입니다. 「https://shop.example.com/products 로 시작하는 주소는 상품 화면이 받는다」처럼 적습니다. 아이폰의 운영체제인 iOS 에서도 앱 설정에 받을 주소를 적어 둡니다.

사용자가 링크를 누르면 운영체제가 이 목록을 뒤져 맞는 앱을 찾습니다. 찾으면 그 앱을 열고 누른 주소를 넘깁니다. 주소를 받은 앱은 경로를 읽어 어느 화면을 열지 정합니다.

사용자 지정 스킴

URL 맨 앞의 https 나 mailto 같은 부분을 스킴이라고 부릅니다. 스킴은 이 주소를 무엇으로 열지 알려 주는 앞부분입니다. https 면 브라우저가 엽니다. mailto 면 메일 앱이 엽니다.

첫째 방식은 앱이 자기만의 스킴을 새로 지어 쓰는 것입니다. 쇼핑 앱이 myshop 이라는 스킴을 운영체제에 알려 두면 myshop://products/42 는 그 앱이 엽니다. 이런 스킴을 사용자 지정 스킴(custom URL scheme)이라고 부릅니다.

만들기는 쉽지만 약점이 둘 있습니다. 하나는 스킴에 주인이 없다는 것입니다. 다른 앱이 똑같이 myshop 을 알려 두어도 운영체제는 막지 않습니다. 둘이 겹치면 어느 앱이 열릴지 장담할 수 없습니다.

다른 하나는 앱이 없을 때입니다. 앱이 깔려 있지 않으면 이 주소를 열 곳이 없습니다. 브라우저는 myshop 이 무엇인지 모릅니다. 사용자에게는 오류 창이 뜨거나 아무 반응이 없습니다.

도메인 주인이 보증하는 웹 주소

둘째 방식은 사용자 지정 스킴 대신 평범한 웹 주소를 씁니다. https://shop.example.com/products/42 를 누르면 앱이 깔려 있을 때는 앱이 이 주소를 엽니다. 앱이 없으면 브라우저가 같은 주소의 웹 페이지를 엽니다.

웹 주소는 어느 앱이든 받겠다고 적어 둘 수 있습니다. 그래서 운영체제는 이 앱이 shop.example.com 의 주인이 만든 앱인지 확인합니다. 확인은 도메인의 주인이 자기 웹 서버에 파일을 올려 두는 식으로 합니다.

그 파일에는 「이 도메인의 링크는 이 앱이 열어도 된다」는 뜻으로 앱의 식별자가 적혀 있습니다. 앱이 설치되면 운영체제가 이 파일을 받아 설치한 앱과 대조합니다. 맞으면 그때부터 이 도메인의 링크를 그 앱에 넘깁니다.

sequenceDiagram
    participant 사용자
    participant 운영체제
    participant 서버 as 웹 서버
    participant 앱
    사용자->>운영체제: 앱을 설치한다
    운영체제->>서버: 확인 파일을 요청한다
    서버-->>운영체제: 이 도메인을 열어도 되는 앱의 식별자
    Note over 운영체제: 설치한 앱과 대조해 기억한다
    사용자->>운영체제: 링크를 누른다
    운영체제->>앱: 주소를 넘기며 연다

그림의 앞 화살표 셋은 설치할 때 일어납니다. 뒤 화살표 둘은 사용자가 링크를 누를 때마다 일어납니다. 링크를 누르는 순간에는 확인을 다시 하지 않고 기억해 둔 결과를 씁니다.

플랫폼마다 붙은 이름과 확인 파일

안드로이드와 iOS 는 이 방식에 저마다 이름을 붙였습니다. 확인 파일의 이름도 다릅니다. 둘 다 도메인의 /.well-known/ 이라는 약속된 경로 아래에 둡니다.

플랫폼 이름 확인 파일 경로
안드로이드 Android App Links /.well-known/assetlinks.json
iOS 유니버설 링크 /.well-known/apple-app-site-association

안드로이드 앱은 만든 사람만 가진 키로 서명해서 내놓습니다. 이 키를 알아보게 해 주는 증명서가 서명 인증서입니다. 남은 그 키가 없으니 같은 인증서로 서명한 앱을 만들 수 없습니다.

안드로이드 확인 파일에는 앱의 패키지 이름을 적습니다. 패키지 이름은 com.example.shop 처럼 앱마다 붙는 이름입니다. 이름은 누구든 똑같이 지어 붙일 수 있어서 이것만으로는 가짜 앱을 거르지 못합니다.

파일에는 서명 인증서의 지문도 함께 적습니다. 지문은 인증서를 짧은 값으로 줄인 것입니다. 이름만 같은 가짜 앱은 같은 키로 서명할 수 없어서 지문이 달라 걸러집니다.

iOS 파일에는 앱의 식별자와 그 앱이 열 경로를 적습니다. 두 파일 모두 HTTPS(HyperText Transfer Protocol Secure)로 내려 줘야 합니다. iOS 는 다른 주소로 리다이렉트한 뒤에 받은 파일을 인정하지 않습니다.

이 파일을 올리는 일은 백엔드 쪽 몫입니다. 파일이 없거나 받아지지 않으면 확인이 실패합니다. 그러면 링크가 앱으로 곧장 가지 않고 브라우저로 새어 나갑니다.

앱이 깔려 있지 않을 때

두 방식이 가장 크게 갈리는 것은 앱이 없는 사용자를 맞을 때입니다. 아래 그림이 링크를 누른 뒤의 갈림을 보입니다.

flowchart TD
    A["링크를 누른다"] --> B{"앱이 깔려 있나"}
    B -->|예| C["앱이 열리고 그 화면이 뜬다"]
    B -->|아니오| D{"어느 방식인가"}
    D -->|사용자 지정 스킴| E["열 곳이 없다"]
    D -->|웹 주소| F["브라우저가 같은 주소의 웹 페이지를 연다"]

웹 주소 방식은 앱이 없어도 링크가 죽지 않습니다. 대신 웹 사이트에도 같은 경로의 페이지를 마련해 두어야 합니다. 페이지가 없으면 앱이 없는 사용자는 페이지를 찾을 수 없다는 오류를 봅니다.

앱을 설치하게 한 뒤 원래 가려던 화면으로 보내고 싶을 때도 있습니다. 링크를 누른 사용자를 앱 스토어로 먼저 보냅니다. 설치 뒤 첫 실행에서 원래 가려던 화면을 엽니다. 이것을 지연 딥 링크(deferred deep link)라고 부릅니다. 설치를 거치는 동안 링크가 끊기므로 누른 링크를 따로 기억해 두는 장치가 필요합니다.

링크를 받은 앱이 할 일

앱이 받는 것은 주소 문자열 하나입니다. 앱은 주소의 경로를 읽어 열 화면과 불러올 값을 정합니다. 경로가 /products/42 면 상품 화면을 열고 42번 상품을 불러옵니다. 웹 서버가 요청 경로를 보고 처리할 함수를 고르는 것과 같은 일입니다.

딥 링크 주소는 누구나 만들어 보낼 수 있습니다. 문자 메시지에 섞인 링크 하나로 앱의 어느 화면이든 열 수 있다는 뜻입니다. 그래서 앱은 받은 주소를 믿을 수 없는 입력으로 다룹니다. 백엔드가 밖에서 들어온 요청 값을 검증하는 것과 같은 태도입니다.

없는 경로나 이상한 값이 오면 첫 화면으로 돌려보냅니다. 로그인이 필요한 화면이면 로그인부터 거치게 합니다. 결제나 삭제처럼 되돌릴 수 없는 일은 링크만으로 실행하지 않고 사용자에게 한 번 더 묻습니다.

딥 링크를 붙이는 화면과 안 붙이는 화면

딥 링크는 주소만으로 내용을 다시 불러올 수 있는 화면에 붙입니다. 상품 화면은 상품 번호만 있으면 서버에서 내용을 다시 받아 그릴 수 있습니다.

결제 확인 화면처럼 앞 단계에서 고른 값이 있어야 뜨는 화면은 다릅니다. 주소 하나만으로는 장바구니에 무엇을 담았는지 알 수 없습니다. 이런 화면은 링크로 들어오면 그 흐름의 첫 단계로 보냅니다.

딥 링크가 쓰이는 곳

앱 밖에서 앱 안의 한 화면을 가리켜야 하는 곳이면 어디든 딥 링크가 쓰입니다. 흔한 곳을 표로 모았습니다.

쓰는 곳 링크가 여는 화면
푸시 알림 알림이 말한 주문이나 메시지
공유 링크 친구가 보낸 상품이나 게시글
이메일 · 문자 메시지 안내한 이벤트 화면
광고 광고한 상품 화면
QR(Quick Response) 코드 매장에 붙은 쿠폰 화면
외부 로그인 로그인을 마친 뒤 돌아올 앱 화면

푸시 알림에서는 서버가 알림에 실어 보내는 데이터 묶음인 페이로드에 딥 링크 주소를 함께 넣습니다. 사용자가 알림을 누르면 앱이 이 주소를 꺼내 화면을 엽니다. 어느 화면 주소를 실을지는 알림을 만드는 백엔드가 정합니다.

외부 로그인도 딥 링크로 돌아옵니다. 외부 로그인에 쓰는 OAuth 2.0 같은 절차는 로그인이 끝나면 미리 정해 둔 주소로 사용자를 돌려보냅니다. 이 주소를 앱의 딥 링크로 두면 브라우저의 로그인 화면에서 앱으로 되돌아옵니다.

이 돌아올 주소를 리다이렉트 URI라고 부릅니다. URI(Uniform Resource Identifier, 통합 자원 식별자)는 URL 을 포함하는 더 넓은 이름입니다. 여기서는 URL 과 같은 것으로 읽어도 됩니다.

관련 항목

딥 링크가 속하는 상위 분류

하이퍼링크 · URL · 모바일 개발 · 앱 내비게이션

딥 링크를 구현하는 방식과 플랫폼 기능

URL 스킴 · Android App Links · 유니버설 링크 · 지연 딥 링크 · 인텐트 · 인텐트 필터 · 매니페스트

딥 링크의 도메인 주인을 확인하는 파일과 규약

Digital Asset Links · apple-app-site-association · Well-Known URI · HTTPS · 도메인 이름 · 코드 서명

딥 링크를 실어 나르는 채널

푸시 알림 · 페이로드 · QR 코드 · 이메일 마케팅 · 공유 시트 · 앱 스토어

딥 링크를 받아 화면을 여는 앱 구성 요소

액티비티 · 웹뷰 · 네이티브 앱 · iOS · Android

딥 링크로 앱에 돌아오는 로그인 절차

OAuth 2.0 · 리다이렉트 URI · PKCE · 소셜 로그인

딥 링크를 노리는 공격과 그 방어

입력 검증 · 피싱 · URL 스킴 하이재킹 · 오픈 리다이렉트

앱이 없을 때 딥 링크를 대신하는 수단

웹 페이지 · 프로그레시브 웹 앱 · 스마트 앱 배너 · 랜딩 페이지

다른 이름: deep link · deep linking · 딥링크 · 딥 링킹