애플 아이디로 로그인 구현 고민..

프로그래밍/서버2020. 4. 27. 12:58

이전의 몇몇 포스팅에서 애플 아이디로 로그인 구현하기의.. 기본적인 사항에 대해 다뤘습니다..

자세히 정리할 시간이 없어서.. 잘 정리된 자료는 아닙니다;

 

애플 아이디로 로그인 구현하기

[linux] 설치한 phpseclib을 php코드에서 사용하는 법

[php]public key(PEM)으로 jwt 검증하는 방법

[php]애플 아이디로 로그인 refresh token 구하기?

 

왜 이렇게 애플이 이상하게 구조를 잡아놓은 것인지는 알 수가 없으나 ㅠㅠ.. 개발자는 이를 이용할 수 밖에 없습니다.

 

몇 가지 간단한 용어에 대해.. 간단히 정의하고 이야기를 해보겠습니다.

 

iOS앱: 말 그대로 개발중인 iOS앱입니다.

앱서버: iOS앱에서 동작을 위해 상호작용?하는 서버입니다. iOS앱에서 이 서버로 REST API로 요청을 보내면 이 서버는 동작 수행 후 결과값을 iOS앱으로 보내고.. iOS앱은 이를 받아 처리하여 사용자에게 보여줍니다.

애플서버: 애플에서 관리하는 서버인데 여기서는 애플 아이디로 로그인하기 인증에 관련된 서버를 말합니다.

 

iOS앱과 앱서버는 REST API로 서로 통신을 하는데 앱서버 입장에서는 자기가 전달받은 http request가 valid(타당?)한지 아닌지 검증이 꼭 필요합니다.

만약.. 요청이 왔는데 'itemId(1234) 아이템 삭제'하라는 요청이 왔다면.. 무턱대고 그 동작을 하면 안될 것입니다. 해커가 악용할 수도 있으니 말이죠. 그래서 일반적으로는.. 소셜 로그인의 경우 OAuth2.0?으로 동작을 하고.. 자체적으로 AccessToken을 갱신하며.. 쉽게 이 accessToken을 구할 수 있게 되어있으며 이 accessToken이 유효한지 아닌지도 특정 주소(end point)에 보내서 쉽게 확인이 가능합니다.

 

그런데 애플 아이디로 로그인하기는.. 완전 엉망이네요. 도대체 개발자에게 어떻게 개발하라고.. 만들어놓은 것인지 모르겠습니다. 6월말까지 애플 아이디로 로그인하기를 구현하라고 하면서.. 정작 accessToken은 쓰이지 않고 스스로 갱신되지도 않습니다. 대신 어이없게 refreshToken을 accessToken 대신 써야하는데 하루에 1번 넘게.. 검증을 하지 말라고 합니다.  스스로 갱신되지도 않아서.. 개발자가 스스로 갱신을 해야합니다..

음.. 그런데 생각해보니 그냥 애플서버에서 전달받은 accessToken을 사용해도 될 것 같네요. 왜 외국 사이트에선 refreshToken을 검증용으로 사용하라고 했는지는 의아하지만.. refreshToken은 서버쪽에만 숨겨놓고.. accessToken을 갱신할 때만 사용하는게 더 안전할 것 같습니다.

 

애플 아이디로 로그인하기가 구조도 이상하고 애플의 문서들도 부실하다보니.. 외국 개발자들도 불만이 많더라구요.

저도 불만이 아주 많습니다... ㅜㅜ

어쨋든.. 이 이상한 애플의 구조에 따라 맞춰서 구현을 생각해봐야겠네요.

 

1. iOS앱에서 로그인 성공시 전달받는 identityToken(id token)과 authorizationCode를 앱서버로 보낸다.

2-1. 앱서버에선 identityToken의 유효성을 검증하고 identityToken에 담긴 sub(사용자 아이디)를 사용자의 고유 아이디로 인식하여 정보들을 저장하면 된다.

2-2. identityToken이 유효하면 애플 서버(https://appleid.apple.com/auth/token)에 필요한 정보를 담아 request를 보내 access_token과 refresh_token을 얻는다.

2-3. 이 access_token과 refresh_token은 앱서버의 db에 사용자 아이디와 같은 row에 저장하여 보관하며, iOS앱으로는 access_token과 refresh_token를 모두 보낸다.

access_token을 갱신할 시점을 알기 위해 등록 시간도 함께 저장한다.

appleUserId appleAccessToken appleRefreshToken appleAccessTokenIssueDate (...생략...)
123456789 423424 rgfd343434.35fsd.dfd 2020:04:07 12:45:00  
234567332 234234234 234.4532sdfsdfsd.11sf 2020:04:05 16:15:00  

*서버 db예시

 

3. iOS앱은 앱서버로 요청을 보낼 때 사용자 아이디와 access_token을 함께 보내야한다.

4. 앱서버는 특정 요청을 받을 때 자기가 가지고 있는 db의 사용자 아이디와 access_token이 일치하는 경우에만 정상적인 요청으로 보고 동작을 수행한다.

 

이렇게 하면.. 기본적인 동작이 될 것입니다.

그런데 access_token은 만일의 사태를 대비하여.. 하루에 1번 정도는 갱신되는 것이 좋을 것입니다.

참.. 이것도 개발자가 다 하나하나 신경을 써줘야 한다니.. 어이가 없네요 ㅠㅠ

 

 

앱이 백그라운드에서 포그라운드로 오는 시점(앱이 포그라운드에서 백그라운드로 가는 시점에는 http request가 불가능함!)에 iOS앱은 refresh_token을 담아 서버로 간단한 request를 보냅니다. 그러면 앱 서버는 서버 db에 있는 refresh_token과 전달받은 refresh_token이 일치하는지 확인 후 일치한다면 appleAccessTokenIssueDate와 현재 시간을 비교했을 때 하루 이상이 지났다면 애플 서버를 통해 access_token을 갱신하고 db에 새로운 access_token과 발급 시간을 업데이트 합니다. 그리고 새로 발급받은 access_token을 앱으로 보내 추후 검증에 사용될 수 있도록 합니다.

 

*로그인 후 얻은 authorization_code는 1회용임. 2번째 이용(https://appleid.apple.com/auth/token)부터는 "error":"invalid_grant" 가 발생함

*authorization_code는 로그인할 때마다 값이 바뀜

*authorization_code로 refresh_token과 access_token을 얻을 때마다.. 그 값이 바뀜

*access_token과 refresh_token은 모두 62글자인 것 같음(항상 그런지는 확인 안 됨)

*user_id는 아이폰 설정에서 앱 사용 중지?(특정 앱 회원 탈퇴)를 하고 다시 가입하더라도.. 유지되는 것 같음

*user_id는 44글자인 것 같음(항상 그런지는 확인 안 됨)

 

 

작성자

Posted by 드리머즈

관련 글

댓글 영역