🥞 BE
home

OAuth2.0 Apple

Date
2024/12/30
Category
Web
Tag
Spring Security
Detail

Apple 소셜 로그인 Flow

1.
사용자가 로그인 요청
사용자가 클라이언트 애플리케이션(웹 또는 모바일)에서 "Sign in with Apple" 버튼을 클릭한다.
클라이언트가 애플 인증 URL로 리디렉션
https://appleid.apple.com/auth/authorize
Plain Text
복사
애플 인증 URL
리디렉션 파라미터 예시
2.
사용자 인증 및 동의
애플은 사용자를 인증하고, 앱이 요청한 권한(예: 이메일, 이름)에 대해 동의를 요청한다.
사용자가 동의하면 애플이 Authorization Code를 생성하여 백엔드의 리디렉션 URL로 전송한다.
3.
서버로 Authorization Code 수신
서버는 리디렉션 URL을 통해 Authorization Code를 받는다.
GET /login/oauth2/code/apple?code=AUTHORIZATION_CODE&state=CSRF_TOKEN
Plain Text
복사
요청 예시
code와 CSRF 방지 token을 받는다.
4.
애플 토큰 엔드포인트에 요청
서버는 Authorization Code를 사용하여 애플의 토큰 엔드포인트로 액세스 토큰과 ID 토큰을 요청.
https://appleid.apple.com/auth/token
Plain Text
복사
토큰 엔드포인트
POST https://appleid.apple.com/auth/token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code& code=AUTHORIZATION_CODE& redirect_uri=YOUR_REDIRECT_URI& client_id=YOUR_CLIENT_ID& client_secret=GENERATED_CLIENT_SECRET
Plain Text
복사
요청 파라미터
5.
애플이 토큰 발급
POST 요청이 유효하다면, 애플이 액세스 토큰과 ID 토큰을 포함한 응답을 반환해준다.
{ "access_token": "ACCESS_TOKEN", "id_token": "ID_TOKEN", "expires_in": 3600, "token_type": "Bearer" }
JSON
복사
Access Token: 애플 리소스에 액세스할 때 사용하는 토큰 (애플에서는 보통 사용되지 않음)
ID Token: JWT 형식으로 사용자 정보를 포함하며, 서명되어 있음
6.
ID 토큰 검증
서버는 받아온 토큰을 검증해야한다.
ID 토큰은 JWT형식으로 서명되어 있다. 애플의 공개 키를 사용해 서명을 검증한다.
클레임 확인
aud: 요청에서 사용한 Client ID와 일치하는지 확인.
iss: "https://appleid.apple.com"인지 확인.
exp: 토큰이 만료되지 않았는지 확인.
{ "iss": "https://appleid.apple.com", "aud": "YOUR_CLIENT_ID", "exp": 1650307200, "iat": 1650303600, "sub": "USER_UNIQUE_ID", "email": "user@example.com", "email_verified": "true" }
JSON
복사
ID 토큰 페이로드 예시
g.
사용자 정보 저장 및 인증 처리
sub(애플 사용자의 고유 ID)를 기반으로 DB에서 사용자를 조회한다.
사용자 등록 여부에 따라 로그인/회원가입 처리
서버측 JWT 발급해주기
h.
클라이언트로 로그인 결과(유저정보, JWT 등) 응답

Apple Developer Program

개발하려는 애플리케이션에 Apple 소셜 로그인을 붙이려면, Apple Developer Program에 가입해야한다.
아래에서 오늘 등록을 누르고 절차를 따라가다 보면 마지막에 결제를 하라고 나오는데, 99$ 이다. 필요하니 결제.
등록 후, 키 발급받고 등록하는 과정은 구글링하면 잘 나와있더라~

ID 토큰 검증

가장 중요한 ID 토큰 검증을 한 번 알아보자.
이제부터는 공식문서의 향연이다. 영어 실력을 검증해볼 수 있는 아주 좋은 기회!!
우선 첫 빠따 등장.
위의 공식 문서에 따르면, 사용자가 로그인을 한 후, ios에서 사용자 응답을 수신한 응답은 다음과 같다.
{ "state": "...", "authorizationCode": "...", "identityToken": "...", "user": { "email": "...", "name": { "firstName": "...", "lastName": "..." } } }
JSON
복사
여기서 user에 대한 데이터는 처음 로그인 할 때만 주기 때문에 저장할 계획이 있다면 처음에 잘 받아서 저장해야 한다. 나는 user와 identity token을 받아 identity token 검증 후 accountId를 추출해 user 정보와 함께 DB에 저장할 것이다.
우선 application.yml 파일을 설정해보자.
YAML
복사