728x90
반응형
Overview
Sign in with Apple
사용자 인증 단계
- 앱에서 API로 scope와 함께 로그인을 요청한다.
- API는 사용자 정보를 요청한다.
- API에서 Apple ID 서버에 사용자 검증을 하고 토큰을 받는다.
- Apple ID 서버에서 요청받은 경우 실제 사용자 상태, 이메일을 반환한다.
Authenticate the User and Request Information
Sign in with Apple
을 사용하려면 해당 계정은 이중 인증을 사용해야 한다.
사용자에게 요청할 수 있는 정보는 아래와 같다.
- 이름 (사용자가 변경 가능, 닉네임처럼 사용하는 개념으로 한 듯 하다.)
- 이메일 (사용자가 실제 email / private email 중 선택 가능)
아래와 같은 방법으로 로그인을 할 수 있다.
- FaceID 혹은 TouchID로 로그인
- 1번이 없다면 PassCode로 로그인 (4~6자리의 비밀번호)
- 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
- https://jwt.io/ 에서 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
}
반응형
'Programming > iOS' 카테고리의 다른 글
[iOS] App Extension Types: Today; Today 위젯 설명 (0) | 2020.07.05 |
---|---|
[iOS] Apple Login(2) Verifying a User (0) | 2020.07.02 |
ReactorKit으로 단방향 반응형 앱 만들기 내용 정리 (0) | 2020.04.26 |
[RxSwift] 4시간 안에 빠르게 익혀 실무에 사용하기 시즌 2- 내용정리! (0) | 2020.04.24 |
[iOS/Swift5] Universal Links 예제 프로젝트 (2) | 2020.04.16 |