Apple APP & 로그인 사용자 이전

DHY
tving.team
Published in
11 min readMay 15, 2022

안녕하세요. 티빙에서 백엔드 개발팀에서 회원/빌링 업무를 맡은 염대훈입니다. 회사에 입사하여 다양한 일들이 있었지만, 그중에서도 앱 이관이라는 생소한 작업을 했던 경험을 소개해 드리고자 합니다.

주제는 APP 이관이지만 주된 내용은 백엔드 관점에서 Apple로 로그인하기 사용자 이전과 관련된 내용을 주로 작성하였습니다.

애플 앱 이관

앱이관 설명에 앞서

  • App을 App Store에 런칭하기 위해서는 개인/회사 소속의 앱 스토어 개발자 계정을 생성해야합니다.
  • App은 개인/회사 소속이 App Store에서 노출됩니다.
앱의 회사 정보가 Tving으로 앱스토어에 노출

앱 이관이란?

  • App을 소유한 회사가 변경 되었을 때 App을 다른 회사 개발자 계정으로 이동시키는 행위
  • TVING의 경우 CJ ENM 애플 개발자 계정에 등록된 TVING App을 TVING 애플 개발자 계정으로 이관을 진행하였습니다.

앱 이관 목적

  • 2020.10.01 티빙은 CJ ENM에서 분사하여 새로운 조직에서 서비스를 운영/개발하게 되었습니다.
  • 분사 이후 운영을 맡으며 App 설정과 관련된 다양한 상황들을 마주할 수 있었습니다.

App Store에 등록된 Tving App의 소속이 CJ ENM으로 노출

앱 이관 이전에는 CJ ENM 소속으로 노출

신규 기능 개발

  • 당시 예정되어 있었던 Apple Tv App 개발을 위해서는 TVING IOS App이 포함된 TVING App Store 계정이 필요했습니다.

앱 이관 절차

  1. 기존 개발자 계정(ENM)에서 이관 요청
  2. 신규 개발자 계정(TVING)에서 이관 수락

App Store에서 이관 요청/수락으로 간단히 마무리 될 줄 알았으나 관련된 내용들을 조사하다 보니 TVING App에서 제공하는 기능들에서 추가 검토 사항이 확인되었습니다.

  1. 인앱결제 영수증 검증(verifyReceipt) 패스워드 변경 필요
  2. Apple로 로그인하기 사용자 전송

Apple로 로그인하기

  • 현재 티빙에서는 TVING 회원 이외에도 SNS 로그인, Cjone, Apple 로그인을 지원하고 있습니다.

작업 범위

Apple Login Flow
  • Tving 페이지에서 로그인을 시도하면 Apple 페이지로 이동하고 로그인이 완료되면 로그인 페이지 진입시 요청한 콜백(티빙 페이지)로 JWT 값이 전달되며 사용자 고유값(sub)을 DB에서 조회해 기존 회원이 확인되면 로그인, 기존 회원에서 조회되지 않으면 회원가입을 진행합니다.
{
"iss": "https://appleid.apple.com",
"aud": "com.cjenm.xxx.xxxx",
"exp": 1617928952,
"iat": 1617842552,
"sub": "001326.2803546asdfasdfasdfa8ddf8f1.0052",
"c_hash": "xxxxxxxxxxxx",
"email": "xxxxxxxxxxxx@privaterelay.appleid.com",
"email_verified": "true",
"is_private_email": "true",
"auth_time": 1617842552,
"nonce_supported": true
}
  • 앱 이관 이후 Apple 로그인 사용자들에 대한 고유 식별 값(sub)이 바뀌는 것으로 확인되었으며, 앱 이관 이후 로그인하는 기존 사용자들이 신규 회원가입 처리될 수 있어 기존 사용자들의 식별값을 신규값으로 변경하는 작업이 필요합니다.

해결방안

  • 앱 이관을 시작 하면 상태가 ‘이관 중' 상태가 됩니다. 이관 중 상태에서는 로그인 응답에 전송 식별자 필드가 추가로 전달되고 이 값을 기반으로 변경될 고유값 조회가 가능한 것으로 확인되었습니다.
  • 전송 식별자와 변경될 고유값 조회가 API로 조회가 가능한 것으로 확인하였고, 앱 이관 진행 전 신규 고유값을 조회하여 일괄 Update 처리 진행하기로 하였습니다.
  • 이관중 기존 사용자들이 아닌 신규 사용자의 경우 transfer_sub, new_sub에 대한 동작이 불확실해 Apple 로그인/회원가입을 화면에서 차단하고 진행하는 것으로 결정하였습니다.

transfer_sub : 전송 식별자, 앱 이관 이후 사용될 신규 sub를 조회할 때 사용
sub : 로그인 시 사용자를 식별하는 고유값
new_sub (가칭) : 앱 이관 이후 사용될 신규 sub

시나리오1이관 전
1. Apple로 로그인하기 진입 차단
2. transfer_sub 조회
3. transfer_sub를 통해 new_sub 조회
4. DB에 저장된 sub 값을 new_sub값으로 일괄 UPDATE 처리
이관 후
1. Apple로 로그인하기 진입 정상화 및 로그인 정상 처리
  • 시나리오1를 기반으로 작업을 준비하였으나, 테스트 결과 2번의 trasnfer_sub -> new_sub 조회가 앱 이관 이전에는 되지 않는것으로 확인되었습니다.
