programming/Swift

[Swift/iOS] 애플 로그인 후 반환 값 ASAuthorizationAppleIDCredential From 공식문서

마들브라더 2023. 5. 6. 06:24

애플 로그인(Apple Authentication Services)를 적용시킨 후 반환되는 값에 대해서 살펴보고자 합니다.

유저가 첫 로그인에 성공하면, 가입 후 애플 서버로부터 받은 유저 정보를 서비스하는 서버에 전달해야 합니다.
서비스에서도 일부 정보를 사용하고 저장해야하기 때문입니다.

(애플 서버가입 여부는 아이폰 기준, 설정 - Apple ID - 암호 및 보안 - Apple로 로그인 - Apple ID를 사용하는 앱에서 확인 가능)

 

서버 쪽에서는 이 전달받은 데이터를 다시 검증하는 것으로 알고 있습니다.

authorization.credential as? ASAuthorizationAppleIDCredential

첫 로그인 시 확인할 수 있는 값 중 identityToken과 authorizationCode를 서버로 전달해야 합니다.

 

다른 포스팅을 찾아보았는데 userIdentifier, fullname이나 email 정도만을 언급하고 마무리 짓는 경우가 많았습니다.
공식문서를 확인해서 ASAuthorizationAppleIDCredential 클래스에 있는 값들을 추가로 살펴보겠습니다.

 

func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
        print("fullName, ", appleIDCredential.fullName)
        print("email, ", appleIDCredential.email)
    }
}

애플 로그인에서 로그인이 성공했을 때,

ASAuthorizationControllerDelegate의 didCompleteWithAuthorization 메서드에서 값들을 확인할 수 있습니다.

 

얻을 수 있는 값들을 확인해보겠습니다.

func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {

        print("// Identifying a User")
        print("identityToken, ", appleIDCredential.identityToken)
        print("authorizationCode, ", appleIDCredential.authorizationCode)
        print("state, ", appleIDCredential.state)
        print("user, ", appleIDCredential.user)
        print("")

        print("// Getting Contact Information")
        print("authorizedScopes, ", appleIDCredential.authorizedScopes)
        print("fullName, ", appleIDCredential.fullName)
        print("email, ", appleIDCredential.email)
        print("")

        print("// Detecting User Characteristics")
        print("realUserStatus, ", appleIDCredential.realUserStatus.rawValue)
    }
}

 

애플 로그인 첫 성공 시 반환 값

애플 로그인에 처음 성공한다면 반환 값은 다음과 같습니다.

 

두 번째 이후로 로그인한다면 다음과 같습니다.

 

이제 하나하나 살펴보겠습니다.

 

identityToken

JSON Web Token으로서, 유저에 관한 정보를 안전하게 앱에 전달하기 위한 것.

이게 무슨 말일까싶지만, 간단하게 설명하면 서버에서 유저 정보를 검증할 때 필요한 토큰이라고 볼 수 있습니다.

인증할 때마다 다른 값이 반환됩니다.

authorizationCode

앱이 서버와 상호작용 하는 데 사용되는 토큰.

identityToken과 같이 서버로 보내준 후, 서버는 애플서버로 유효성 검사를 하게 됩니다.

짧은 시간만(short-lived) 유효합니다.

state

credential을 생성하는 요청에 앱이 제공하는 임의의 String 값.

인증 요청 시 생성되는 리퀘스트에 대한 상태정보를 포함하는 문자열이며, 인증 결과를 확인하고 상태 정보를 비교할 수 있습니다.

(근데 nil이 계속 반환되고 있습니다)

user

인증된 유저의 고유한 identifier 값, 변경되지 않습니다.

authorizedScopes

앱이 접근할 수 있는 사용자가 허락한 연락처 정보.
(빈값이 반환되고 있습니다.)

fullName

유저의 이름(Apple ID에서 제공되는, 또는 Sign in with Apple UI에서 유저가 정한).

처음 로그인 시에만 확인할 수 있습니다.

이후에는 빈값이 반환됩니다.

email

유저의 이메일, 처음 로그인할 때 실제 이메일 주소 혹은 애플이 임의로 생성한 가상 이메일 주소.

처음 로그인 시에만 확인할 수 있습니다.

이후에는 nil이 반환됩니다.

realUserStatus

Int값이 반환되는데,

2은 likelyReal 유저가 진짜 사람,

1은 unknown 시스템이 유저가 진짜 사람인지 아닌지 결정하지 못함,

0은 unsupported  사용자의 실재여부를 확인할 수 없음 입니다.

(두 번째에는 1이 반환되었습니다.)

 

이후의 과정

처음 로그인했을 때에만 이름과 이메일이 전달되니 이것을 클라이언트 앱에 저장합니다.

id토큰과 auth코드를 서버로 보낸 후 리턴되는 access토큰과 refresh토큰을 클라이언트 앱에 저장한다.

(이 부분은 서비스마다 다를 수 있습니다. 자세한 부분은 서버 개발자와 이야기 해야합니다.)

user값은 ASAuthorizationAppleIDProvider의 getCredentialState 메서드의 인자로 사용할 수 있으므로, 역시 저장합니다.

앱에서 애플 로그인 상태를 확인할 수 있는 메서드입니다.

예를 들면 사용자가 Apple ID 설정에서 Apple ID 사용 중단을 한다면, 앱에서 새로 로그인할 수 있도록 처리해 주기 위함입니다.

 

참조

https://developer.apple.com/documentation/authenticationservices/asauthorizationappleidcredential

https://labs.brandi.co.kr//2021/04/09/chosh.html

https://hyesunzzang.tistory.com/206