티스토리 뷰

애플 로그인을 구현한 후, 첫 로그인을 하면 애플 서버에는 유저가 해당 앱에 가입한 것처럼 설정되지만

(아이폰 기준, 설정 - 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

 

 

댓글