시나리오2이관 전
1. trasnfer_sub 조회
이관 중
1. transfer_sub를 통해 new_sub 조회
2. DB에 저장된 sub 값을 new_sub값으로 일괄 UPDATE 처리
이관 후
1. 로그인 처리 정상 확인
  • transfer_sub 조회의 경우 이관중에도 가능하나 Apple로 로그인하기 사용자가 많아 시간 단축을 위해 사전에 생성하는 방법을 선택하였습니다.

앱 이관전

  • 이관 전/후 계정에 대한 다음 값들이 필요합니다.
    (개발자 계정에 확인 가능)
team_id
recipient_team_id (이관후 계정 team id)
client_id
key_id
private_key
  • 작업 테이블 생성
    Apple Login 사용자들의 tving id, sub 추출
tving id/sub/transfer_sub/new_sub
- tving id : TVING 회원 식별값
- sub : 이관전 애플 로그인 고유값
- transfer_sub
- new_sub
  • access_token 조회
Request
POST https://appleid.apple.com//auth/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&scope=user.migration&client_id={client_id}&client_secret={client_secret}Response
{ "access_token":"adg6105ed7a4def32adec143038877c2b.0.nx.20LreF67Or9", "token_type":"Bearer", "expires_in":3600}

transfer_sub 조회시 사용하는 client_id, client_secret
- CJ ENM 개발자 계정 client_id, client_secret 사용

new_sub 조회시 사용하는 client_id, client_secret
- TVING 개발자 계정 client_id, client_secret 사용

  • transfer_sub 생성
Request
POST https://appleid.apple.com/auth/usermigrationinfo
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer {access_token}
sub={sub}&target={recipient_team_id}&client_id={client_id}&client_secret={client_secret}Response
{"transfer_sub":"760417.ebbf12acbc78e1be1668ba852d492d8a.1827"}
  1. Apple로 로그인하기 사용자 tving id, sub값을 임시 테이블에 저장
  2. 임시 테이블의 sub값을 조회해 transfer_sub 조회 작업 진행
    (50000개 데이터 조회시 40분 소모)
  3. transfer_sub를 임시 테이블에 update처리
  4. Apple로 로그인/회원가입 차단 작업
  5. 이관전 1번에서 추출되지 않은 추가 사용자들에 대한 tving id/sub 추출, transfer_sub 조회

로그인/회원가입 차단 시간을 줄이기 위해 앱 이관 이전 1~3번의 작업을 미리 수행해두고 1번 이후 추가 인입 된 사용자에 대해서는 로그인/회원가입 차단 이후 추가로 추출을 진행하였습니다. 이로써 앱 이관 전 필요한 작업들에 대해 완료되었습니다!

앱 이관 진행 중

  • new_sub 조회
Request
POST https://appleid.apple.com/auth/usermigrationinfo
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer {access_token}
transfer_sub={transfer_sub}&client_id={client_id}&client_secret={client_secret}Response
{ "sub":"820417.faa325acbc78e1be1668ba852d492d8a.0219", "email": "xxxxxxxxx@privaterelay.appleid.com", "is_private_email" : true}
  1. 앱 이관을 시작하고 이관전 조회했던 transfer_sub로 new_sub를 조회하였습니다.
    (조회 시간은 transfer_sub 조회시와 비슷하게 소요)
  2. new_sub를 임시 테이블에 저장

앱 이관 중 상태에서 다행히도 transfer_sub 로 new_sub 조회가 정상적으로 되는것으로 확인하였고, 이를 임시테이블에 저장하였습니다.

앱 이관 완료

앱 이관이 완료되고, 애플로 로그인하기 Service ID 또한 잘 이관 처리된것으로 확인하였습니다!
개발 환경에서 몇몇 개발자 계정으로 확인해보니 애플 로그인 응답값의 결과에서 식별값이 new_sub로 오는 것으로 확인했습니다.

  1. 임시 테이블에 저장하였던 new_sub 를 서비스에서 사용하는 sub field에 update
  2. Apple 로그인 진입 정상화 처리

위의 과정을 거쳐 new_sub를 서비스에서 사용하도록 조치하여 애플로 로그인하기 이관이 완료되었습니다.

앱 이관 전체 과정

과정

  • App Store Tving 계정 설정
  • Apple Login 사용자 데이터 이전
  • 인앱결제 영수증 검증(verifyReceipt) 패스워드 변경
  • 앱 이관/승인 처리
  • Apple Login 진입 차단
  • FairPlay 인증서 교체

문제점

  • 이관 요청 수락이 되지 않는 현상
    > 개발자 계정 세금 정보 등 계정 정보에 누락이 있어 해당 값 입력 후 재 시도

마무리

우리 팀은 티빙의 백엔드 개발팀으로 회원/빌링 업무를 담당하고 있습니다. 회원은 로그인/회원가입/인증 등의 업무를 담당하고 있으며, 빌링은 이용권/간편결제/쿠폰 등의 업무를 담당하고 있습니다.

Apple 로그인 사용자 이전 내용을 백엔드 관점에서 주로 작성하였지만, 우리 부서 이외에도 많은 부서가 같이 노력하고 고생해서 앱 이관 & Apple 로그인 사용자 이전이라는 큰 이벤트를 잘 마무리할 수 있었다고 생각합니다.

앱 이관하면서 가장 힘들었던 부분은 레퍼런스, 사례가 없어서 확신을 갖고 작업을 진행하는 게 어려웠습니다. 비슷한 작업을 수행하는 분들에게 도움이 되길 바라며, 앞으로도 다양한 주제로 찾아뵙겠습니다!
https://team.tving.com/8338b70b-a9f8-4ddf-872d-b2602992716a

--

--