Programming/iOS

[iOS] Apple Login(1) Authenticating Users with Sign in with Apple

devssun 2020. 7. 2. 22:21
728x90
반응형

애플 공식 문서 : https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_rest_api/authenticating_users_with_sign_in_with_apple

Overview

Sign in with Apple 사용자 인증 단계

  1. 앱에서 API로 scope와 함께 로그인을 요청한다.
  2. API는 사용자 정보를 요청한다.
  3. API에서 Apple ID 서버에 사용자 검증을 하고 토큰을 받는다.
  4. Apple ID 서버에서 요청받은 경우 실제 사용자 상태, 이메일을 반환한다.

Authenticate the User and Request Information

Sign in with Apple 을 사용하려면 해당 계정은 이중 인증을 사용해야 한다.

사용자에게 요청할 수 있는 정보는 아래와 같다.

  • 이름 (사용자가 변경 가능, 닉네임처럼 사용하는 개념으로 한 듯 하다.)
  • 이메일 (사용자가 실제 email / private email 중 선택 가능)

아래와 같은 방법으로 로그인을 할 수 있다.

  1. FaceID 혹은 TouchID로 로그인
  2. 1번이 없다면 PassCode로 로그인 (4~6자리의 비밀번호)
  3. 2번도 없다면 Apple ID 비밀번호로 로그인
    • Apple 기기가 아니라면 Apple ID 계정과 이중인증 인증 코드를 사용해서 로그인이 가능하다.

애플은 개인정보 매커니즘을 사용하여 사용자가 실제 사람인지 판단하고 아래와 같은 값을 가진다.

  • 2 (or LikelyReal) : 실제 사람으로 확인되는 상태, 부정행위 인증이나 캡챠를 스킵할 수 있다.
  • 1 (or Unknown) : 실제 사람인지 확인 불가, 상태 판별이 너무 오래 걸리면 이 값이 리턴될 수 있다. 실제 사용자일 수 있으니 서버에서 차단하지 않는 것이 좋다.
  • 0 (or Unsupported) : Real user 상태는 iOS 14 이상, macOS 11 이상, watchOS 7 이상, tvOS 14 이상에서만 사용이 가능하다. 그 이하 버전은 Unsupported 상태가 반환된다.

Retrieve the User’s Information from Apple ID Servers

Apple ID 서버에서는 초기 요청에 따라 자격 증명과 사용자 정보를 반환한다. 사용자 정보는 아래와 같다.
첫번 째 로그인 이후에는 user identity 값만 받게 되므로 다른 정보가 필요하다면 별도로 저장하는 것이 필요하다.

  • user identity : 사용자 식별 번호
  • full name : 사용자 이름
  • verified email address : 인증된 이메일 주소
  • real user status : 실제 사용자 상태 (2/1/0)

사용자 인증이 성공하면 서버는 identity token, authorization code, and user identifier를 반환한다.
그 중 identity token은 JWT(JSON Web Token)이며 아래 claim을 포함한다.
(자세한 설명은 공식 문서 확인)

  • iss : 토큰 발급자로 애플 로그인이기 때문에 https://appleid.apple.com 값을 가진다.
  • sub : 토큰 제목, 사용자를 위한 유일 값을 가진다. user identity가 sub 값으로 존재한다.
  • aud : 토큰 대상자
  • iat : 토큰이 발급된 시간 (UTC)
  • exp : 토큰 만료 시간 (UTC), 토큰을 확인할 때 값이 현재 날짜/시간보다 커야한다.
  • nonce : 클라이언트 세션과 ID 토큰을 연결하는 데 사용되는 문자열 값이다.
  • nonce_supported : 트랜잭션이 지원되지 않는 플랫폼에 있는지 여부를 나타내는 부울 값입니다.
  • email : 사용자 이메일 주소를 나타낸다. 비공개 이메일이면 privaterelay가 붙는다.
  • email_verified : 이메일이 검증되었는지 여부를 나타낸다. Bool 값을 String으로 전달한다.
  • is_private_email : 이메일이 비공개인지 여부를 나타낸다. Bool 값을 String으로 전달한다.
  • real_user_status : 사용자가 실제 사람인지를 포함한 값을 정수 형태로 나타낸다.

identity Code Decoding To JWT

/**
* Sign in with Apple - Identity Code Decoding
*/
// HEADER: ALGORITHM & TOKEN TYPE
{
  "kid": "AAAAAA",
  "alg": "RS256"
}

// PAYLOAD: DATA
{
  "iss": "https://appleid.apple.com",
  "aud": "AppName",
  "exp": 1593404343,
  "iat": 1593403743,
  "sub": "aaaaaa.bbbbbb.cccccc", // -> user identity 값이다.
  "c_hash": "c_hash_value",
  "email": "1234567@privaterelay.appleid.com",
  "email_verified": "true",
  "is_private_email": "true",
  "auth_time": 1593403743,
  "nonce_supported": true
}
반응형